From fd1d1b2f0c7ff9c1d50c6a507b2528ad333b07ca Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 18 Jan 2013 10:14:38 +0000 Subject: [PATCH 001/180] Added Cheresharov --- StoyanCheresharov.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 StoyanCheresharov.php diff --git a/StoyanCheresharov.php b/StoyanCheresharov.php new file mode 100644 index 00000000..782a3047 --- /dev/null +++ b/StoyanCheresharov.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World Stoyan Cheresharov! cheresharov@hotmail.com

'; ?> + + \ No newline at end of file From fc638760f939ad2339fa52c072db46c6fa10aaeb Mon Sep 17 00:00:00 2001 From: gzekiii Date: Fri, 18 Jan 2013 14:48:59 +0200 Subject: [PATCH 002/180] add me --- GyunerZeki.php | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 GyunerZeki.php diff --git a/GyunerZeki.php b/GyunerZeki.php new file mode 100644 index 00000000..a19d7246 --- /dev/null +++ b/GyunerZeki.php @@ -0,0 +1,9 @@ + + + PHP Test + + + Hello World Gyuner Zeki!

'; ?> + + + From ea22f2cc7292f23cd2e008b9ac6755dbcb2e78a1 Mon Sep 17 00:00:00 2001 From: "Zdrachnik@abv.bg" Date: Fri, 18 Jan 2013 14:05:11 +0000 Subject: [PATCH 003/180] Commit file with user info --- VictorAtanassov.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 VictorAtanassov.php diff --git a/VictorAtanassov.php b/VictorAtanassov.php new file mode 100644 index 00000000..917318b1 --- /dev/null +++ b/VictorAtanassov.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello from Victor Atanassov

'; ?> + + \ No newline at end of file From 5a80557f585843924c8326e2ffbee8e00003d1c4 Mon Sep 17 00:00:00 2001 From: "matrixatp.martin@gmail.com" Date: Fri, 18 Jan 2013 17:02:30 +0000 Subject: [PATCH 004/180] =?UTF-8?q?=D0=B0=D1=81=D0=B4=D0=B4=D1=84=D0=B4?= =?UTF-8?q?=D1=81=D1=84=D0=B3=D1=81=D0=B4=D1=84=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- martin_manov.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/martin_manov.php b/martin_manov.php index 6af9c355..ae688f8e 100644 --- a/martin_manov.php +++ b/martin_manov.php @@ -3,6 +3,12 @@ PHP Test - Martin Manov - matrixatp.martin@gmail.com

'; ?> + Martin Manov - matrixatp.martin@gmail.com

+ Здравейте, + имах малко проблеми с изпращането до GitHub. + Първо трябваше да отида до Git->Merge. След това Commit продължаваше да не работи, но успешно направих Push. + Дано това да може да помогне на останалите, ако има затруднения. + Поздрави + '; ?> \ No newline at end of file From 505198d7bd886e895ef99971594b54fb64584dd7 Mon Sep 17 00:00:00 2001 From: Zh G Date: Sat, 19 Jan 2013 00:38:44 +0200 Subject: [PATCH 005/180] E-mail added. E-mail added. README renamed to README.md --- .gitattributes | 22 ++++++ .gitignore | 163 ++++++++++++++++++++++++++++++++++++++++++++ README => README.md | 0 ZhelyanGuglev.php | 8 +++ 4 files changed, 193 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore rename README => README.md (100%) create mode 100644 ZhelyanGuglev.php diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..412eeda7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..5ebd21a1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,163 @@ +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.vspscc +.builds +*.dotCover + +## TODO: If you have NuGet Package Restore enabled, uncomment this +#packages/ + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf + +# Visual Studio profiler +*.psess +*.vsp + +# ReSharper is a .NET coding add-in +_ReSharper* + +# Installshield output folder +[Ee]xpress + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish + +# Others +[Bb]in +[Oo]bj +sql +TestResults +*.Cache +ClientBin +stylecop.* +~$* +*.dbmdl +Generated_Code #added for RIA/Silverlight projects + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML + + + +############ +## Windows +############ + +# Windows image file caches +Thumbs.db + +# Folder config file +Desktop.ini + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist +build +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg + +# Mac crap +.DS_Store diff --git a/README b/README.md similarity index 100% rename from README rename to README.md diff --git a/ZhelyanGuglev.php b/ZhelyanGuglev.php new file mode 100644 index 00000000..2f73bf32 --- /dev/null +++ b/ZhelyanGuglev.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Zhelyan Guglev!!! E-mail: jelian_g@mail.bg

'; ?> + + From 190489ca7b75d97a4fc1d24382c7e074dd62dd33 Mon Sep 17 00:00:00 2001 From: "todorvelichkov89@gmail.com" Date: Sat, 19 Jan 2013 15:25:05 +0000 Subject: [PATCH 006/180] test commint --- index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.php b/index.php index d5a9ce2b..22b83332 100644 --- a/index.php +++ b/index.php @@ -3,6 +3,6 @@ Hello World - Hello World

'; ?> + Hello World from index

'; ?> From 52c246106b14143c06ceeb0cd9ece95a85bfb45b Mon Sep 17 00:00:00 2001 From: "todorvelichkov89@gmail.com" Date: Sat, 19 Jan 2013 15:34:10 +0000 Subject: [PATCH 007/180] todor.php commiting --- Todor.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 Todor.php diff --git a/Todor.php b/Todor.php new file mode 100644 index 00000000..370c2ba9 --- /dev/null +++ b/Todor.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello from Todor

'; ?> + + \ No newline at end of file From 86277819e6c9e59e8cd42fbce31badcef1214ed8 Mon Sep 17 00:00:00 2001 From: "todorvelichkov89@gmail.com" Date: Sat, 19 Jan 2013 15:37:44 +0000 Subject: [PATCH 008/180] =?UTF-8?q?=D1=8A=D0=B1=D0=B4=D0=B5=D0=B9=D1=82=20?= =?UTF-8?q?=D0=BD=D0=B0=20todor.php?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Todor.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Todor.php b/Todor.php index 370c2ba9..10333db1 100644 --- a/Todor.php +++ b/Todor.php @@ -4,5 +4,7 @@ Hello from Todor

'; ?> + Този проект може да бъде разгледан на адрес: fmi-project-todor.eu01.aws.af.cm + Публично резозитори(форк): git@github.com:asdator/fmi.git \ No newline at end of file From 02d2c305a271a3487318040070d7e22ac91f207d Mon Sep 17 00:00:00 2001 From: "margi_hk@yahoo.co.uk" Date: Sat, 19 Jan 2013 18:24:48 +0000 Subject: [PATCH 009/180] magi greeting --- MargaritaKrushkova.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 MargaritaKrushkova.php diff --git a/MargaritaKrushkova.php b/MargaritaKrushkova.php new file mode 100644 index 00000000..94a256c6 --- /dev/null +++ b/MargaritaKrushkova.php @@ -0,0 +1,8 @@ + + + PHP Test + + + I am Margarita Krushkova

'; ?> + + \ No newline at end of file From 0efe68305d179dd49e6e150624da6578a9e671e8 Mon Sep 17 00:00:00 2001 From: Zh G Date: Sun, 20 Jan 2013 19:15:04 +0200 Subject: [PATCH 010/180] Revert "E-mail added." This reverts commit 50d18ad54905019c5ec351ed7a162bc25f96aadc. --- .gitattributes | 22 ------ .gitignore | 163 -------------------------------------------- README.md => README | 0 ZhelyanGuglev.php | 8 --- 4 files changed, 193 deletions(-) delete mode 100644 .gitattributes delete mode 100644 .gitignore rename README.md => README (100%) delete mode 100644 ZhelyanGuglev.php diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 412eeda7..00000000 --- a/.gitattributes +++ /dev/null @@ -1,22 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto - -# Custom for Visual Studio -*.cs diff=csharp -*.sln merge=union -*.csproj merge=union -*.vbproj merge=union -*.fsproj merge=union -*.dbproj merge=union - -# Standard to msysgit -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 5ebd21a1..00000000 --- a/.gitignore +++ /dev/null @@ -1,163 +0,0 @@ -################# -## Eclipse -################# - -*.pydevproject -.project -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.classpath -.settings/ -.loadpath - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - - -################# -## Visual Studio -################# - -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# User-specific files -*.suo -*.user -*.sln.docstates - -# Build results -[Dd]ebug/ -[Rr]elease/ -*_i.c -*_p.c -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.vspscc -.builds -*.dotCover - -## TODO: If you have NuGet Package Restore enabled, uncomment this -#packages/ - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opensdf -*.sdf - -# Visual Studio profiler -*.psess -*.vsp - -# ReSharper is a .NET coding add-in -_ReSharper* - -# Installshield output folder -[Ee]xpress - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish - -# Others -[Bb]in -[Oo]bj -sql -TestResults -*.Cache -ClientBin -stylecop.* -~$* -*.dbmdl -Generated_Code #added for RIA/Silverlight projects - -# Backup & report files from converting an old project file to a newer -# Visual Studio version. Backup files are not needed, because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML - - - -############ -## Windows -############ - -# Windows image file caches -Thumbs.db - -# Folder config file -Desktop.ini - - -############# -## Python -############# - -*.py[co] - -# Packages -*.egg -*.egg-info -dist -build -eggs -parts -bin -var -sdist -develop-eggs -.installed.cfg - -# Installer logs -pip-log.txt - -# Unit test / coverage reports -.coverage -.tox - -#Translations -*.mo - -#Mr Developer -.mr.developer.cfg - -# Mac crap -.DS_Store diff --git a/README.md b/README similarity index 100% rename from README.md rename to README diff --git a/ZhelyanGuglev.php b/ZhelyanGuglev.php deleted file mode 100644 index 2f73bf32..00000000 --- a/ZhelyanGuglev.php +++ /dev/null @@ -1,8 +0,0 @@ - - - PHP Test - - - Hello World from Zhelyan Guglev!!! E-mail: jelian_g@mail.bg

'; ?> - - From 9f3a286772f7df4c99d954f2b25b453cbba8e3c0 Mon Sep 17 00:00:00 2001 From: Zh G Date: Sun, 20 Jan 2013 19:20:07 +0200 Subject: [PATCH 011/180] Another contributor e-mail added. Also some file structure changes made: README renamed to README.md added .gitattributes added .gitignore --- .gitattributes | 22 ++++++ .gitignore | 163 ++++++++++++++++++++++++++++++++++++++++++++ README => README.md | 0 ZhelyanGuglev.php | 8 +++ 4 files changed, 193 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore rename README => README.md (100%) create mode 100644 ZhelyanGuglev.php diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..412eeda7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..5ebd21a1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,163 @@ +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.vspscc +.builds +*.dotCover + +## TODO: If you have NuGet Package Restore enabled, uncomment this +#packages/ + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf + +# Visual Studio profiler +*.psess +*.vsp + +# ReSharper is a .NET coding add-in +_ReSharper* + +# Installshield output folder +[Ee]xpress + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish + +# Others +[Bb]in +[Oo]bj +sql +TestResults +*.Cache +ClientBin +stylecop.* +~$* +*.dbmdl +Generated_Code #added for RIA/Silverlight projects + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML + + + +############ +## Windows +############ + +# Windows image file caches +Thumbs.db + +# Folder config file +Desktop.ini + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist +build +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg + +# Mac crap +.DS_Store diff --git a/README b/README.md similarity index 100% rename from README rename to README.md diff --git a/ZhelyanGuglev.php b/ZhelyanGuglev.php new file mode 100644 index 00000000..2f73bf32 --- /dev/null +++ b/ZhelyanGuglev.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Zhelyan Guglev!!! E-mail: jelian_g@mail.bg

'; ?> + + From e5ea6be857607d7cab057000675b695e33bbdd18 Mon Sep 17 00:00:00 2001 From: Mihail Kopusciu Date: Tue, 22 Jan 2013 02:23:30 -0800 Subject: [PATCH 012/180] Create index1.php --- index1.php | 1 + 1 file changed, 1 insertion(+) create mode 100644 index1.php diff --git a/index1.php b/index1.php new file mode 100644 index 00000000..29dbc016 --- /dev/null +++ b/index1.php @@ -0,0 +1 @@ +gdfgdfgfd From 2e04a61d58baf004431f3e8081dbd0556e1e5558 Mon Sep 17 00:00:00 2001 From: "meshko1989@mail.ru" Date: Tue, 22 Jan 2013 11:00:40 +0000 Subject: [PATCH 013/180] my first commit --- MihailKopuschu.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 MihailKopuschu.php diff --git a/MihailKopuschu.php b/MihailKopuschu.php new file mode 100644 index 00000000..435a694d --- /dev/null +++ b/MihailKopuschu.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> + + \ No newline at end of file From 14da9b1b8de9430e4e654377004f295ba783bb03 Mon Sep 17 00:00:00 2001 From: "meshko1989@mail.ru" Date: Tue, 22 Jan 2013 11:06:09 +0000 Subject: [PATCH 014/180] my first commit --- index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.php b/index.php index d5a9ce2b..9d52bad3 100644 --- a/index.php +++ b/index.php @@ -3,6 +3,6 @@ Hello World - Hello World

'; ?> + Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> From 3686d7cbf18c9728395ffd9043a1a3de63a78a60 Mon Sep 17 00:00:00 2001 From: "petyaSt92@gmail.bg" Date: Thu, 24 Jan 2013 08:13:59 +0000 Subject: [PATCH 015/180] Added by Petya Stavarova --- PetyaStavarova.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 PetyaStavarova.php diff --git a/PetyaStavarova.php b/PetyaStavarova.php new file mode 100644 index 00000000..616b2a20 --- /dev/null +++ b/PetyaStavarova.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World Petya Stavarova, petyast92@gmail.com

'; ?> + + \ No newline at end of file From 0a9c16b9900e24e31ea59f635c8fa8b3046286bf Mon Sep 17 00:00:00 2001 From: "petyaSt92@gmail.bg" Date: Thu, 24 Jan 2013 08:24:20 +0000 Subject: [PATCH 016/180] Add the file PetyaStavarova.php --- PetyaStavarova.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PetyaStavarova.php b/PetyaStavarova.php index 616b2a20..1e74060a 100644 --- a/PetyaStavarova.php +++ b/PetyaStavarova.php @@ -3,6 +3,6 @@ PHP Test - Hello World Petya Stavarova, petyast92@gmail.com

'; ?> + Hello World from Petya Stavarova, petyast92@gmail.com

'; ?> \ No newline at end of file From 30ac5b53d00f665b7febedbbba900d1cc17a7f00 Mon Sep 17 00:00:00 2001 From: "vasil.georgiev.34@gmail.com" Date: Thu, 24 Jan 2013 19:12:13 +0000 Subject: [PATCH 017/180] ADD the file VasilVasilev.php --- VasilVasilev.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 VasilVasilev.php diff --git a/VasilVasilev.php b/VasilVasilev.php new file mode 100644 index 00000000..0723efb0 --- /dev/null +++ b/VasilVasilev.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Vasil Vasilev vasil.georgiev.34@gmail.com

'; ?> + + \ No newline at end of file From 6b24b8f2edc04fb0d8d3d5e7393f67f19e08f74b Mon Sep 17 00:00:00 2001 From: "paolaaa7@abv.bg" Date: Thu, 24 Jan 2013 19:37:34 +0000 Subject: [PATCH 018/180] Add the file paolashumanova.php --- paolashumanova.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 paolashumanova.php diff --git a/paolashumanova.php b/paolashumanova.php new file mode 100644 index 00000000..60b55c81 --- /dev/null +++ b/paolashumanova.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Paola Shumanova email: paolaaa7@abv.bg

'; ?> + + \ No newline at end of file From de407a5d3238e6ec6ee3e5b6ad9b31d8369535d2 Mon Sep 17 00:00:00 2001 From: "kraseza@gmail.com" Date: Fri, 25 Jan 2013 00:10:29 +0000 Subject: [PATCH 019/180] KrasimirTsvetanov.php file added --- KrasimirTsvetanov.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 KrasimirTsvetanov.php diff --git a/KrasimirTsvetanov.php b/KrasimirTsvetanov.php new file mode 100644 index 00000000..32b6fbbb --- /dev/null +++ b/KrasimirTsvetanov.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Krasimir Tsvetanov! kraseza@gmail.com

'; ?> + + \ No newline at end of file From a06ccd67a098da430db2836e6b5f29b1a77c0453 Mon Sep 17 00:00:00 2001 From: "ivetopz6@gmail.com" Date: Fri, 25 Jan 2013 09:13:09 +0000 Subject: [PATCH 020/180] 11 --- ivelina.php | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 ivelina.php diff --git a/ivelina.php b/ivelina.php new file mode 100644 index 00000000..2f0700d0 --- /dev/null +++ b/ivelina.php @@ -0,0 +1,10 @@ + + + PHP Test + + + + + + + \ No newline at end of file From e4bbd22adb8778789e46e3dc3a0816cf18e145a5 Mon Sep 17 00:00:00 2001 From: "elenachavdarova91@gmail.com" Date: Fri, 25 Jan 2013 09:45:27 +0000 Subject: [PATCH 021/180] first --- ElenaChavdarova.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 ElenaChavdarova.php diff --git a/ElenaChavdarova.php b/ElenaChavdarova.php new file mode 100644 index 00000000..b5c29527 --- /dev/null +++ b/ElenaChavdarova.php @@ -0,0 +1,8 @@ + + + Hello, World + + + Hello World from Elena Chavdarova email: elenachavdarova91@gmail.com

'; ?> + + \ No newline at end of file From 300c64af727894c1878009f95f22e44f13cc0f64 Mon Sep 17 00:00:00 2001 From: "elenachavdarova91@gmail.com" Date: Fri, 25 Jan 2013 09:49:32 +0000 Subject: [PATCH 022/180] second --- .gitattributes | 22 ++++++ .gitignore | 163 +++++++++++++++++++++++++++++++++++++++++ GyunerZeki.php | 9 +++ KrasimirTsvetanov.php | 8 ++ MargaritaKrushkova.php | 8 ++ MihailKopuschu.php | 8 ++ PetyaStavarova.php | 8 ++ README.md | 1 + StoyanCheresharov.php | 8 ++ Todor.php | 10 +++ VasilVasilev.php | 8 ++ VictorAtanassov.php | 8 ++ ZhelyanGuglev.php | 8 ++ index.php | 7 ++ index1.php | 1 + martin_manov.php | 14 ++++ paolashumanova.php | 8 ++ 17 files changed, 299 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 GyunerZeki.php create mode 100644 KrasimirTsvetanov.php create mode 100644 MargaritaKrushkova.php create mode 100644 MihailKopuschu.php create mode 100644 PetyaStavarova.php create mode 100644 README.md create mode 100644 StoyanCheresharov.php create mode 100644 Todor.php create mode 100644 VasilVasilev.php create mode 100644 VictorAtanassov.php create mode 100644 ZhelyanGuglev.php create mode 100644 index1.php create mode 100644 martin_manov.php create mode 100644 paolashumanova.php diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..412eeda7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..5ebd21a1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,163 @@ +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.vspscc +.builds +*.dotCover + +## TODO: If you have NuGet Package Restore enabled, uncomment this +#packages/ + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf + +# Visual Studio profiler +*.psess +*.vsp + +# ReSharper is a .NET coding add-in +_ReSharper* + +# Installshield output folder +[Ee]xpress + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish + +# Others +[Bb]in +[Oo]bj +sql +TestResults +*.Cache +ClientBin +stylecop.* +~$* +*.dbmdl +Generated_Code #added for RIA/Silverlight projects + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML + + + +############ +## Windows +############ + +# Windows image file caches +Thumbs.db + +# Folder config file +Desktop.ini + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist +build +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg + +# Mac crap +.DS_Store diff --git a/GyunerZeki.php b/GyunerZeki.php new file mode 100644 index 00000000..a19d7246 --- /dev/null +++ b/GyunerZeki.php @@ -0,0 +1,9 @@ + + + PHP Test + + + Hello World Gyuner Zeki!

'; ?> + + + diff --git a/KrasimirTsvetanov.php b/KrasimirTsvetanov.php new file mode 100644 index 00000000..32b6fbbb --- /dev/null +++ b/KrasimirTsvetanov.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Krasimir Tsvetanov! kraseza@gmail.com

'; ?> + + \ No newline at end of file diff --git a/MargaritaKrushkova.php b/MargaritaKrushkova.php new file mode 100644 index 00000000..94a256c6 --- /dev/null +++ b/MargaritaKrushkova.php @@ -0,0 +1,8 @@ + + + PHP Test + + + I am Margarita Krushkova

'; ?> + + \ No newline at end of file diff --git a/MihailKopuschu.php b/MihailKopuschu.php new file mode 100644 index 00000000..435a694d --- /dev/null +++ b/MihailKopuschu.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> + + \ No newline at end of file diff --git a/PetyaStavarova.php b/PetyaStavarova.php new file mode 100644 index 00000000..1e74060a --- /dev/null +++ b/PetyaStavarova.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Petya Stavarova, petyast92@gmail.com

'; ?> + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..de855a2f --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +This is a sample PHP project diff --git a/StoyanCheresharov.php b/StoyanCheresharov.php new file mode 100644 index 00000000..782a3047 --- /dev/null +++ b/StoyanCheresharov.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World Stoyan Cheresharov! cheresharov@hotmail.com

'; ?> + + \ No newline at end of file diff --git a/Todor.php b/Todor.php new file mode 100644 index 00000000..10333db1 --- /dev/null +++ b/Todor.php @@ -0,0 +1,10 @@ + + + PHP Test + + + Hello from Todor

'; ?> + Този проект може да бъде разгледан на адрес: fmi-project-todor.eu01.aws.af.cm + Публично резозитори(форк): git@github.com:asdator/fmi.git + + \ No newline at end of file diff --git a/VasilVasilev.php b/VasilVasilev.php new file mode 100644 index 00000000..0723efb0 --- /dev/null +++ b/VasilVasilev.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Vasil Vasilev vasil.georgiev.34@gmail.com

'; ?> + + \ No newline at end of file diff --git a/VictorAtanassov.php b/VictorAtanassov.php new file mode 100644 index 00000000..917318b1 --- /dev/null +++ b/VictorAtanassov.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello from Victor Atanassov

'; ?> + + \ No newline at end of file diff --git a/ZhelyanGuglev.php b/ZhelyanGuglev.php new file mode 100644 index 00000000..2f73bf32 --- /dev/null +++ b/ZhelyanGuglev.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Zhelyan Guglev!!! E-mail: jelian_g@mail.bg

'; ?> + + diff --git a/index.php b/index.php index d5a9ce2b..94693ab9 100644 --- a/index.php +++ b/index.php @@ -3,6 +3,13 @@ Hello World +<<<<<<< HEAD Hello World

'; ?> +======= + Hello World from FMI

'; ?> + Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> + Hello World, Aleksander Aleksandrov


email:aleksaander_aleksandrov@abv.bg'; ?> + +>>>>>>> refs/heads/master diff --git a/index1.php b/index1.php new file mode 100644 index 00000000..29dbc016 --- /dev/null +++ b/index1.php @@ -0,0 +1 @@ +gdfgdfgfd diff --git a/martin_manov.php b/martin_manov.php new file mode 100644 index 00000000..ae688f8e --- /dev/null +++ b/martin_manov.php @@ -0,0 +1,14 @@ + + + PHP Test + + + Martin Manov - matrixatp.martin@gmail.com

+ Здравейте, + имах малко проблеми с изпращането до GitHub. + Първо трябваше да отида до Git->Merge. След това Commit продължаваше да не работи, но успешно направих Push. + Дано това да може да помогне на останалите, ако има затруднения. + Поздрави + '; ?> + + \ No newline at end of file diff --git a/paolashumanova.php b/paolashumanova.php new file mode 100644 index 00000000..60b55c81 --- /dev/null +++ b/paolashumanova.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Paola Shumanova email: paolaaa7@abv.bg

'; ?> + + \ No newline at end of file From e78f86130c0dfe483c127466fdc756e035e090dd Mon Sep 17 00:00:00 2001 From: "elenachavdarova91@gmail.com" Date: Fri, 25 Jan 2013 09:53:42 +0000 Subject: [PATCH 023/180] second --- index.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/index.php b/index.php index 94693ab9..8168c18e 100644 --- a/index.php +++ b/index.php @@ -3,13 +3,21 @@ Hello World +<<<<<<< HEAD <<<<<<< HEAD Hello World

'; ?> ======= Hello World from FMI

'; ?> Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> Hello World, Aleksander Aleksandrov


email:aleksaander_aleksandrov@abv.bg'; ?> - + Hello World, Elena Chavdarova


email:elenachavdarova91@gmail.com'; ?> + >>>>>>> refs/heads/master +======= + Hello World from FMI

'; ?> + Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> + Hello World, Aleksander Aleksandrov


email:aleksaander_aleksandrov@abv.bg'; ?> + +>>>>>>> refs/remotes/git hub remote/master From afe70dddd48994d76748739afabf2695bd62694c Mon Sep 17 00:00:00 2001 From: "elenachavdarova91@gmail.com" Date: Fri, 25 Jan 2013 09:55:52 +0000 Subject: [PATCH 024/180] fdhy --- index.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/index.php b/index.php index 8168c18e..9d12388c 100644 --- a/index.php +++ b/index.php @@ -4,6 +4,7 @@ <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD Hello World

'; ?> ======= @@ -19,5 +20,11 @@ Hello World, Aleksander Aleksandrov


email:aleksaander_aleksandrov@abv.bg'; ?> >>>>>>> refs/remotes/git hub remote/master +======= + Hello World from FMI

'; ?> + Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> + Hello World, Aleksander Aleksandrov


email:aleksaander_aleksandrov@abv.bg'; ?> + +>>>>>>> refs/heads/master From 787083ab6f4f25e6b8fa0c2f36368df89e7d79a9 Mon Sep 17 00:00:00 2001 From: "aleksaander_aleksandrov@abv.bg" Date: Fri, 25 Jan 2013 10:36:46 +0000 Subject: [PATCH 025/180] first --- AleksanderAleksandrov.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 AleksanderAleksandrov.php diff --git a/AleksanderAleksandrov.php b/AleksanderAleksandrov.php new file mode 100644 index 00000000..c17817de --- /dev/null +++ b/AleksanderAleksandrov.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Aleksander Aleksandrov, emai: aleksaander_aleksandrov@abv.bg

'; ?> + + \ No newline at end of file From e10c29bc74cf567fb5124ea59b187233eb79a137 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 25 Jan 2013 13:03:12 +0000 Subject: [PATCH 026/180] Adding index.html and the CSS --- index.html | 67 ++++++++++++++++++++++ layout.css | 77 ++++++++++++++++++++++++++ navcontainer.css | 122 +++++++++++++++++++++++++++++++++++++++++ standard_structure.css | 7 +++ standard_structure.js | 3 + typography.css | 8 +++ 6 files changed, 284 insertions(+) create mode 100644 index.html create mode 100644 layout.css create mode 100644 navcontainer.css create mode 100644 standard_structure.css create mode 100644 standard_structure.js create mode 100644 typography.css diff --git a/index.html b/index.html new file mode 100644 index 00000000..581e9b10 --- /dev/null +++ b/index.html @@ -0,0 +1,67 @@ + + + + FMI + + + +
+
+ +
+
+
+

Content

+
+
+ +
+
+
+

Advertisements

+
+
+ +
+
+ + + \ No newline at end of file diff --git a/layout.css b/layout.css new file mode 100644 index 00000000..be424f98 --- /dev/null +++ b/layout.css @@ -0,0 +1,77 @@ +@CHARSET "UTF-8"; + +body, html{ + margin: 0; + padding: 0; +} + +body { + text-align: center; + background: yellow; +} + +#wrap { + width: 960px; /* 80%;*/ + margin: auto; + text-align: left; +} + +#header { + position: relative; + top: 0; + left: 0; + width:100%; + height: 100px; + background: green; +} + +#footer { + clear: both; + width:100%; + height: 60px; + background: cyan; +} + +#mainBody { + float: left; + width: 80%; + background: red; +} + +#content { + float: right; + width: 80%; + min-height: 300px; + background: brown; +} + +#navSide { + float: left; + width: 20%; + /* display: none; */ +} + +#add { + float: right; + width: 20%; + /* display: none; */ + background: blue; +} + +#wrapInner { + width: 100%; + margin: auto; +} + +#navTop { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + /* height: 30px; */ + text-align: center; +} + +.inside { + padding: 5px; +} \ No newline at end of file diff --git a/navcontainer.css b/navcontainer.css new file mode 100644 index 00000000..59c4e4fd --- /dev/null +++ b/navcontainer.css @@ -0,0 +1,122 @@ +/*In order to make it work in IE we need to load also */ +/* */ +#navcontainer { +/* background:url(../images/menu_bg.jpg); */ +} + +#navcontainer ul { + padding: 0; + margin: 0; + list-style: none; + overflow: visible; + z-index: 5; +} + +#navcontainer a { + display:block; +/* color:#000000; */ + text-align:center; + text-decoration: none; + font-size: 10pt; /*12px = 9pt*/ + width: 90px; + height: 51px; + padding-top:20px; + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; +/* background: yellow; */ +} + +#navcontainer a:visited { +/* color:#000000; */ +} + +#navcontainer a:hover { +/* background:green url(../images/menu-bg-hvr.gif) no-repeat scroll 0 0; */ +/* background: transparent url("../images/nav_center_hover.png") repeat-x scroll 0 0; */ + background: white url("../images/nav_center_hover.png") repeat-x scroll 0 0; + color:#954a04; +} + +/* Active Menus */ +ul li.active a{ +/* color:#000; */ +} + +ul li.active a:visited { +/* color:#000; */ +} + +ul li.active a:hover { +/* color:#000; */ +} + +/*If we need different settings for the pop-up menus*/ +#navcontainer li ul a { + display:block; +/* color:#000000; */ + text-align:center; + text-decoration: none; + font-size: 10pt; + width: 120px; /* auto; */ + height: 30px; /* auto; */ + padding-top:15px; + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; +/* border-top: 1px solid #aaaaaa; */ + border-bottom: 1px solid #aaaaaa; + background: #eeeeee; /* Here you change the background color of the popup menu*/ +} + +#navcontainer li ul a:visited { +/* color:#000000; */ +} + +#navcontainer li ul a:hover { + background:#aaaaaa; /* url(../images/menu-bg-hvr.gif); */ + color:#954a04; +} +/* End of popup menu*/ + +/* this makes the menu to become horizontal */ +#navcontainer li { + float: left; + width: 95px; +} + +/* for the next level we move it to the right "indent" Controls how far right are the next menus +Bigger number more right +the longest situation was margin: -1em 0 0 8em; - it was working for ALL LEVELS PERFECT +-2.2em 0 0 8em; the first number controls the vertila position bigger negative numbers higher will be the next level +*/ +#navcontainer li ul { /* the first number moves the second level up verticaly and down, thest number moves left right horizontaly*/ + margin: -0.8em 0 0 0; + } +#navcontainer li ul ul { + margin: -2.5em 0 0 8.5em; + } +#navcontainer li ul ul ul{ + margin: -2.5em 0 0 8.5em; + } + #navcontainer li ul ul ul ul{ + margin: -2.5em 0 0 8.5em; + } + #navcontainer li ul ul ul ul ul{ + margin: -2.5em 0 0 8.5em; + } + +/* We starting to hide them now this moves the lists very far left*/ + #navcontainer li ul { + position: absolute; + width: 10em; + left: -999em; +} + +#navcontainer li:hover ul ul, #navcontainer li:hover ul ul ul, #navcontainer li:hover ul ul ul ul, #navcontainer li.sfhover ul ul, #navcontainer li.sfhover ul ul ul, #navcontainer li.sfhover ul ul ul ul { + left: -999em; +} + +/* this brings the list back Can be done only with one expression + this and the javascript is for IE The java script attaches class sfhover to li*/ +#navcontainer li:hover ul, #navcontainer li li:hover ul, #navcontainer li li li:hover ul, #navcontainer li li li li:hover ul, #navcontainer li.sfhover ul, #navcontainer li li.sfhover ul, #navcontainer li li li.sfhover ul, #navcontainer li li li li.sfhover ul { + left: auto; + z-index: 1000; +} + diff --git a/standard_structure.css b/standard_structure.css new file mode 100644 index 00000000..9f6d8cb1 --- /dev/null +++ b/standard_structure.css @@ -0,0 +1,7 @@ +@import url("layout.css"); +@import url("navcontainer.css"); +@import url("typography.css"); +/* +@import url("custom.css"); +@import url("tables.css"); +*/ \ No newline at end of file diff --git a/standard_structure.js b/standard_structure.js new file mode 100644 index 00000000..3c8dbdac --- /dev/null +++ b/standard_structure.js @@ -0,0 +1,3 @@ +window.onload = function(e) { + alert('Hello World!'); +} \ No newline at end of file diff --git a/typography.css b/typography.css new file mode 100644 index 00000000..aa6f9df5 --- /dev/null +++ b/typography.css @@ -0,0 +1,8 @@ +@font-face { + font-family: "Trebuchet MS"; + src: url("../fonts/trebuc.ttf"); +} + +body { + font: normal normal normal 9pt/105% "Trebuchet MS", Arial, Helvetica, sans-serif; /*"Trebuchet MS",*/ +} From e30aa250b6ea1736596cd79a55c40b79317691a5 Mon Sep 17 00:00:00 2001 From: "wanya.dimitrowa@gmail.com" Date: Fri, 25 Jan 2013 13:49:12 +0000 Subject: [PATCH 027/180] Add the file VanyaDimitrova.php --- VanyaDimitrova.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 VanyaDimitrova.php diff --git a/VanyaDimitrova.php b/VanyaDimitrova.php new file mode 100644 index 00000000..92863aa5 --- /dev/null +++ b/VanyaDimitrova.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Vanya Dimitrova! wanya.dimitrowa@gmail.com

'; ?> + + \ No newline at end of file From a9904f120fc5750e1bf5b312cf74bb9c1d0e5a73 Mon Sep 17 00:00:00 2001 From: "npoibrenska91@gmail.com" Date: Fri, 25 Jan 2013 13:52:58 +0000 Subject: [PATCH 028/180] My commit --- Nikoleta HW.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 Nikoleta HW.php diff --git a/Nikoleta HW.php b/Nikoleta HW.php new file mode 100644 index 00000000..b904ebdd --- /dev/null +++ b/Nikoleta HW.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello! Nikoleta Poibrenska email: nikoleta.poibrenska@abv.bg

'; ?> + + \ No newline at end of file From dfa41bba832be956852aa08fe525bd8970947702 Mon Sep 17 00:00:00 2001 From: cl-server Date: Fri, 25 Jan 2013 15:11:02 +0000 Subject: [PATCH 029/180] init --- .htaccess | 4 ++++ README | 1 + index.php | 8 ++++++++ 3 files changed, 13 insertions(+) create mode 100644 .htaccess create mode 100644 README create mode 100644 index.php diff --git a/.htaccess b/.htaccess new file mode 100644 index 00000000..912ca125 --- /dev/null +++ b/.htaccess @@ -0,0 +1,4 @@ + + Order allow,deny + Deny from all + diff --git a/README b/README new file mode 100644 index 00000000..de855a2f --- /dev/null +++ b/README @@ -0,0 +1 @@ +This is a sample PHP project diff --git a/index.php b/index.php new file mode 100644 index 00000000..d5a9ce2b --- /dev/null +++ b/index.php @@ -0,0 +1,8 @@ + + + Hello World + + + Hello World

'; ?> + + From eb4783b5fe1ad1d29ca32b7090076a4623b4ea2c Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" Date: Sat, 26 Jan 2013 14:37:23 +0000 Subject: [PATCH 030/180] I added a new file to the project --- StudentContributor.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 StudentContributor.php diff --git a/StudentContributor.php b/StudentContributor.php new file mode 100644 index 00000000..ad0ed7bf --- /dev/null +++ b/StudentContributor.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Stoyan Cheresharov

'; ?> + + \ No newline at end of file From 5bad0167443ea3ec2605e2e1efd39cbd11efcafc Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" Date: Sat, 26 Jan 2013 15:02:55 +0000 Subject: [PATCH 031/180] I changed Student Contributor --- StudentContributor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StudentContributor.php b/StudentContributor.php index ad0ed7bf..2e25c8db 100644 --- a/StudentContributor.php +++ b/StudentContributor.php @@ -3,6 +3,6 @@ PHP Test - Hello World from Stoyan Cheresharov

'; ?> + Hello World from Stoyan Cheresharov. change

'; ?> \ No newline at end of file From b6720e5ce8491ac61331d7802c74ae24ae9c645c Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" Date: Sat, 26 Jan 2013 15:15:36 +0000 Subject: [PATCH 032/180] again --- StudentContributor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StudentContributor.php b/StudentContributor.php index 2e25c8db..e3de1596 100644 --- a/StudentContributor.php +++ b/StudentContributor.php @@ -3,6 +3,6 @@ PHP Test - Hello World from Stoyan Cheresharov. change

'; ?> + Hello World from Stoyan Cheresharov. change. Other change

'; ?> \ No newline at end of file From f7c75d85f86578c65e0b9c67880de17ed97c5f87 Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" Date: Mon, 28 Jan 2013 17:25:27 +0000 Subject: [PATCH 033/180] My first commit --- .gitattributes | 22 ++++++ .gitignore | 163 +++++++++++++++++++++++++++++++++++++++++ GyunerZeki.php | 9 +++ KrasimirTsvetanov.php | 8 ++ MargaritaKrushkova.php | 8 ++ MihailKopuschu.php | 8 ++ PetyaStavarova.php | 8 ++ README.md | 1 + StoyanCheresharov.php | 8 ++ StudentContributor.php | 8 ++ Todor.php | 10 +++ VasilVasilev.php | 8 ++ VictorAtanassov.php | 8 ++ ZhelyanGuglev.php | 8 ++ index.html | 67 +++++++++++++++++ index.php | 11 +++ index1.php | 1 + layout.css | 77 +++++++++++++++++++ martin_manov.php | 14 ++++ navcontainer.css | 122 ++++++++++++++++++++++++++++++ paolashumanova.php | 8 ++ standard_structure.css | 7 ++ standard_structure.js | 3 + typography.css | 8 ++ 24 files changed, 595 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 GyunerZeki.php create mode 100644 KrasimirTsvetanov.php create mode 100644 MargaritaKrushkova.php create mode 100644 MihailKopuschu.php create mode 100644 PetyaStavarova.php create mode 100644 README.md create mode 100644 StoyanCheresharov.php create mode 100644 StudentContributor.php create mode 100644 Todor.php create mode 100644 VasilVasilev.php create mode 100644 VictorAtanassov.php create mode 100644 ZhelyanGuglev.php create mode 100644 index.html create mode 100644 index.php create mode 100644 index1.php create mode 100644 layout.css create mode 100644 martin_manov.php create mode 100644 navcontainer.css create mode 100644 paolashumanova.php create mode 100644 standard_structure.css create mode 100644 standard_structure.js create mode 100644 typography.css diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..412eeda7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..5ebd21a1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,163 @@ +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.vspscc +.builds +*.dotCover + +## TODO: If you have NuGet Package Restore enabled, uncomment this +#packages/ + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf + +# Visual Studio profiler +*.psess +*.vsp + +# ReSharper is a .NET coding add-in +_ReSharper* + +# Installshield output folder +[Ee]xpress + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish + +# Others +[Bb]in +[Oo]bj +sql +TestResults +*.Cache +ClientBin +stylecop.* +~$* +*.dbmdl +Generated_Code #added for RIA/Silverlight projects + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML + + + +############ +## Windows +############ + +# Windows image file caches +Thumbs.db + +# Folder config file +Desktop.ini + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist +build +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg + +# Mac crap +.DS_Store diff --git a/GyunerZeki.php b/GyunerZeki.php new file mode 100644 index 00000000..a19d7246 --- /dev/null +++ b/GyunerZeki.php @@ -0,0 +1,9 @@ + + + PHP Test + + + Hello World Gyuner Zeki!

'; ?> + + + diff --git a/KrasimirTsvetanov.php b/KrasimirTsvetanov.php new file mode 100644 index 00000000..32b6fbbb --- /dev/null +++ b/KrasimirTsvetanov.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Krasimir Tsvetanov! kraseza@gmail.com

'; ?> + + \ No newline at end of file diff --git a/MargaritaKrushkova.php b/MargaritaKrushkova.php new file mode 100644 index 00000000..94a256c6 --- /dev/null +++ b/MargaritaKrushkova.php @@ -0,0 +1,8 @@ + + + PHP Test + + + I am Margarita Krushkova

'; ?> + + \ No newline at end of file diff --git a/MihailKopuschu.php b/MihailKopuschu.php new file mode 100644 index 00000000..435a694d --- /dev/null +++ b/MihailKopuschu.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> + + \ No newline at end of file diff --git a/PetyaStavarova.php b/PetyaStavarova.php new file mode 100644 index 00000000..1e74060a --- /dev/null +++ b/PetyaStavarova.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Petya Stavarova, petyast92@gmail.com

'; ?> + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..de855a2f --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +This is a sample PHP project diff --git a/StoyanCheresharov.php b/StoyanCheresharov.php new file mode 100644 index 00000000..782a3047 --- /dev/null +++ b/StoyanCheresharov.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World Stoyan Cheresharov! cheresharov@hotmail.com

'; ?> + + \ No newline at end of file diff --git a/StudentContributor.php b/StudentContributor.php new file mode 100644 index 00000000..e3de1596 --- /dev/null +++ b/StudentContributor.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Stoyan Cheresharov. change. Other change

'; ?> + + \ No newline at end of file diff --git a/Todor.php b/Todor.php new file mode 100644 index 00000000..10333db1 --- /dev/null +++ b/Todor.php @@ -0,0 +1,10 @@ + + + PHP Test + + + Hello from Todor

'; ?> + Този проект може да бъде разгледан на адрес: fmi-project-todor.eu01.aws.af.cm + Публично резозитори(форк): git@github.com:asdator/fmi.git + + \ No newline at end of file diff --git a/VasilVasilev.php b/VasilVasilev.php new file mode 100644 index 00000000..0723efb0 --- /dev/null +++ b/VasilVasilev.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Vasil Vasilev vasil.georgiev.34@gmail.com

'; ?> + + \ No newline at end of file diff --git a/VictorAtanassov.php b/VictorAtanassov.php new file mode 100644 index 00000000..917318b1 --- /dev/null +++ b/VictorAtanassov.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello from Victor Atanassov

'; ?> + + \ No newline at end of file diff --git a/ZhelyanGuglev.php b/ZhelyanGuglev.php new file mode 100644 index 00000000..2f73bf32 --- /dev/null +++ b/ZhelyanGuglev.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Zhelyan Guglev!!! E-mail: jelian_g@mail.bg

'; ?> + + diff --git a/index.html b/index.html new file mode 100644 index 00000000..581e9b10 --- /dev/null +++ b/index.html @@ -0,0 +1,67 @@ + + + + FMI + + + +
+
+ +
+
+
+

Content

+
+
+ +
+
+
+

Advertisements

+
+
+ +
+
+ + + \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 00000000..bc3b876e --- /dev/null +++ b/index.php @@ -0,0 +1,11 @@ + + + Hello World + + + Hello World from FMI

'; ?> + Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> + Hello World, Aleksander Aleksandrov


email:aleksaander_aleksandrov@abv.bg'; ?> + + + diff --git a/index1.php b/index1.php new file mode 100644 index 00000000..29dbc016 --- /dev/null +++ b/index1.php @@ -0,0 +1 @@ +gdfgdfgfd diff --git a/layout.css b/layout.css new file mode 100644 index 00000000..be424f98 --- /dev/null +++ b/layout.css @@ -0,0 +1,77 @@ +@CHARSET "UTF-8"; + +body, html{ + margin: 0; + padding: 0; +} + +body { + text-align: center; + background: yellow; +} + +#wrap { + width: 960px; /* 80%;*/ + margin: auto; + text-align: left; +} + +#header { + position: relative; + top: 0; + left: 0; + width:100%; + height: 100px; + background: green; +} + +#footer { + clear: both; + width:100%; + height: 60px; + background: cyan; +} + +#mainBody { + float: left; + width: 80%; + background: red; +} + +#content { + float: right; + width: 80%; + min-height: 300px; + background: brown; +} + +#navSide { + float: left; + width: 20%; + /* display: none; */ +} + +#add { + float: right; + width: 20%; + /* display: none; */ + background: blue; +} + +#wrapInner { + width: 100%; + margin: auto; +} + +#navTop { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + /* height: 30px; */ + text-align: center; +} + +.inside { + padding: 5px; +} \ No newline at end of file diff --git a/martin_manov.php b/martin_manov.php new file mode 100644 index 00000000..ae688f8e --- /dev/null +++ b/martin_manov.php @@ -0,0 +1,14 @@ + + + PHP Test + + + Martin Manov - matrixatp.martin@gmail.com

+ Здравейте, + имах малко проблеми с изпращането до GitHub. + Първо трябваше да отида до Git->Merge. След това Commit продължаваше да не работи, но успешно направих Push. + Дано това да може да помогне на останалите, ако има затруднения. + Поздрави + '; ?> + + \ No newline at end of file diff --git a/navcontainer.css b/navcontainer.css new file mode 100644 index 00000000..59c4e4fd --- /dev/null +++ b/navcontainer.css @@ -0,0 +1,122 @@ +/*In order to make it work in IE we need to load also */ +/* */ +#navcontainer { +/* background:url(../images/menu_bg.jpg); */ +} + +#navcontainer ul { + padding: 0; + margin: 0; + list-style: none; + overflow: visible; + z-index: 5; +} + +#navcontainer a { + display:block; +/* color:#000000; */ + text-align:center; + text-decoration: none; + font-size: 10pt; /*12px = 9pt*/ + width: 90px; + height: 51px; + padding-top:20px; + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; +/* background: yellow; */ +} + +#navcontainer a:visited { +/* color:#000000; */ +} + +#navcontainer a:hover { +/* background:green url(../images/menu-bg-hvr.gif) no-repeat scroll 0 0; */ +/* background: transparent url("../images/nav_center_hover.png") repeat-x scroll 0 0; */ + background: white url("../images/nav_center_hover.png") repeat-x scroll 0 0; + color:#954a04; +} + +/* Active Menus */ +ul li.active a{ +/* color:#000; */ +} + +ul li.active a:visited { +/* color:#000; */ +} + +ul li.active a:hover { +/* color:#000; */ +} + +/*If we need different settings for the pop-up menus*/ +#navcontainer li ul a { + display:block; +/* color:#000000; */ + text-align:center; + text-decoration: none; + font-size: 10pt; + width: 120px; /* auto; */ + height: 30px; /* auto; */ + padding-top:15px; + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; +/* border-top: 1px solid #aaaaaa; */ + border-bottom: 1px solid #aaaaaa; + background: #eeeeee; /* Here you change the background color of the popup menu*/ +} + +#navcontainer li ul a:visited { +/* color:#000000; */ +} + +#navcontainer li ul a:hover { + background:#aaaaaa; /* url(../images/menu-bg-hvr.gif); */ + color:#954a04; +} +/* End of popup menu*/ + +/* this makes the menu to become horizontal */ +#navcontainer li { + float: left; + width: 95px; +} + +/* for the next level we move it to the right "indent" Controls how far right are the next menus +Bigger number more right +the longest situation was margin: -1em 0 0 8em; - it was working for ALL LEVELS PERFECT +-2.2em 0 0 8em; the first number controls the vertila position bigger negative numbers higher will be the next level +*/ +#navcontainer li ul { /* the first number moves the second level up verticaly and down, thest number moves left right horizontaly*/ + margin: -0.8em 0 0 0; + } +#navcontainer li ul ul { + margin: -2.5em 0 0 8.5em; + } +#navcontainer li ul ul ul{ + margin: -2.5em 0 0 8.5em; + } + #navcontainer li ul ul ul ul{ + margin: -2.5em 0 0 8.5em; + } + #navcontainer li ul ul ul ul ul{ + margin: -2.5em 0 0 8.5em; + } + +/* We starting to hide them now this moves the lists very far left*/ + #navcontainer li ul { + position: absolute; + width: 10em; + left: -999em; +} + +#navcontainer li:hover ul ul, #navcontainer li:hover ul ul ul, #navcontainer li:hover ul ul ul ul, #navcontainer li.sfhover ul ul, #navcontainer li.sfhover ul ul ul, #navcontainer li.sfhover ul ul ul ul { + left: -999em; +} + +/* this brings the list back Can be done only with one expression + this and the javascript is for IE The java script attaches class sfhover to li*/ +#navcontainer li:hover ul, #navcontainer li li:hover ul, #navcontainer li li li:hover ul, #navcontainer li li li li:hover ul, #navcontainer li.sfhover ul, #navcontainer li li.sfhover ul, #navcontainer li li li.sfhover ul, #navcontainer li li li li.sfhover ul { + left: auto; + z-index: 1000; +} + diff --git a/paolashumanova.php b/paolashumanova.php new file mode 100644 index 00000000..60b55c81 --- /dev/null +++ b/paolashumanova.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Paola Shumanova email: paolaaa7@abv.bg

'; ?> + + \ No newline at end of file diff --git a/standard_structure.css b/standard_structure.css new file mode 100644 index 00000000..9f6d8cb1 --- /dev/null +++ b/standard_structure.css @@ -0,0 +1,7 @@ +@import url("layout.css"); +@import url("navcontainer.css"); +@import url("typography.css"); +/* +@import url("custom.css"); +@import url("tables.css"); +*/ \ No newline at end of file diff --git a/standard_structure.js b/standard_structure.js new file mode 100644 index 00000000..3c8dbdac --- /dev/null +++ b/standard_structure.js @@ -0,0 +1,3 @@ +window.onload = function(e) { + alert('Hello World!'); +} \ No newline at end of file diff --git a/typography.css b/typography.css new file mode 100644 index 00000000..aa6f9df5 --- /dev/null +++ b/typography.css @@ -0,0 +1,8 @@ +@font-face { + font-family: "Trebuchet MS"; + src: url("../fonts/trebuc.ttf"); +} + +body { + font: normal normal normal 9pt/105% "Trebuchet MS", Arial, Helvetica, sans-serif; /*"Trebuchet MS",*/ +} From 67a76d305666ed995d45e26099ca9d082a87f1b4 Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" Date: Mon, 28 Jan 2013 17:28:21 +0000 Subject: [PATCH 034/180] I have added Contributing Student.php --- ContributingStudent.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 ContributingStudent.php diff --git a/ContributingStudent.php b/ContributingStudent.php new file mode 100644 index 00000000..e2786a66 --- /dev/null +++ b/ContributingStudent.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Contributing Student.

'; ?> + + \ No newline at end of file From a1f2b009a5add17eedc9c585838f61930ae5b5cf Mon Sep 17 00:00:00 2001 From: "elyned@abv.bg" Date: Thu, 31 Jan 2013 17:12:28 +0000 Subject: [PATCH 035/180] Add the file ElitsaNedyalkova.php --- ElitsaNedyalkova.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 ElitsaNedyalkova.php diff --git a/ElitsaNedyalkova.php b/ElitsaNedyalkova.php new file mode 100644 index 00000000..76a86387 --- /dev/null +++ b/ElitsaNedyalkova.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Elitsa Nedyalkova elyned@abv.bg

'; ?> + + \ No newline at end of file From 99de4c0efb877bddaad2046503e904b261e1fbd0 Mon Sep 17 00:00:00 2001 From: cl-server Date: Fri, 1 Feb 2013 08:47:07 +0000 Subject: [PATCH 036/180] init --- .htaccess | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .htaccess diff --git a/.htaccess b/.htaccess new file mode 100644 index 00000000..912ca125 --- /dev/null +++ b/.htaccess @@ -0,0 +1,4 @@ + + Order allow,deny + Deny from all + From 79a69cf916eb64c7551da5dfaa5376c0e79b1301 Mon Sep 17 00:00:00 2001 From: "rallnic1321@gmail.com" <> Date: Fri, 1 Feb 2013 08:51:46 +0000 Subject: [PATCH 037/180] first commit --- RalicaNicolova.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 RalicaNicolova.php diff --git a/RalicaNicolova.php b/RalicaNicolova.php new file mode 100644 index 00000000..b8d0618b --- /dev/null +++ b/RalicaNicolova.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World Ralica NIcolova

'; ?> + + \ No newline at end of file From 17b3469cc9e1001558ebc4ddc7871195a9724ef0 Mon Sep 17 00:00:00 2001 From: Stoyan Atanasoff Date: Fri, 1 Feb 2013 04:07:26 -0500 Subject: [PATCH 038/180] my first commit --- .c9revisions/StoyanAtanasoff.php.c9save | 12 ++++++++++++ StoyanAtanasoff.php | 3 +++ 2 files changed, 15 insertions(+) create mode 100644 .c9revisions/StoyanAtanasoff.php.c9save create mode 100644 StoyanAtanasoff.php diff --git a/.c9revisions/StoyanAtanasoff.php.c9save b/.c9revisions/StoyanAtanasoff.php.c9save new file mode 100644 index 00000000..8abc0567 --- /dev/null +++ b/.c9revisions/StoyanAtanasoff.php.c9save @@ -0,0 +1,12 @@ +{"ts":1359709576891,"silentsave":true,"restoring":false,"patch":[[]],"length":0} +{"contributors":[],"silentsave":true,"ts":1359709580066,"patch":[[{"diffs":[[1,""]],"start1":27,"start2":27,"length1":8,"length2":12}]],"length":39,"saved":false} +{"ts":1359709603971,"patch":[[{"diffs":[[0,"oyan Ata"],[1,"ec"],[0,"nasoff !"]],"start1":18,"start2":18,"length1":16,"length2":18},{"diffs":[[0,"soff !\";"],[1,"h"],[0,"\n?>"]],"start1":30,"start2":30,"length1":11,"length2":12}]],"length":42,"saved":false} +{"ts":1359709605234,"patch":[[{"diffs":[[0,"soff !\";"],[-1,"h"],[0,"\n?>"]],"start1":30,"start2":30,"length1":12,"length2":11}]],"length":41,"saved":false} +{"ts":1359709611632,"patch":[[{"diffs":[[0,"oyan Ata"],[-1,"e"],[0,"cnasoff "]],"start1":18,"start2":18,"length1":17,"length2":16}]],"length":40,"saved":false} +{"ts":1359709615577,"patch":[[{"diffs":[[0," Ata"],[-1,"c"],[0,"n"],[1,"as"],[0,"asof"]],"start1":22,"start2":22,"length1":10,"length2":11}]],"length":41,"saved":false} diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php new file mode 100644 index 00000000..eaea34b0 --- /dev/null +++ b/StoyanAtanasoff.php @@ -0,0 +1,3 @@ + \ No newline at end of file From 8483bb7340f0bc076a15510a5b06f59a886f9940 Mon Sep 17 00:00:00 2001 From: cl-server Date: Fri, 1 Feb 2013 09:19:32 +0000 Subject: [PATCH 039/180] init --- .htaccess | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .htaccess diff --git a/.htaccess b/.htaccess new file mode 100644 index 00000000..912ca125 --- /dev/null +++ b/.htaccess @@ -0,0 +1,4 @@ + + Order allow,deny + Deny from all + From c9776180ea4932833e4f18cb4af7b3941ed9a7e8 Mon Sep 17 00:00:00 2001 From: "voted@start.bg" <> Date: Fri, 1 Feb 2013 09:22:55 +0000 Subject: [PATCH 040/180] first --- AntonTonev.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 AntonTonev.php diff --git a/AntonTonev.php b/AntonTonev.php new file mode 100644 index 00000000..9638ddda --- /dev/null +++ b/AntonTonev.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World Anton Tonev! voted@start.bg

'; ?> + + \ No newline at end of file From 347683c70b67390e2f7a30a09943ebd83a6d3872 Mon Sep 17 00:00:00 2001 From: wingman Date: Fri, 1 Feb 2013 09:23:02 +0000 Subject: [PATCH 041/180] Initial commit --- .gitignore | 9 + LICENSE.txt | 27 + README.md | 33 + composer.json | 22 + composer.phar | Bin 0 -> 570295 bytes config/application.config.php | 15 + config/autoload/.gitignore | 2 + config/autoload/README.md | 8 + config/autoload/global.php | 16 + config/autoload/local.php.dist | 16 + data/cache/.gitignore | 2 + init_autoloader.php | 49 + module/Application/Module.php | 39 + module/Application/config/module.config.php | 91 ++ module/Application/language/ar_SY.mo | Bin 0 -> 5526 bytes module/Application/language/ar_SY.po | 184 +++ module/Application/language/cs_CZ.mo | Bin 0 -> 5005 bytes module/Application/language/cs_CZ.po | 153 +++ module/Application/language/de_DE.mo | Bin 0 -> 5126 bytes module/Application/language/de_DE.po | 153 +++ module/Application/language/en_US.mo | Bin 0 -> 545 bytes module/Application/language/en_US.po | 153 +++ module/Application/language/es_ES.mo | Bin 0 -> 5063 bytes module/Application/language/es_ES.po | 111 ++ module/Application/language/fr_CA.mo | Bin 0 -> 5074 bytes module/Application/language/fr_CA.po | 153 +++ module/Application/language/fr_FR.mo | Bin 0 -> 5077 bytes module/Application/language/fr_FR.po | 153 +++ module/Application/language/it_IT.mo | Bin 0 -> 4922 bytes module/Application/language/it_IT.po | 154 +++ module/Application/language/ja_JP.mo | Bin 0 -> 5185 bytes module/Application/language/ja_JP.po | 140 +++ module/Application/language/nl_NL.mo | Bin 0 -> 4815 bytes module/Application/language/nl_NL.po | 153 +++ module/Application/language/pl_PL.mo | Bin 0 -> 4934 bytes module/Application/language/pl_PL.po | 153 +++ module/Application/language/tr_TR.mo | Bin 0 -> 4785 bytes module/Application/language/tr_TR.po | 153 +++ .../Controller/IndexController.php | 21 + .../view/application/index/index.phtml | 26 + module/Application/view/error/404.phtml | 61 + module/Application/view/error/index.phtml | 62 + module/Application/view/layout/layout.phtml | 57 + public/css/bootstrap-responsive.min.css | 3 + public/css/bootstrap.min.css | 610 +++++++++ public/css/style.css | 37 + public/images/favicon.ico | Bin 0 -> 1406 bytes public/images/zf2-logo.png | Bin 0 -> 738 bytes public/index.php | 12 + public/js/html5.js | 4 + public/js/jquery-1.7.2.min.js | 4 + vendor/.gitignore | 5 + vendor/README.md | 1 + vendor/doctrine/common/.gitignore | 4 + vendor/doctrine/common/.gitmodules | 3 + vendor/doctrine/common/.travis.yml | 5 + vendor/doctrine/common/LICENSE | 504 ++++++++ vendor/doctrine/common/README.md | 12 + vendor/doctrine/common/UPGRADE_TO_2_1 | 39 + vendor/doctrine/common/UPGRADE_TO_2_2 | 61 + vendor/doctrine/common/build.properties | 6 + vendor/doctrine/common/build.xml | 59 + vendor/doctrine/common/composer.json | 21 + .../Common/Annotations/Annotation.php | 75 ++ .../Annotations/Annotation/Attribute.php | 47 + .../Annotations/Annotation/Attributes.php | 37 + .../Annotation/IgnoreAnnotation.php | 44 + .../Annotations/Annotation/Required.php | 33 + .../Common/Annotations/Annotation/Target.php | 105 ++ .../Annotations/AnnotationException.php | 111 ++ .../Common/Annotations/AnnotationReader.php | 303 +++++ .../Common/Annotations/AnnotationRegistry.php | 129 ++ .../Common/Annotations/CachedReader.php | 179 +++ .../Doctrine/Common/Annotations/DocLexer.php | 140 +++ .../Doctrine/Common/Annotations/DocParser.php | 891 +++++++++++++ .../Common/Annotations/FileCacheReader.php | 209 +++ .../Common/Annotations/IndexedReader.php | 94 ++ .../Doctrine/Common/Annotations/PhpParser.php | 203 +++ .../Doctrine/Common/Annotations/Reader.php | 35 + .../Annotations/SimpleAnnotationReader.php | 152 +++ .../lib/Doctrine/Common/Cache/ApcCache.php | 97 ++ .../lib/Doctrine/Common/Cache/ArrayCache.php | 96 ++ .../lib/Doctrine/Common/Cache/Cache.php | 102 ++ .../Doctrine/Common/Cache/CacheProvider.php | 188 +++ .../Doctrine/Common/Cache/MemcacheCache.php | 121 ++ .../Doctrine/Common/Cache/MemcachedCache.php | 124 ++ .../Doctrine/Common/Cache/WinCacheCache.php | 92 ++ .../lib/Doctrine/Common/Cache/XcacheCache.php | 110 ++ .../Doctrine/Common/Cache/ZendDataCache.php | 84 ++ .../lib/Doctrine/Common/ClassLoader.php | 262 ++++ .../Common/Collections/ArrayCollection.php | 447 +++++++ .../Common/Collections/Collection.php | 243 ++++ .../lib/Doctrine/Common/CommonException.php | 28 + .../common/lib/Doctrine/Common/Comparable.php | 47 + .../common/lib/Doctrine/Common/EventArgs.php | 69 + .../lib/Doctrine/Common/EventManager.php | 136 ++ .../lib/Doctrine/Common/EventSubscriber.php | 45 + .../common/lib/Doctrine/Common/Lexer.php | 266 ++++ .../Doctrine/Common/NotifyPropertyChanged.php | 45 + .../Persistence/AbstractManagerRegistry.php | 224 ++++ .../Common/Persistence/ConnectionRegistry.php | 63 + .../Persistence/Event/LifecycleEventArgs.php | 77 ++ .../Event/LoadClassMetadataEventArgs.php | 76 ++ .../Persistence/Event/ManagerEventArgs.php | 59 + .../Persistence/Event/OnClearEventArgs.php | 84 ++ .../Persistence/Event/PreUpdateEventArgs.php | 129 ++ .../Common/Persistence/ManagerRegistry.php | 112 ++ .../Mapping/AbstractClassMetadataFactory.php | 359 ++++++ .../Persistence/Mapping/ClassMetadata.php | 165 +++ .../Mapping/ClassMetadataFactory.php | 74 ++ .../Mapping/Driver/AnnotationDriver.php | 214 ++++ .../Mapping/Driver/DefaultFileLocator.php | 169 +++ .../Persistence/Mapping/Driver/FileDriver.php | 178 +++ .../Mapping/Driver/FileLocator.php | 69 + .../Mapping/Driver/MappingDriver.php | 56 + .../Mapping/Driver/MappingDriverChain.php | 125 ++ .../Persistence/Mapping/Driver/PHPDriver.php | 70 ++ .../Mapping/Driver/StaticPHPDriver.php | 131 ++ .../Mapping/Driver/SymfonyFileLocator.php | 198 +++ .../Persistence/Mapping/MappingException.php | 57 + .../Persistence/Mapping/ReflectionService.php | 80 ++ .../Mapping/RuntimeReflectionService.php | 102 ++ .../Mapping/StaticReflectionService.php | 107 ++ .../Common/Persistence/ObjectManager.php | 143 +++ .../Common/Persistence/ObjectManagerAware.php | 49 + .../Common/Persistence/ObjectRepository.php | 78 ++ .../Common/Persistence/PersistentObject.php | 233 ++++ .../lib/Doctrine/Common/Persistence/Proxy.php | 60 + .../Common/PropertyChangedListener.php | 48 + .../lib/Doctrine/Common/Util/ClassUtils.php | 103 ++ .../common/lib/Doctrine/Common/Util/Debug.php | 123 ++ .../lib/Doctrine/Common/Util/Inflector.php | 72 ++ .../common/lib/Doctrine/Common/Version.php | 55 + vendor/doctrine/common/phpunit.xml.dist | 31 + vendor/doctrine/common/tests/.gitignore | 3 + .../Common/Annotations/AbstractReaderTest.php | 538 ++++++++ .../Annotations/AnnotationReaderTest.php | 13 + .../Common/Annotations/CachedReaderTest.php | 56 + .../Tests/Common/Annotations/DocLexerTest.php | 27 + .../Common/Annotations/DocParserTest.php | 1118 +++++++++++++++++ .../Annotations/FileCacheReaderTest.php | 40 + .../Annotation/AnnotWithDefaultValue.php | 10 + .../Fixtures/Annotation/Autoload.php | 10 + .../Annotations/Fixtures/Annotation/Route.php | 11 + .../Fixtures/Annotation/Secure.php | 18 + .../Fixtures/Annotation/Template.php | 14 + .../Fixtures/Annotation/Version.php | 11 + .../Fixtures/AnnotationTargetAll.php | 14 + .../Fixtures/AnnotationTargetAnnotation.php | 14 + .../Fixtures/AnnotationTargetClass.php | 15 + .../Fixtures/AnnotationTargetMethod.php | 15 + .../AnnotationTargetPropertyMethod.php | 14 + .../Fixtures/AnnotationWithAttributes.php | 119 ++ .../AnnotationWithRequiredAttributes.php | 50 + ...ithRequiredAttributesWithoutContructor.php | 24 + .../AnnotationWithTargetSyntaxError.php | 11 + .../Fixtures/AnnotationWithVarType.php | 62 + .../Annotations/Fixtures/ClassDDC1660.php | 30 + ...assWithAnnotationWithTargetSyntaxError.php | 21 + .../ClassWithAnnotationWithVarType.php | 31 + .../ClassWithFullyQualifiedUseStatements.php | 11 + ...lassWithInvalidAnnotationTargetAtClass.php | 17 + ...assWithInvalidAnnotationTargetAtMethod.php | 20 + ...sWithInvalidAnnotationTargetAtProperty.php | 24 + .../ClassWithValidAnnotationTarget.php | 41 + .../Annotations/Fixtures/Controller.php | 300 +++++ ...erentNamespacesPerFileWithClassAsFirst.php | 15 + ...ferentNamespacesPerFileWithClassAsLast.php | 15 + ...EqualNamespacesPerFileWithClassAsFirst.php | 13 + .../EqualNamespacesPerFileWithClassAsLast.php | 12 + ...lobalNamespacesPerFileWithClassAsFirst.php | 12 + ...GlobalNamespacesPerFileWithClassAsLast.php | 12 + .../InvalidAnnotationUsageButIgnoredClass.php | 14 + .../Fixtures/InvalidAnnotationUsageClass.php | 10 + .../Fixtures/MultipleClassesInFile.php | 9 + .../MultipleImportsInUseStatement.php | 10 + .../NamespaceAndClassCommentedOut.php | 20 + .../NamespaceWithClosureDeclaration.php | 15 + .../Fixtures/NamespacedSingleClassLOC1000.php | 1009 +++++++++++++++ .../Annotations/Fixtures/NoAnnotation.php | 5 + .../Fixtures/NonNamespacedClass.php | 10 + .../Fixtures/SingleClassLOC1000.php | 1006 +++++++++++++++ .../Annotations/Fixtures/TestInterface.php | 13 + .../Common/Annotations/PerformanceTest.php | 194 +++ .../Common/Annotations/PhpParserTest.php | 179 +++ .../SimpleAnnotationReaderTest.php | 97 ++ .../Common/Annotations/Ticket/DCOM55Test.php | 65 + .../Annotations/Ticket/DCOM58Entity.php | 8 + .../Common/Annotations/Ticket/DCOM58Test.php | 112 ++ .../Common/Annotations/TopLevelAnnotation.php | 8 + .../Tests/Common/Cache/ApcCacheTest.php | 20 + .../Tests/Common/Cache/ArrayCacheTest.php | 13 + .../Doctrine/Tests/Common/Cache/CacheTest.php | 87 ++ .../Tests/Common/Cache/MemcacheCacheTest.php | 38 + .../Tests/Common/Cache/MemcachedCacheTest.php | 40 + .../Tests/Common/Cache/WinCacheCacheTest.php | 20 + .../Tests/Common/Cache/XcacheCacheTest.php | 20 + .../Tests/Common/Cache/ZendDataCacheTest.php | 20 + .../Doctrine/Tests/Common/ClassLoaderTest.php | 45 + .../Common/ClassLoaderTest/ClassA.class.php | 6 + .../Common/ClassLoaderTest/ClassB.class.php | 6 + .../Common/ClassLoaderTest/ClassC.class.php | 6 + .../Tests/Common/ClassLoaderTest/ClassD.php | 5 + .../Common/Collections/CollectionTest.php | 195 +++ .../Tests/Common/DoctrineExceptionTest.php | 0 .../Tests/Common/EventManagerTest.php | 88 ++ .../Persistence/Mapping/ChainDriverTest.php | 94 ++ .../Mapping/ClassMetadataFactoryTest.php | 134 ++ .../Mapping/DefaultFileLocatorTest.php | 90 ++ .../Persistence/Mapping/FileDriverTest.php | 142 +++ .../Persistence/Mapping/PHPDriverTest.php | 18 + .../Mapping/RuntimeReflectionServiceTest.php | 70 ++ .../Mapping/StaticPHPDriverTest.php | 35 + .../Mapping/StaticReflectionServiceTest.php | 70 ++ .../Mapping/SymfonyFileLocatorTest.php | 88 ++ .../Persistence/Mapping/_files/TestEntity.php | 3 + .../Persistence/Mapping/_files/global.yml | 1 + .../Persistence/Mapping/_files/stdClass.yml | 1 + .../Persistence/PersistentObjectTest.php | 247 ++++ .../Tests/Common/Util/ClassUtilsTest.php | 100 ++ .../Doctrine/Tests/Common/Util/DebugTest.php | 27 + .../tests/Doctrine/Tests/DoctrineTestCase.php | 10 + .../common/tests/Doctrine/Tests/TestInit.php | 31 + .../common/tests/NativePhpunitTask.php | 246 ++++ vendor/doctrine/common/tests/README.markdown | 27 + 225 files changed, 20729 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 composer.json create mode 100644 composer.phar create mode 100644 config/application.config.php create mode 100644 config/autoload/.gitignore create mode 100644 config/autoload/README.md create mode 100644 config/autoload/global.php create mode 100644 config/autoload/local.php.dist create mode 100644 data/cache/.gitignore create mode 100644 init_autoloader.php create mode 100644 module/Application/Module.php create mode 100644 module/Application/config/module.config.php create mode 100644 module/Application/language/ar_SY.mo create mode 100644 module/Application/language/ar_SY.po create mode 100644 module/Application/language/cs_CZ.mo create mode 100644 module/Application/language/cs_CZ.po create mode 100644 module/Application/language/de_DE.mo create mode 100644 module/Application/language/de_DE.po create mode 100644 module/Application/language/en_US.mo create mode 100644 module/Application/language/en_US.po create mode 100644 module/Application/language/es_ES.mo create mode 100644 module/Application/language/es_ES.po create mode 100644 module/Application/language/fr_CA.mo create mode 100644 module/Application/language/fr_CA.po create mode 100644 module/Application/language/fr_FR.mo create mode 100644 module/Application/language/fr_FR.po create mode 100644 module/Application/language/it_IT.mo create mode 100644 module/Application/language/it_IT.po create mode 100644 module/Application/language/ja_JP.mo create mode 100644 module/Application/language/ja_JP.po create mode 100644 module/Application/language/nl_NL.mo create mode 100644 module/Application/language/nl_NL.po create mode 100644 module/Application/language/pl_PL.mo create mode 100644 module/Application/language/pl_PL.po create mode 100644 module/Application/language/tr_TR.mo create mode 100644 module/Application/language/tr_TR.po create mode 100644 module/Application/src/Application/Controller/IndexController.php create mode 100644 module/Application/view/application/index/index.phtml create mode 100644 module/Application/view/error/404.phtml create mode 100644 module/Application/view/error/index.phtml create mode 100644 module/Application/view/layout/layout.phtml create mode 100644 public/css/bootstrap-responsive.min.css create mode 100644 public/css/bootstrap.min.css create mode 100644 public/css/style.css create mode 100644 public/images/favicon.ico create mode 100644 public/images/zf2-logo.png create mode 100644 public/index.php create mode 100644 public/js/html5.js create mode 100644 public/js/jquery-1.7.2.min.js create mode 100644 vendor/.gitignore create mode 100644 vendor/README.md create mode 100644 vendor/doctrine/common/.gitignore create mode 100644 vendor/doctrine/common/.gitmodules create mode 100644 vendor/doctrine/common/.travis.yml create mode 100644 vendor/doctrine/common/LICENSE create mode 100644 vendor/doctrine/common/README.md create mode 100644 vendor/doctrine/common/UPGRADE_TO_2_1 create mode 100644 vendor/doctrine/common/UPGRADE_TO_2_2 create mode 100644 vendor/doctrine/common/build.properties create mode 100644 vendor/doctrine/common/build.xml create mode 100644 vendor/doctrine/common/composer.json create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/CommonException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Comparable.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventManager.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Lexer.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Version.php create mode 100644 vendor/doctrine/common/phpunit.xml.dist create mode 100644 vendor/doctrine/common/tests/.gitignore create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/CachedReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Autoload.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Route.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Secure.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetAll.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetPropertyMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithAttributes.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithTargetSyntaxError.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithVarType.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithAnnotationWithTargetSyntaxError.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithAnnotationWithVarType.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithFullyQualifiedUseStatements.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtProperty.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithValidAnnotationTarget.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Controller.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/EqualNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/EqualNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/GlobalNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/GlobalNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/InvalidAnnotationUsageButIgnoredClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/InvalidAnnotationUsageClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/MultipleClassesInFile.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/MultipleImportsInUseStatement.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespaceAndClassCommentedOut.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespaceWithClosureDeclaration.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespacedSingleClassLOC1000.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NonNamespacedClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/SingleClassLOC1000.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PerformanceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Test.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/CacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassB.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassC.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassD.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/CollectionTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/TestInit.php create mode 100644 vendor/doctrine/common/tests/NativePhpunitTask.php create mode 100644 vendor/doctrine/common/tests/README.markdown diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..ad907fa5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +nbproject +._* +.~lock.* +.buildpath +.DS_Store +.idea +.project +.settings +composer.lock diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..36e97601 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,27 @@ +Copyright (c) 2005-2012, Zend Technologies USA, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Zend Technologies USA, Inc. nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..4e7d164a --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +ZendSkeletonApplication +======================= + +Introduction +------------ +This is a simple, skeleton application using the ZF2 MVC layer and module +systems. This application is meant to be used as a starting place for those +looking to get their feet wet with ZF2. + + +Installation +------------ + +Using Composer (recommended) +---------------------------- +The recommended way to get a working copy of this project is to clone the repository +and use composer to install dependencies: + + cd my/project/dir + git clone git://github.com/zendframework/ZendSkeletonApplication.git + cd ZendSkeletonApplication + php composer.phar install + +Using Git submodules +-------------------- +Alternatively, you can install using native git submodules: + + git clone git://github.com/zendframework/ZendSkeletonApplication.git --recursive + +Virtual Host +------------ +Afterwards, set up a virtual host to point to the public/ directory of the +project and you should be ready to go! diff --git a/composer.json b/composer.json new file mode 100644 index 00000000..b70734ed --- /dev/null +++ b/composer.json @@ -0,0 +1,22 @@ +{ + "name": "zendframework/skeleton-application", + "description": "Skeleton Application for ZF2", + "license": "BSD-3-Clause", + "keywords": [ + "framework", + "zf2" + ], + "homepage": "http://framework.zend.com/", + "repositories": [ + { + "type": "composer", + "url": "http://packages.zendframework.com/" + } + ], + "require": { + "php": ">=5.3.3", + "zendframework/zendframework": "2.*", + "zendframework/zendservice-recaptcha": "2.*", + "doctrine/common": ">=2.1" + } +} diff --git a/composer.phar b/composer.phar new file mode 100644 index 0000000000000000000000000000000000000000..48edaa6149f3581df05a06f283f27ad50ff879de GIT binary patch literal 570295 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 literal 0 HcmV?d00001 diff --git a/config/application.config.php b/config/application.config.php new file mode 100644 index 00000000..6504dea7 --- /dev/null +++ b/config/application.config.php @@ -0,0 +1,15 @@ + array( + 'Application', + ), + 'module_listener_options' => array( + 'config_glob_paths' => array( + 'config/autoload/{,*.}{global,local}.php', + ), + 'module_paths' => array( + './module', + './vendor', + ), + ), +); diff --git a/config/autoload/.gitignore b/config/autoload/.gitignore new file mode 100644 index 00000000..1a83fda6 --- /dev/null +++ b/config/autoload/.gitignore @@ -0,0 +1,2 @@ +local.php +*.local.php diff --git a/config/autoload/README.md b/config/autoload/README.md new file mode 100644 index 00000000..4e504db0 --- /dev/null +++ b/config/autoload/README.md @@ -0,0 +1,8 @@ +About this directory: +===================== + +By default, this application is configured to load all configs in +`./config/autoload/{,*.}{global,local}.php`. Doing this provides a +location for a developer to drop in configuration override files provided by +modules, as well as cleanly provide individual, application-wide config files +for things like database connections, etc. diff --git a/config/autoload/global.php b/config/autoload/global.php new file mode 100644 index 00000000..1473720f --- /dev/null +++ b/config/autoload/global.php @@ -0,0 +1,16 @@ +add('Zend', $zf2Path . '/Zend'); + } else { + include $zf2Path . '/Zend/Loader/AutoloaderFactory.php'; + Zend\Loader\AutoloaderFactory::factory(array( + 'Zend\Loader\StandardAutoloader' => array( + 'autoregister_zf' => true + ) + )); + } +} + +if (!class_exists('Zend\Loader\AutoloaderFactory')) { + throw new RuntimeException('Unable to load ZF2. Run `php composer.phar install` or define a ZF2_PATH environment variable.'); +} diff --git a/module/Application/Module.php b/module/Application/Module.php new file mode 100644 index 00000000..86d9d4e2 --- /dev/null +++ b/module/Application/Module.php @@ -0,0 +1,39 @@ +getApplication()->getServiceManager()->get('translator'); + $eventManager = $e->getApplication()->getEventManager(); + $moduleRouteListener = new ModuleRouteListener(); + $moduleRouteListener->attach($eventManager); + } + + public function getConfig() + { + return include __DIR__ . '/config/module.config.php'; + } + + public function getAutoloaderConfig() + { + return array( + 'Zend\Loader\StandardAutoloader' => array( + 'namespaces' => array( + __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, + ), + ), + ); + } +} diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php new file mode 100644 index 00000000..a6dd62b8 --- /dev/null +++ b/module/Application/config/module.config.php @@ -0,0 +1,91 @@ + array( + 'routes' => array( + 'home' => array( + 'type' => 'Zend\Mvc\Router\Http\Literal', + 'options' => array( + 'route' => '/', + 'defaults' => array( + 'controller' => 'Application\Controller\Index', + 'action' => 'index', + ), + ), + ), + // The following is a route to simplify getting started creating + // new controllers and actions without needing to create a new + // module. Simply drop new controllers in, and you can access them + // using the path /application/:controller/:action + 'application' => array( + 'type' => 'Literal', + 'options' => array( + 'route' => '/application', + 'defaults' => array( + '__NAMESPACE__' => 'Application\Controller', + 'controller' => 'Index', + 'action' => 'index', + ), + ), + 'may_terminate' => true, + 'child_routes' => array( + 'default' => array( + 'type' => 'Segment', + 'options' => array( + 'route' => '/[:controller[/:action]]', + 'constraints' => array( + 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', + 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', + ), + 'defaults' => array( + ), + ), + ), + ), + ), + ), + ), + 'service_manager' => array( + 'factories' => array( + 'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory', + ), + ), + 'translator' => array( + 'locale' => 'en_US', + 'translation_file_patterns' => array( + array( + 'type' => 'gettext', + 'base_dir' => __DIR__ . '/../language', + 'pattern' => '%s.mo', + ), + ), + ), + 'controllers' => array( + 'invokables' => array( + 'Application\Controller\Index' => 'Application\Controller\IndexController' + ), + ), + 'view_manager' => array( + 'display_not_found_reason' => true, + 'display_exceptions' => true, + 'doctype' => 'HTML5', + 'not_found_template' => 'error/404', + 'exception_template' => 'error/index', + 'template_map' => array( + 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', + 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', + 'error/404' => __DIR__ . '/../view/error/404.phtml', + 'error/index' => __DIR__ . '/../view/error/index.phtml', + ), + 'template_path_stack' => array( + __DIR__ . '/../view', + ), + ), +); diff --git a/module/Application/language/ar_SY.mo b/module/Application/language/ar_SY.mo new file mode 100644 index 0000000000000000000000000000000000000000..fa7ae166939da5c016a79122da666e4ff85e3cf8 GIT binary patch literal 5526 zcmb7|%X1u86~-?l1dzik51s+80fkWU46^K$!#F0$mJ}Q8pt8mZ32b_1u4X#w>7MjM ziYSUIzhp%eVFQ0aFp9=1+p@47$0-)D;jw{Y0oA?9jtx~TS+D_q=XTFS!XYrFo-^I| z+;hHj&Ueo3(p&f4{S(DUb3G*2yOerVhL))ZdT~ zAxGr?Zlykqd=UA5PLLt4~8Ej-^+dXJ-Od& z$PaS=8>HC#Gg5H<6}b!fFQj7Mu6vXk=jXj_K7o7^Sw{X4`2_M8$gd#(ffWDy-j~~- zMV?~+3rO+vOThn=`#&J}bN_psXyje@D)l+!7m$MEDY-}Q+sF@b|NRf-daocQKbuI& z>#vYNQ*RaPe?dx~@4=bi7)O2@c@p_2>~)a*scDiaeoi69j*Aq%Wu(OaGvvpRw~>e0 z_ebQD+&@5)Uqn`slgM8qzmD96vFDJ_ARj?qLrT6fT){cp$t{6MFyHer>`q2z5}eCt+wBYNF9_V>j>}PrLqH5Vjq;Qxl%2L$}$A zBORK^gbSuoRulft-A4ky89H&|*je`= zK*d~HS6gnRqn^dO<7U3SGY*siIQqImZ0L$sT)-#hI-I$C%zlQ>PQO_ z#V$sNlI;vBMQ&`9HpIu!5R)4R;gSuoDV@P@A*67ooij>EZFDCLUNH4oeDy=2P<@8v zNq!=v6}p$5HzM4D~q7J-nr(9WHmj*N!@$dm+hlGb5u&xt6qIe#{`8%j5z9@;$-X@!d!hBghOR*i_8Z{8L?fN7%Mu$AdE_qvQkt91* z#e38EhFK_s@>%0S6Kk4bw|#7lk48$$JTwOM42|u0YNw_YH1Qiu8K*8y(&LznjMp}yAjy2;C*+ci!Q7miFKrKC z(bO#4m@y0x2)f`lOa!C+dGeCCr&t?}7TtMwG}^;2KO3&mcNX1UzUh@wfMwUm?B&OSu`v`&CmAzxOzqS=p!e>pJofmbWBbrM?nH5^8ajSN1VLEQ zRcCR|%Hp$B0@sk+nwd2C*azufVd3kNlA6GkRJbgDXCdVHWKz~)R?n)2&`%<_tU zyynIu-zv=nhPQ{(H_Q@)un`>xD+Y@=%s`=sv!bW`CZne{SUM6UOoXM1KK1mm>eQs3 ztxi;@W(VtsIVx!ARz;Tw4`(@n>a7_bm&RBqkIZ;U=y)ZL({@zRe#hQMhsF=;{O6%Z z{N0E4e(B(dO0T3hvvWGVn%+t;+TPux)Aj5ePfxRUNvCgStLc``&Sxv>Wv4rk{JPNmSQ&+MxteinRy^@{A#v9n!?pXF|m2PAgaK48#?W>z6`L{vwuK8yE%CCQ*_46>AD4*RgP0*i@|d`6kL+>1(9!Iu}G)vsI9k zOGP(`L#Sts3VBzAzPZDmlhZ;Wsn3eu<|!`#rDT(kS||kFyJSQtAmA<+0e3~{u-t=Z$+1ifbOtE;rn%qIJEZtJ@d`tV-n(d%{OTZEEUwcqZ}3eDieQBa zIG{dIMzXe%US=aK<$-uCQr)i))+Hr(ig!(_DPD!cd5x&9FbHQwCRbop(a{6Mc}fM! z8I)fmx&n;wjXGH{qtSo7om#+K!U73gNr1ExBSuPVDGLYtMUW&C>w4Zo^1f>K2{&)y z_SHOop;Q+fm+t)LS_H)WkdVZ0;YZNZhOA4i>`K2|Gyy=|A&w2`!(+ypY_Xk7VzUb} z26`hwI@C@S#;0W>otnOmM!K`@w#^zg-5_}@Id6)o+pGGvcirtXst*UqS8c7pBCP1q zT_VFcgOKkW(<-bY&C)G7tA@(hr_eUIMdFG{)y=1deJF#Wo8Gbs#KA3`t)$(-0a6Sq zAZ=zZ7g}gs&Mw&UlW9EK!3v27c6y_(K;Jjph0LqNJSS2+6oEmL*jTN3duC|@l}D?5 z{~&us71rL)cyZ_nr#EH%4O)(5T(*H0gNsQ2Pa^{Z0z&eXcDHAMVL?G;5!1GZI0U71 z>-m9HoY|s~Pj~r8hV8^`aAa9-ZZKUhW*1Q89P3JR%NZo6=k}Lac?)M, 2012. +# Tawfek Daghistani , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-07 13:58+0300\n" +"Last-Translator: Tawfek Daghistani \n" +"Language-Team: Arabic <>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: English\n" +"X-Poedit-Country: UNITED STATES\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +#: ../view/layout/layout.phtml:6 ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "الصفحة الرئيسية" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "جميع الحقوق محفوظة" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "أهلا بك في %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "" +"Congratulations! You have successfully installed the %sZF2 Skeleton " +"Application%s. You are currently running Zend Framework version %s. This " +"skeleton can serve as a simple starting point for you to begin building your " +"application on ZF2." +msgstr "" +"تهانينا! لقد قمت بتنصيب %sZF2 Skeleton Application%s . أنت الآن تستخدم مكتبة " +"زيند الإصدار %s . هذا التطبيق يمكن أن يكون لك نقطة بداية سهلة في بناء " +"برامجك الخاصة على مكتبة زيند " + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "اشتق مكتبة زيند على GitHub " + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "تابع أخر التطورات" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "" +"Zend Framework 2 is under active development. If you are interested in " +"following the development of ZF2, there is a special ZF2 portal on the " +"official Zend Framework website which provides links to the ZF2 %swiki%s, " +"%sdev blog%s, %sissue tracker%s, and much more. This is a great resource for " +"staying up to date with the latest developments!" +msgstr "" +"مكتبة زيند تخضع للتطوير المستمر , إذا كان لديك الرغبة في متابعة التطورات , " +"بإمكانك تصفح الموقع الرسمي للمكتبة الذي يحتوي على روابط إلى %swiki%s, %sdev " +"blog%s, %sissue tracker%s, ,و المزيد . هذه مصادر رائعة لمتابعة أخر التطورات" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "بوابة التطوير الخاصة ب زيند" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "تعرف على الإضافات" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "" +"The community is working on developing a community site to serve as a " +"repository and gallery for ZF2 modules. The project is available %son GitHub" +"%s. The site is currently live and currently contains a list of some of the " +"modules already available for ZF2." +msgstr "" +"المجتمع البرمجي يعمل على تطوير موقع خاص به ليكون كمصدر و معرض لإضافات ZF2 . " +"هذا المشروع موجود على %son GitHub%s . هذا الموقع يخضع للتطوير المستمر و " +"يحتوي على قائمة من الإضافات الخاصة ب ZF2 " + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "إكتشف إضافات ZF2 " + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "الدعم و المساعدة " + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "" +"If you need any help or support while developing with ZF2, you may reach us " +"via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or " +"feedback you may have regarding the beta releases. Alternatively, you may " +"subscribe and post questions to the %smailing lists%s." +msgstr "" +"إذا كنت تريد الحصول على دعم فني أو مساعدة في تطوير ZF2 , بإمكانك التواصل عبر " +"IRC: %s#zftalk.2 on Freenode%s. نحن نريد أن نسمع منك المزيد من الأسئلة , " +"الأراء و الملاحظات على النسخة التجربية من المكتبة , أو بإمكانك الإشتراك و " +"التفاعل أو وضع الأسئلة في القائمة البريدية %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "تواصل معنا في IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "حصل خطأ ما " + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "مزيد من المعلومات" + +#: ../view/error/index.phtml:11 ../view/error/index.phtml:35 +msgid "File" +msgstr "ملف" + +#: ../view/error/index.phtml:15 ../view/error/index.phtml:39 +msgid "Message" +msgstr "الرسالة" + +#: ../view/error/index.phtml:19 ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "تفاصيل الخطأ" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "الأخطاء السابقة" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "لايوجد خطأ" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "حصل خطأ 404 , الصفحة غير موجودة" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "المتحكم المطلوب غير قادر على إجابة الطلب" + +#: ../view/error/404.phtml:13 +msgid "" +"The requested controller could not be mapped to an existing controller class." +msgstr "لا يمكن ربط المتحكم المطلوب بأي من المتحكمات الموجودة حالياًَ" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "المتحكم المطلوب غير قادر على الإجابة " + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "الرابط المطلوب غير معرف لدى الموجه" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "لا يمكنني التحديد لماذا حصل الخطأ 404 في هذا الوقت " + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "المتحكم " + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "يوصل إلى %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "خطأ برمجي" diff --git a/module/Application/language/cs_CZ.mo b/module/Application/language/cs_CZ.mo new file mode 100644 index 0000000000000000000000000000000000000000..46f2c0f637a83e5aea25000e19c7016663ff5d98 GIT binary patch literal 5005 zcmai&ON<;x8OJLjyqxgL3jzVkiZ&#QXIO6%l57IRUVE_>J6XJIJ6H%*(_OpW(~lau zx@R*3S0pYL7mx_yvYg0a6)xPcg*09PCoYI%jtC*aEe8%feqZ&>&Uiy$^3h;0L+?#rs>mzXU(Z{ck~$ z_a{*7`YU)h_-|0L@9qyMwZi2+Y`zG773_l7!56?^gU^Bg07d_kA8O@qf|uFf2Sv|s zF#hk{{{eh}`I5UP9i_K}=NdV9X=nKS7EAaW;$J&w^slMQ{oHHux9t``|iQl7w%8 zzXD$d?`QE-U<958e*%jBw?XmeU!XznLnMbw^<9kOR*~jl2N2c^ewHt4)Mxn0TCofF zga4QvKH`hm`8mE4zlZp0zVZ=&r3NH#@{xLxm`lCLN8%+Pi63PZK2n>rkHk@I{?zn= z)Qvi&pIUxO+p2Pvc2U$+m5tS@I8N)-l_u9|x$UaL$elWs=ekOFlG^LadRq-`+*PN_ zqr2B!xl@_C$-^#xTz|tgIx$15eG^62`|T#rM@aUy$#Wa)I;bmB&=Xb@f(~dhKTtBU9>N zvo>BE?bBkAV^M9YTI38|TGkq0^$2Tgr+aoMEp@L+^H|>Vw9;m7l|~5`cNN~&mBWup zok@M&<2`a8<3&xx%XR+rjqI5>iu+bRz3;$hV91Zh}G`x0=MK z-Ly``q7z|XVTh_VQKB2KhpEx$FRiT-$VbN8G`Ni zdln@z+4A**CiJ&8RG2gu&+^pQ9vjs~%FXOp^|I54$kzbsdaNuyrM0U@ z!NDEr46dahrDlq@qNJ#;9#pPxqgr$wxV(2Mkh zL`}PG?Wra~iRo0aHaWEsW85ruGt;^u0F@1Sr}8dex`3xm9_!N8Bv(ToQNoKJ<>eY_ zwxe6bgtmo_?i>t+9vmi<60DQ3F0RgvC&?0%xd99BcWHI8B2N84tdN}lpXE&{i$v#a zQwYOUd{}BjL!9fBxa}qcDUhmY-?62I3xz1J+MF^8q9ME6X=`Q4 zD@pSL4d@LT+vMu#N=ax_#;}Zuq)BEqCe+c@Qw|WWgwHHAjczW zoiy&8ZgzZU%dP5T8?S72*2FTnuX6^St9oVmgc*J>61^cE9}p~>w1m$N_!15*f-wp5cisQFOEs!?R#+J;`xhb=P@|hT|Oq;sgusu zXn;?(eXaiDAcrxY*ECe+ZT;oTTkD-?=j+7eZCiEDmXQ;dU)9g{()!q|oegK1D>^UP z5fmBw3p6wWrykn*f|(1edTnf@Wd35!H8919=hx1zozs`jZd^Wn;r!Zs!D-GAIz3s{ z-TA{!j;1Kt;BjY}7u{p(%E)Jn z^l+3^hOn9LyG5wexk=pM;C0)#g*~n(KlOuKZyfBEx8Bfwx=@$Gvb2&LnmncGq#b7U zb#&g@5PfVMxaQ#IWPdo>L% z-^QHYG}Yt=3vNV-8{=@##V0hfG6-YxX5w^l@Ycai=naSall@xbRjTWut9sZpgmmkY zZHKB#6AM+`HVeJd>r0un!_G)uncV27MP{Va#+hph+dq6Md)20EdahEN%!7@*!n&dB zzsD>@My9jShAUh&9fmesOlKN3`RUNb>U0z1L5ENW>sxuLWLyG2a5b6gk&8M+rpcVF z4AM%Tb1A}_6Z2SZmBq&>r)4+YJ(`bLvx-vCp2wCwkvhf^ z*W)T{^kWNy*W>CX7ltlrPZKqLX|ZYDq_jhL$2RJj(}_%m^1i`HA7fT%3*r;nLiiya z5+TMeTcy*f=iseS)p`r|qafsn$k@Q?Nvk!3k{(*}hovZuc-8jgy~*lkvX@J8hT$x9 zV+p_Od6S5lZAdlmTa!5B`su;Vx!iE*@e^Wdf!ZW>2RBVjxuUfQGZqCig26&@`+^M5 z;`P{c%6gn|Lzz=E6gBt23w&Ya?MYoFn=}EdZc+K z`*E`%q4B9M@F?Pft-;1 zy3eQrnFmlAcF9f?~C=mkb1i~l$PR1>92OdbI zjxiS6=65TMQsNxfM^r9!p&k#RfrGt3*9%sjkWOjYUOKZcObJh9W(*OTK#+@rT5H*% zyYD%(QR7AF=(o5%NfXD})HcsFLQ?!0#E=uUaZE=Y_Db+?`kxKLc$A^-myWf4Ih2c8 QV;@(@2=$5oVl3(S4+(UTng9R* literal 0 HcmV?d00001 diff --git a/module/Application/language/cs_CZ.po b/module/Application/language/cs_CZ.po new file mode 100644 index 00000000..2485e2d6 --- /dev/null +++ b/module/Application/language/cs_CZ.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-06 13:05+0100\n" +"Last-Translator: David Lukas \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Czech\n" +"X-Poedit-Country: CZECH REPUBLIC\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton aplikace" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Úvod" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Všechna práva vyhrazena." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Vítejte v %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Blahopřejeme! Úspěšně jste nainstalovali %sZF2 Skeleton Application%s. Právě používáte Zend Framework verze %s. Tato kostra aplikace vám poslouží jako jednoduchý výchozí bod, ze kterého můžete vyjít při tvorbě vlastní aplikace nad ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 na GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Sledujte vývoj" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 je aktivně vyvíjen. Chcete-li sledovat vývoj ZF2, máte na oficiálních webových stránkách Zend Framework k dispozici zvláštní portál ZF2, na kterém najdete odkazy na ZF2 %swiki%s, %svývojářský blog%s, %sissue tracker%s a mnoho dalšího. Tento portál je skvělý zdroj aktuálních informací o nejnovějším vývoji!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Vývojářský portál ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Objevte Moduly" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Komunita pracuje na vývoji komunitního webu, který bude sloužit jako archiv a galerie modulů ZF2. Tento projekt je dostupný %sna GitHub%s. Web je aktuálně v provozu a obsahuje seznam některých již dostupných modulů ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Prozkoumejte Moduly ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Pomoc & Podpora" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Budete-li při vývoji se ZF2 potřebovat jakoukoli pomoc nebo podporu, můžete nás zastihnout přes IRC: %s#zftalk.2 na Freenode%s. Budeme rádi za jakékoli vaše otázky nebo připomínky týkající se beta verzí. Případně se také můžete přihlásit k odběru a posílat otázky na naše %se-mailové distribuční seznamy%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Ozvěte se nám na IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Vyskytla se chyba" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Další informace" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Soubor" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Zpráva" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Trasování zásobníku (Stack trace)" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Předchozí výjimky" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Žádná výjimka není k dispozici" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Vyskytla se chyba 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Požadovaný controller nemohl vyřídit požadavek." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Požadovaný controller se nepodařilo namapovat na žádnou existující třídu controlleru." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Požadovaný controller nepodporuje vyřízení (controller not dispatchable)." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "S požadovaným URL nebyla při směrování (routing) nalezena shoda." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Momentálně nedokážeme určit, proč byla vygenerována chyba 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "je mapován na %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Výjimka" + diff --git a/module/Application/language/de_DE.mo b/module/Application/language/de_DE.mo new file mode 100644 index 0000000000000000000000000000000000000000..fcea0366faf48b28a5e7b083f717dc36c6dda9c4 GIT binary patch literal 5126 zcma)3*uf4mr6|b{+*LLC)HQhBcmFejo zs;XzatB4a42M!=15C;Sj%00lr;$U$Zi4zClP7rsH5H}7;{9bj>&UlFvTD$Y6yQ|*c z?|t>=?Gwj-oNztQ|7ZDs`h7|ACFJq<^TG8i@|R5bIEfE$AV0+Y4?kGj{VDP( z?%zU+zTY7~g8VZwVg1|4Rlff9i6q%Zo?vqu`7PuHzG6B0r7%0#aOD zLw*u@38|2GkP^oPDf_>Vd;@(yLE>U^@?-V7=aA2Fe*r0Zd$o}Rl$yDeYb=u$CT2;FPlbcW$YJD`yZ5kDv_U))a zJENk1MPRq9iozB>bs!{ zvUxu>qnNtQ`=h)h010yTcFX1_*|M3tTGdIenS7+q z=;7!kwOfrwr3=Zma%ht4-ROH^NU1LNRbSQ-kgpf1NgsnMt1U@P6C3*C(Q@23)MVA@ zw67|!##XEAx2~*_$S)prsnehxUD$HQ6lG>4zjw_GnaT-R($zPb{9yIlmGKg?7t>vQ z>F9KDXduGCnVxnrt5W%n2^zz>(cYkSJrBkeRGx(F&pq>1$EVJA3`R1l<->v{?AI6? zYMV=Bx%I*0W3mn0bk8I=OLbTbrN=DO9kRb8iwT$H5^b{M%-ELPn_1y}vKz$z;B;z| zJ={&p;jk)f0Ki@e=0pYi7xJnX7I_Q|TQ`Wb$}?4zfjTO9BJJ~{1Cq*0`s(NwaiQ*(qdP|f6a(imi*N)PTvMEl6l! z4S5chyiNKfDe|XS@0r3td%}r#O%6<=YIyBYhFU%C6DjjT$EzKBSm(*nl~T~E$RHG* zNnbgAb;*wAaUjdhF zEW2G>zj`!)iRnbNK__qp03F-Rco0<#$V=UcqV2Sw*nvImm-&Vhs*{(!`p$Y^ksMlT zV4OUXmL67U8^VzdaYyfZATh{c1N){X;t-}8YvpULl^50OSJuwG$oG{M7PfA|C~_hlUH4VBa(?aX`FhB191 z>DJWdm^QdV(EIAb&|EUy(r9kK4XnPgbVC=t3RY|F89l`NEtb+&wo|d$s|yF+76}i$ zymUbA9^Hih+t;@@=fR(CuPn)a0Mgpq9}!G2_rsS*IaKkIqLZ9A;o|MRt=9SZI`Oq@ zTx%1*gvr;``Hl@sueNqd!|c#{+3drOnZH3Nqp%6h%okjS?P=8hnrhD<&H`IgSLruh z%-@g;BHZW2=B@4Zo3G8^>~ip={T)=bR#4VnN;WAqji?O0Aj8d;=|iweSKZ`Z<)?3k z14awba{bZK#;98+?E|NA={lybIfsgNvWb#Lflww&dL}sdpx_*KwI)vHeEKjQOsc}C z{Zne!8s?pj;ZWe)yG=HXPIN0MmsV;9B5PcbwuexQDo{X}#p#SrMp*+{l!9`9WJ=)l z+^`I0UeY&xh`R&$OI`05DABoB1Ou^}o*z}kAS|oy^r7Q5Tre>lAjr)kOl&&HtD?88 zI@;rmbU$HZZ+OI>VsgMKv_CQip(8W2b`cX%Pdmwa;VxRPBMk%~osuEnLVn_dKgQ|n~AW9(6zYG{Q> z{x@VP%k)98(EYL+$cZ{2rDQ2;2LUQ8DJJ0S$}BZ~*ddsV^Wi7GfLp9+q0m^)ZOl_bd_9;xjFHCpF3YIZK&a6%eSp%% zsY?x}4+;T{pg3x*L40Ji!eYq;9s?J!Mzf7?8KlW%ZJ297#P<}*zjQ~kiH zBBvjWDzgRF-NK?>S+WfNbD;!jlB*iFKv8UtIY1-QId+>4i^s@72D3mj&Y?(S&O?f; znUgyahH)+4V$rKt3Jy#Y`yAi;(>L=-SVjqBGD(3xxP+q^ZPN!`3LONng5tViIOnB% z1zAVuhIXWC*z z{JHapDoN?#WcPB;tY&~{&tSTs0{@RX$z&lR3fs7<3nbp%{)Ar~^#(Xvn&1YV5m|D* z=t`GJlaRg!2SjtPlGi?VwGEL3V^LsCX}Mb2aQdL`7j2Xdu=5|GoCSZz1id-QZ3S325l6x zfl%lh9D(^r)QgLxl=\n" +"Language-Team: ZF Contributors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Startseite" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Alle Rechte vorbehalten." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Willkommen zu dem %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Herzlichen Glückwunsch! Sie haben die %sZF2 Skeleton Application%s erfolgreich installiert und benutzen gerade die Version %s des Zend Frameworks. Dieses Gerüst kann Ihnen als Einstiegspunkt, für Ihre weitere Entwicklung, basierend auf dem Zend Framework 2, dienen." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 auf GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Folge der Entwicklung" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Das Zend Framework 2 wird z.Z. aktiv weiterentwickelt. Sollten Sie daran interessiert sein, die Entwicklung von ZF2 zu verfolgen, so bietet Ihnen die offizielle Webseite einen eigens für das Zend Framework 2 eingerichteten Bereich, auf der Sie Verlinkungen zum ZF2 %sWiki%s, %sEntwickler Blog%s, einem %sFehlerverfolgungssystem%s und noch vielem mehr finden. Dieser Bereich ist eine hervorragende Quelle um stets aktuell zu bleiben." + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Entwickler Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Entdecken Sie Module" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Die Community arbeitet momentan an einer Community Seite, welche als Galerie für ZF2 Module dient. Dieses Projekt ist %sauf GitHub%s verfügbar. Die Webseite ist bereits Online und enthält eine Liste mit schon veröffentlichten Modulen für das Zend Framework 2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Erkunden Sie ZF2 Module" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Hilfe & Support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Sollten Sie Hilfe jeglicher Art bei der Entwicklung mit dem Zend Framework 2 benötigen, kontaktieren Sie uns doch einfach über das IRC: %s#zftalk.2 on Freenode%s. Wir freuen uns darauf, Ihnen bei Ihren Fragen zu helfen oder aber auch Ihre Meinung bezüglich der Beta Versionen zu hören. Alternativ können Sie auch die %smailing lists%s abonnieren und Ihre Fragen dort stellen." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Schreiben Sie uns im IRC an" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Ein Fehler ist aufgetreten" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Zusätzliche Information" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Datei" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Meldung" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stapelüberwachung" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Vorherige Ausnahme" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Es ist keine Ausnahme verfügbar" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Es trat ein 404 Fehler auf" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Der angeforderte Controller war nicht in der Lage die Anfrage zu verarbeiten." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Der angeforderte Controller konnte keiner Controller Klasse zugeordnet werden." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Der angeforderte Controller ist nicht aufrufbar." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Für die angeforderte URL konnte keine Übereinstimmung gefunden werden." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Zu diesem Zeitpunkt ist es uns nicht möglich zu bestimmen, warum ein 404 Fehler aufgetreten ist." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "wird aufgelöst in %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Ausnahme" + diff --git a/module/Application/language/en_US.mo b/module/Application/language/en_US.mo new file mode 100644 index 0000000000000000000000000000000000000000..972a28ab34c2f0d90cabf56f0d021c5f205bbc09 GIT binary patch literal 545 zcmaJ+O;5r=5XI=JN6#Mi;L*WCV!(=quaXc!i4ehb)vOfK!O`$uD#=6e|OmacsLHr?6s=z73-+k!ZznDgs*g(XHw}45ig~6 zNSCu{0L@ZYSY4onkZmPOr-5kB6?qRZF_\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: English\n" +"X-Poedit-Country: UNITED STATES\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "" + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "" + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "" + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "" + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "" + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "" + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "" + diff --git a/module/Application/language/es_ES.mo b/module/Application/language/es_ES.mo new file mode 100644 index 0000000000000000000000000000000000000000..3728554767333faa67772174898cf3de1d245970 GIT binary patch literal 5063 zcmai&&5s;M8OAG+@UaO55=@*)yz{h}at&GPZZ|3a_*Bt}$2$siwPjro25} z?XK=w&x!+QB*X>&fJh*bgQZB303jq0djJjyP8@TMgv5~pT;TUs_k8SPk&$QLsp+cs z`+e#ezx~vsKT*6i@8{(Gh*D=nzK1`&{)qe-@=wT*Bj0Y<|3rS2_0oHl`Umnk6?8-$U|G{fIwLCLWcjV*9{~#6T9)F)wt9*Qd!&}I&A-l*QA}=C;gS>$J7gFqh`2&sq9po*} z-$ja@-{Jf_tp9@i1nXa7MB@J|^3%w7kYfL_CzSd(@>!(Bf9gX`UNlnHt4PV~B_t-* z9i*J=BhMlakP^>Nk+`mYg?tUWzeURaC!bVm8TkzI6!H>M{Mc#NcahJt{yy?W&ixE2 zasHVi>>!sY(i!A;k>`;=Kwd%~AwP$Fgkp$)&m$|&_mEP*U*Hr=MVX@?h?p;t518Et&aZX6{pKO&s{#ycWj>Ojna(lfiL&<*p>lTQPBEzG~l$Gcyyvr+1ta^gCmDhbcaJlZ+E=%P(-CI_^vV9VY$jZiOSEdc zv}5O4+iBr~dRR-Uol1hLN|RW%OALu0jq2Q0bal|uh@uyz3&}PMn}Vxi(iZx$w8Z2p zUru6x1DOmyOG8S}jGB&;rnb5${au?>Vrv!(g_?Cp)BH5Im|@d=YBI7K_0PXb=wHJu zG82+D?e}z`n?y=ZTf^F9^hSzv)7(v6>&66>HrAcayLIzAk=9wNb6-(h4R|C&9`tE1 zU(2waJR&YMBXsg)Q3yPET&5&=Cuv>WotZ$9B`0$S7M>q4>f%M}LLpvA&EI8voy#V% zIXx89(5mmM+Z5a6QK_X-M=mF!6?@2Y<;dH?kR(M=73%|=Td+`o^0v)rlc*Z7I}Tf` z%Rxz*7hphdGuS3mCwEFg>pTTzOd>-v?JbEaM(($piRx^ooo_Zb$XZ0;>F_UHM@u)E)UxVq zg@H>um+L|3?D{pmwEfy{=Zbg+_I0jeb4{AWeb-H>I=iLG0}=RgP4`lt?RnkfW*X>=Ca#PuUL6STb?L6JE?qbIpa$_e zyVi^dVnbh%>2m!V9YJ3_-0P6{iifWrQo`oY*5=mwJn(bfl_fbub98nm1%Xude)Xjy z114V4Oi>wZb?MgbM(6x|pZK|F%g%b9c!BmceZKFinL8xtTb*rh;T4^4*a;AshU*M8 zy4wite8XjK0_JtNrn~bmr-7~Mox2YB{YS*WpF6Pa^*<{FvhWU{F@K9~)_pfhQ zsEgxJfRSIUxg0>cO+d4S-3?IF0+PE@~@aN9ttMOqmncLkSeVEfT03 z?BkH(0xpjpkPl0674)NkAyF7?W2iRSz1s0)My60UV}07oO?Ncm zHPPt;N~gboXH#PKMRh%LE_hjL(x!@nHhpt9R5{gSN9G0Rmnq4cw`NxZSS<{-v`(%P zS|iL*a=v?N<7~s3rAekN&W4uRE!4jq!Fk{Lmf}4GUU6RVC=xun&*p#*^=N_N_Ke!G zkICkKdopwAcf0Seg)yR`Y-=!Naz3n literal 0 HcmV?d00001 diff --git a/module/Application/language/es_ES.po b/module/Application/language/es_ES.po new file mode 100644 index 00000000..5170d3ce --- /dev/null +++ b/module/Application/language/es_ES.po @@ -0,0 +1,111 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-06 19:07+0100\n" +"PO-Revision-Date: 2012-07-06 19:09+0100\n" +"Last-Translator: Adolfo Abegg \n" +"Language-Team: ZF Contributors \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: Spanish\n" +"X-Poedit-Country: SPAIN\n" +"X-Poedit-SearchPath-0: ..\n" + +msgid "Skeleton Application" +msgstr "Aplicación Esqueleto" + +msgid "Home" +msgstr "Inicio" + +msgid "All rights reserved." +msgstr "Todos los derechos reservados" + +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenido al %sZend Framework 2%s" + +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "¡Felicitaciones! Haz instalado correctamente el %sla aplicación esqueleto del ZF2%s. Estás corriendo la versión %s del Zend Framework. Este esqueleto te servirá como un punto de inicio sencillo para empezar a construir tu aplicación con el ZF2." + +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Hacer un Fork del Zend Framework 2 en GitHub" + +msgid "Follow Development" +msgstr "Seguir el Desarrollo" + +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "El Zend Framework 2 está en pleno desarrollo. Si estás interesado en seguir el desarrollo del ZF2, existe un portal especial para el ZF2 en el sitio web oficial del Zend Framework el cual provee enlaces %sa la Wiki%s, %sal Blog de desarrollo%s, %sal issue tracker%s y mucho más. Este es un gran recurso para mantenerte al día con los últimos avances en el desarrollo!" + +msgid "ZF2 Development Portal" +msgstr "Portal de Desarrollo del ZF2" + +msgid "Discover Modules" +msgstr "Descubre Módulos" + +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La comunidad está trabajando en el desarrollo de una web comunitaria que servirá de repositorio y galería de los módulos del ZF2. El proyecto está disponible %sen GitHub%s. El sitio web está en línea y actualmente posee una lista de algunos módulos que ya están disponibles para el ZF2." + +msgid "Explore ZF2 Modules" +msgstr "Explora los módulos del ZF2" + +msgid "Help & Support" +msgstr "Ayuda & Soporte" + +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si necesitas alguna ayuda o soporte mientras estás desarrollando con el ZF2, puedes encontrarnos via IRC: %s#zftalk.2 en Freenode%s. Nos encantaría leer tus preguntas o cualquier feedback que puedas tener en relación a los lanzamientos de las versiones beta. También puedes subscribirte y enviar preguntas %sa la lista de correos%s" + +msgid "Ping us on IRC" +msgstr "Escríbenos en el IRC" + +msgid "An error occurred" +msgstr "Ha ocurrido un error" + +msgid "Additional information" +msgstr "Información adicional" + +msgid "File" +msgstr "Archivo" + +msgid "Message" +msgstr "Mensaje" + +msgid "Stack trace" +msgstr "Seguimiento de la pila (stack trace)" + +msgid "Previous exceptions" +msgstr "Excepciones anteriores" + +msgid "No Exception available" +msgstr "No hay ninguna Excepción disponible." + +msgid "A 404 error occurred" +msgstr "Ha ocurrido un error 404" + +msgid "The requested controller was unable to dispatch the request." +msgstr "El controlador solicitado no pudo ejecutar la petición." + +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "El controlador solicitado no se pudo mapear con una clase de controlador existente." + +msgid "The requested controller was not dispatchable." +msgstr "El controlador solicitado no es ejecutable." + +msgid "The requested URL could not be matched by routing." +msgstr "El ruteador no ha encontrado la ruta para la URL solicitada." + +msgid "We cannot determine at this time why a 404 was generated." +msgstr "No pudimos determinar por qué un error 404 ha sido generado." + +msgid "Controller" +msgstr "Controller" + +msgid "resolves to %s" +msgstr "se resuelve a %s" + +msgid "Exception" +msgstr "Excepción" + diff --git a/module/Application/language/fr_CA.mo b/module/Application/language/fr_CA.mo new file mode 100644 index 0000000000000000000000000000000000000000..956a0d9d90577e1c8366e18ddc2efc7397c014ef GIT binary patch literal 5074 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\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: CANADA\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Une erreur 404 est survenue" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Le contrôleur demandé n'a pas pu acheminer la requête." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Le contrôleur demandé ne correspond pas à une classe contrôleur existante." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Le contrôleur demandé ne peut être acheminé." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "L'URL demandée n'a pas pu trouver de route correspondante." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nous ne pouvons pas déterminer pour le moment pourquoi une 404 a été générée." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Contrôleur" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "résout en %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exception" + +#: ../view/error/404.phtml:55 +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +msgid "Stack trace" +msgstr "Pile d'exécution" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Une erreur est survenue" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informations complémentaires" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Fichier" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Message" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Exceptions précédentes" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Aucune exception disponible" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenue dans %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Félicitations ! Vous avez installé %sZF2 Skeleton Application%s avec succès. Vous utilisez actuellement Zend Framework version %s. Cette structure peut vous servir comme point de départ simple pour démarrer la construction de votre application avec ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Faites un Fork de Zend Framework 2 sur GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Suivre le développement" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 est en cours de développement. Si vous êtes intéressé pour suivre l'évolution de ZF2, il existe un portail dédié à ZF2 sur le site officiel Zend Framework qui propose des liens vers le %swiki%s ZF2, le %sblogue de dev%s, le %ssuivi des problèmes%s, et bien plus encore. Il s'agit d'une excellente ressource pour rester à jour sur les dernières évolutions !" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portail sur le développement de ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Découvrez les modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La communauté travaille sur le développement d'un site communautaire avec l'objectif de servir de dépôt et de galerie pour les modules ZF2. Le projet est disponible %ssur GitHub%s. Le site est déjà en ligne, et contient une liste non exhaustive des modules déjà disponibles pour ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Explorer les modules ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aide & support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si vous avez besoin d'aide ou de soutient en développant avec ZF2, vous pouvez nous joindre sur IRC : %s#zftalk.2 sur Freenode%s. Nous aimerions connaître vos questions ou les commentaires que vous pourriez avoir au sujet des versions beta. Sinon, vous pouvez vous abonner, et poser des questions sur la %sliste de diffusion%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Rejoignez-nous sur IRC" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Accueil" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tous droits réservés." + diff --git a/module/Application/language/fr_FR.mo b/module/Application/language/fr_FR.mo new file mode 100644 index 0000000000000000000000000000000000000000..28f1932ad37233a88a93cdd0dc86a9c817716d66 GIT binary patch literal 5077 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 literal 0 HcmV?d00001 diff --git a/module/Application/language/fr_FR.po b/module/Application/language/fr_FR.po new file mode 100644 index 00000000..49f89d92 --- /dev/null +++ b/module/Application/language/fr_FR.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:32-0700\n" +"PO-Revision-Date: 2012-07-05 23:36-0700\n" +"Last-Translator: Evan Coury \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: FRANCE\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Accueil" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tous droits réservés." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenue dans le %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Félicitations ! Vous avez installé avec succès le %sZF2 Skeleton Application%s. Vous utilisez actuellement Zend Framework version %s. Cette structure peut vous servir comme un point de départ simple pour démarrer la construction de votre application avec ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Faites un Fork de Zend Framework 2 sur GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Suivre le développement" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 est en cours de développement. Si vous êtes intéressé pour suivre l'évolution de ZF2, il existe un portail dédié à ZF2 sur le site officiel Zend Framework qui propose des liens vers le %swiki%s ZF2, %sdev blog%s, %ssuivi des problèmes%s, et bien plus encore. Il s'agit d'une excellente ressource pour rester à jour sur les dernières évolutions !" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portail sur le développement de ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Découvrez les modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La communauté travaille sur le développement d'un site communautaire avec l'objectif de servir de dépôt et de galerie pour les modules ZF2. Le projet est disponible %ssur GitHub%s. Le site est déjà en ligne, et contient une liste non exhaustive des modules déjà disponibles pour ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Explorer les modules ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aide & support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si vous avez besoin d'aide ou de support en développant avec ZF2, vous pouvez nous joindre sur IRC : %s#zftalk.2 sur Freenode%s. Nous aimerions avoir vos questions ou vos commentaires que vous pourriez avoir au sujet des versions bêta. Sinon, vous pouvez vous abonner, et poser des questions sur la %sliste de diffusion%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Rejoignez-nous sur IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Une erreur est survenue" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informations complémentaires" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Fichier" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Message" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Pile d'exécution" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Exceptions précédentes" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Aucune exception disponible" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Une erreur 404 est survenue" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Le contrôleur demandé n'a pas pu dispatcher la requête." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Le contrôleur demandé ne correspond pas à une classe existante de contrôleur." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Le contrôleur demandé n'est pas dispatchable." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "L'URL demandée n'a pas pu trouver de route correspondante." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nous ne pouvons pas déterminer pour le moment pourquoi une 404 a été générée." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Contrôleur" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "résout en %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exception" + diff --git a/module/Application/language/it_IT.mo b/module/Application/language/it_IT.mo new file mode 100644 index 0000000000000000000000000000000000000000..3656ac349512a2f60b0ea2ad8658554c27c13cdf GIT binary patch literal 4922 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\n" +"Language-Team: ZF Contributors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,-1,5,-1,-1,-1\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Pagina iniziale" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tutti i diritti sono riservati." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Benvenuto in %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Congratulazioni! Hai appena installato con successo %sZF2 Skeleton Application%s e stai utilizzando la versione %s di Zend Framework. Questa struttura può servirti come semplice punto di riferimento per iniziare a costruire un'applicazione basata su ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Crea un fork di Zend Framework 2 su GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Segui lo sviluppo" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 è in forte sviluppo. Se sei interessato a seguire lo sviluppo di ZF2, è presente un portale che fornisce link al %swiki%s, al %sdev blog%s, all'%sissue tracker%s e a molto altro riguardo a ZF2. Il Portale è un'ottima risorsa per rimanere aggiornati con gli ultimi sviluppi!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portale sullo sviluppo di ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Scopri i Moduli" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La community sta lavorando allo sviluppo di un sito che deve servire come raccolta e gallery di Moduli per ZF2. Il progetto è disponibile %son Github%s. Il sito è visitabile e al momento contiene una lista di alcuni dei Moduli già disponibili per ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Esplora i Moduli di ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aiuto & Supporto" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Qualora ti servisse aiuto o supporto mentre sviluppi con ZF2, puoi contattarci tramite IRC: %s#zftalk.2 on Freenode%s. Ci piacerebbe moltissimo ricevere le tue domande o qualunque feedback tu possa avere riguardo alle beta release. In alternativa, puoi iscriverti e inviare domande alla %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Contattaci su IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Si è verificato un errore" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informazioni aggiuntive" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "File" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Messaggio" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Eccezioni precedenti" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Non è disponibile alcuna eccezione" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Si è verificato un errore 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Il controller richiesto non è stato in grado di elaborare la richiesta." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Non è stato possibile mappare il controller richiesto ad una classe di tipo controller." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Il controller richiesto non è un oggetto dispatchable." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Non è stato possibile effettuare il match dell'indirizzo richiesto tramite routing." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "In questo momento non siamo in grado di determinare perchè sia stato generato un 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "viene risolto in %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Eccezione" + diff --git a/module/Application/language/ja_JP.mo b/module/Application/language/ja_JP.mo new file mode 100644 index 0000000000000000000000000000000000000000..66b6f3ccb4213eae7758f2b6cd6bfb94f6f23a06 GIT binary patch literal 5185 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 literal 0 HcmV?d00001 diff --git a/module/Application/language/ja_JP.po b/module/Application/language/ja_JP.po new file mode 100644 index 00000000..d6a953ee --- /dev/null +++ b/module/Application/language/ja_JP.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 19:30-0700\n" +"PO-Revision-Date: 2012-07-15 08:20+0900\n" +"Last-Translator: sasezaki \n" +"Language-Team: Japanese\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Japanese\n" +"X-Poedit-Country: Japan\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "%sZend Framework 2%s へようこそ" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "おめでとうございます! %sZF2 Skeleton Application%s のインストールに成功しました。 あなたは Zend Framework version %s を動作させています。このスケルトンはZF2上でのアプリケーション構築を始めるためにシンプルなスタートポイントを提供します。" + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "GitHub で Zend Framework 2 をフォーク" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "開発を追う" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 は鋭意開発中です。ZF2の開発進行にご関心がおありでしょうか、Zend Framework公式ウェブサイト上ではZF2特別ポータルがあり、 %swiki%s、 %sdev blog%s、 %sissue tracker%s、 などのZF2関連のものを提供しています。最新の開発状況に追随するためのすばらしいリソースです。" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 開発ポータル" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "モジュールを見つける" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "コミュニティーはZF2モジュールのためのリポジトリとギャラリーを提供するコミュニティーサイトを開発中です。プロジェクトは %s GitHub%s で利用可能です。サイトは現在運営されており、ZF2ですでに利用可能なモジュールのリストを持っています。" + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "ZF2モジュールを探す" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "ヘルプとサポート" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "ZF2 で開発中に何らかのお手伝いやサポートが必要な場合、IRC を通じて私たちと連絡することができます。: %s#zftalk.2 on Freenode%s ベータ版についてあなたが抱えるかもしれない質問やフィードバックを何でも聞きたいと望みます。あるいは、%smailing lists%s を購読したり質問をポストしたりできます。" + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "IRC で呼び出す" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "エラーが発生しました" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "追加の情報" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "ファイル" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "メッセージ" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "スタックトレース" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "前の例外" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "例外が利用できません" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "404エラーが発生しました" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "要求されたコントローラはリクエストをディスパッチできませんでした。" + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "要求されたコントローラは存在するコントローラクラスにマッピングできませんでした。" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "要求されたコントローラはディスパッチ不可能でした。" + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "要求されたURLはルーティングにマッチしませんでした。" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "404が生成された理由について現時点で判断できません。" + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "コントローラ" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "%s に解決" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "例外" + diff --git a/module/Application/language/nl_NL.mo b/module/Application/language/nl_NL.mo new file mode 100644 index 0000000000000000000000000000000000000000..a03a3328cfb393bb53fab0b04298f56255c8086f GIT binary patch literal 4815 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 literal 0 HcmV?d00001 diff --git a/module/Application/language/nl_NL.po b/module/Application/language/nl_NL.po new file mode 100644 index 00000000..fa97eae1 --- /dev/null +++ b/module/Application/language/nl_NL.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-24 12:48+0100\n" +"Last-Translator: Walter Tamboer\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Dutch\n" +"X-Poedit-Country: NETHERLANDS\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Applicatie Fundering" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Home" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Alle rechten voorbehouden." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Welkom bij %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Gefeliciteerd! Je hebt de %sZF2 Applicatie Fundering%s succesvol geinstalleerd. Je gebruikt Zend Framework versie %s. Deze fundering biedt je een startpunt om je ZF2 applicatie op voort te bouwen." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 op GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Volg de Ontwikkeling" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 wordt actief ontwikkeld. Als je interesse hebt in het volgen van deze ontwikkelingen dan kun je de ZF2 portaal bezoeken op de officiële website van Zend Framework. Daar staan links naar de ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s en nog veel meer. Het is het perfecte middel om up-to-date te blijven met de ontwikkelingen." + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Ontwikkelaars Portaal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Ontdek Modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "De community werkt aan een eigen community website die dient als een bewaarplaats en galerij voor ZF2 modules. Het project is beschikbaar %sop GitHub%s. De site staat op dit moment live en bevat een lijst met modules die op dit moment beschikbaar zijn voor ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Verken ZF2 Modules" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Hulp & Support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Als je hulp nodig hebt tijdens het ontwikkelen met ZF2, dan kun je ons bereiken via IRC: %s#zftalk.2 op Freenode%s. We beantwoorde met alle liefde je vragen en zouden graag feedback krijgen betreffende de beta releases. Je kunt je ook abonneren op de %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Ping ons via IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Er is een fout opgetreden" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Additionele informatie" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Bestand" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Bericht" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stack trace" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Vorige excepties" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Geen exceptie beschikbaar" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "De pagina kon niet worden gevonden." + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "De opgevraagde controller kon deze aanvraag niet verwerken." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Er is geen mapping beschikbaar voor de opgevraagde controller." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "De opgevraagde controller is niet bruikbaar (dispatchable)." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Er is geen route gevonden die overeenkomt met de opgevraagde URL." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "We kunnen op dit moment niet achterhalen waarom de pagina niet kon worden gevonden." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "verwijst naar %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exceptie" + diff --git a/module/Application/language/pl_PL.mo b/module/Application/language/pl_PL.mo new file mode 100644 index 0000000000000000000000000000000000000000..0df3fc6d1c60bd28da8262ba9698a293a35d4155 GIT binary patch literal 4934 zcmb7`PmCm09mh)r(EsytZD| z6xHG4#*G(^7d@BiGwHn{9biW&yFO7N_T&|s^0JS zet*C3_x3%v{UYL0d>@qW$D-&l!H@I9^=I%4;9tNmf^X07-vd9-{mLhz=-=Rj;ELSe z7Db-}?*l&#J_6ngu7P}_GyL2Go&&!Qet&-d7RV?189(=8!_UDxxc~L--M+sCKg0c> zK+*RPQ0#gKyc2vMjF7wYlTozJ-@6dL06q)$!JmT9fH%NzgZ~9(|HnVo>E8igMScv* zK7Yjc|8W0T@ILPUz$UWa-$9AfJD~V~$6ZnMH}C;a{CyV``S(CnMYrAE`Fl4g{weUQ z;41hqcp4PFL-4cUTi`DH{sa_#|3cXV;Je`0z}s0Q@%zRcp9IDK7s30HdkuV+`+_8F zgTDdS!1qCk%NjiZ!I4*tK z6~j_jbrz)jL+W)`tC8L}%GYshyx*&{tVOf0be5S!RU@NT{To~BY9}?Bsa&BpCzH&^ zLBXo;2MxM3D%e+4NSAd{*kY*OFh!!aN}Zd=m8se{rN>m%_0{gkdgT`yV_m3Vv(jE^ z*VY9#A$$ajlWGh#!PbUTSpjjcvv z(TO0JYocm&JW{n+`&O%S7f){x$cLwUP;Po?qL-aIOor0?EYky`zb%V#m*C=Uv|XBg>$o?I z#QErhN;2B1#Hp&(v59u^A$ECQ7q+6Ry^=x{y(m2rY<*;rw^az*k$Nl*KH18ZZE$cX zoxy)8NU52;t0*aIqb8*ro4As_4qYKphZWKlKgBKEuxQye8Bq=TmycrVSJR91ghWlb zJ>{t;L5b;nW2G}{Bf+>u>=vf=LjXz>@=oQwdhtA-)>)zoSCL!=dBh`L3@9&GOS2sp z5fi!=Ixabx2t7DVCM8%WVLiG!)1D+tOqK>5dEe0LVnt&8M68gUf5`H>kVUfRLMVh` zuD%~#BH6kKN)3gY+k${rtRc>oC2q}#AO%vD-G``bg4z zga*_$jjglj_)1A=T_muKj-^Q!H73;2S91;!u7uAFG|k@pC0oKX5sX5*;{z z=OPuzabjW%`HM-yFZ`vrM9}T++3wY?4m4&!dc=DRfl#3PHZh)xDpKOowWnxX^^HyK zsz1R$j8KEj4ZAz*eNAv^snnG6Ncudl(UwD;b2bmw4XMORP9P{bHlYro@m74RCn0kL zydyU;nPZ439Cg`06p3`UkA>Jq?6YYn^uXQKLMquDY^B*~mRxZ-1W!1ajhc@Y* zs)xR}>o(NN_A9%+(_$Ii*E_?W8)|*+rb-p zB3=w@sIRwcbdEP$>NIU;2Q|99dS<%UBmNcdo|}?N5nIaO&V_Rq&MsqdvcI+>;?zrT zx1HcyW!|j5Imuv-rxlG=dQ*Mp)!nV$Q_FQ?`kpC!XN%Yg+i$3+2DV!HUT@nO=8N7- zriCgKf1b)g;oMWRT(EFqgI<7}M$0#+T@7Wlym;mO=F4Z6FHUiY(CVWN)n7i`;cSXW z+dS^A@uI&HU21)GaAjg=m(^f)`QS<-4I7 zs%JM^xMX^KCTLVct&S~F1I*8KDbhu^w@Keinh@b z&3?&rH~XDLjy}Zz#=@LrxAC-)$)`-~@o}ftW#4Yld6e_nDZc&~^d4b=Z<>3`I%tRf>9scJQedo z3(kHIMagij6ArF0VoB!mo7aah*c8ikfFZgb3--3Xpq_IO!56e6QbTv~=E zXGPWKs?<{mmGH#Vt{}shCFVnChkOn_+e(jBBTReixbjivt&q}2&ZiXik>t{0k{&6~ z1%1p}jmLd8=Od95nit*=lUNsCTE;Angt1s(x@qIa^$Cf(1Rdh;#xHU)AHL+AAT5sB zYs{Ho#$CB#%`v}N)YTNxS#+%OSKEe>@2sORUslxBU)!2;1KWd!0X?Bel m73B>rjlHx=%QNxL1`-$-PS}moveXqb7miASb}fw+(f\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Polish\n" +"X-Poedit-Country: POLAND\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Szkielet Aplikacji" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Strona startowa" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Wszelkie prawa zastrzeżone." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Witaj w %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Gratulacje! Z powodzeniem zainstalowałeś %sZF2 Skeleton Application%s. Aktualnie używasz Zend Framework w wersji %s. Ten szkielet może służyć jak prosty punkt startowy do budowy Twoich aplikacji na ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Forkuj Zend Framework 2 na GitHub'e" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Śledź prace programistyczne" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 jest w trakcie aktywnych prac programistycznych. Jeśli jesteś zainteresowany śledzeniem jego rozwoju, istnieje specialny portal ZF2 na oficjalnej stronie Zend Framework na którym dostępne są linki do ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, oraz wiele więcej. Jest to świetne miejsce by śledzić najnowsze zmiany!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Development Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Odkryj Moduły" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Społeczność pracuje nad stworzeniem społecznościowego serwisu który posłuży jako repozytorium i galeria dla modułów ZF2. Projekt wkrótce będzie dostępny na %son GitHub%s. Ta strona jest aktualnie online i udostępnia listę niektórych modułów dostępnych dla ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Odkryj Moduły ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Pomoc & Wsparcie" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Jeśli potrzebujesz jakiejkolwiek pomocy lub wsparcia podczas programowania na ZF2, możesz skontaktować się z nami via IRC: %s#zftalk.2 w sieci Freenode%s. Z przyjemnością wysłuchamy wszelkich pytań lub sugestii które możesz mieć odnoście wydań beta. Alternatywnie, możesz zapisać się i wysłać pytanie na %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Wyślij nam wiadomość na IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Wystąpił błąd" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Dodatkowe informacje" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Plik" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Komunikat" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stack trace" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Poprzedni wyjątek" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Brak dostępnego wyjątku" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Wystąpił błąd 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Żądany kontroler nie mógł zmapować żądania." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Żądany kontroler nie mógł być zmapowany na isteniejącą klasę kontrolera." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Żądany kontroler nie mógł zostać zmapowany." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Żądany adres URL nie mógł zostać powiązany z routing'iem." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nie możemy określić tym razem dlaczego wygenerowano błąd 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Kontroler" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "rozwiązuje na %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Wyjątek" + diff --git a/module/Application/language/tr_TR.mo b/module/Application/language/tr_TR.mo new file mode 100644 index 0000000000000000000000000000000000000000..952882142e8f6f0863f0fb0c08efdf31590512d3 GIT binary patch literal 4785 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\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Turkish\n" +"X-Poedit-Country: TURKEY\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Anasayfa" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tüm haklar saklıdır." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "%sZend Framework 2%s'a hoş geldiniz" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Tebrikler! %sZF2 Skeleton Application%s'u başarıyla yüklediniz. Şu anda Zend Framework %s sürüm ile çalışıyorsunuz. Bu iskelet ZF2 üzerinde uygulama oluşturmak için basit bir başlangıç ​​noktası olarak hizmet verebilir." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Zend Framework 2'yi GitHub'da fork edin" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Gelişimi izleyin" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 aktif geliştirilmektedir. Eğer ZF2'nin gelişimi ile ilgileniyorsanız, ZF2 için resmi Zend Framework websitesinde özel portal mevcut, orada ZF2 %swiki%s'ye, %sDEV blog%s'a, %ssorun takibi%s'ne bağlantılarını ve çok daha fazlasını sunar. Bu son gelişmeler ile güncel kalmak için büyük bir kaynaktır!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Development Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Modülleri keşfedin" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Topluluk ZF2 modülleri için bir depo ve galeri olarak hizmet edecek bir topluluk sitesi geliştirme üzerinde çalışıyor. Proje %sGitHub%s'da mevcut. Site şu anda canlı ve ZF2 için bazı mevcut modüllerin listesini içerir." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "ZF2 Modüllerini keşfedin" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Yardım & Destek" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "ZF2 ile geliştirirken herhangi yardım veya desteğe ihtiyacınız varsa, bize IRC: %sFreenode #zftalk.2%s üzerinden ulaşabilirsiniz. Beta sürümleri ile ilgili olabilecek herhangi bir sorunuzu ya da yorumlarınızı duymak isteriz. Alternatif olarak %smailing listelerine%s abone olup sorularınızı sorabilirsiniz." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "IRC bizi pingleyin" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "An error occurred" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Ek bilgiler" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Klasör" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Mesaj" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Denetleyici" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Önceki istisnalar" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "İstisna yok" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Bir 404 hatası oluştu" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Talep edilen denetleyici işlemi işlemesi mümkün değildir." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Talep edilen denetleyiciye uygun denetleyici sınıfı tahsis edilemedi." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Talep edilen denetleyici çağrılabilir değildir." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "İstenen URL yönlendirmede tahsis edilemedi" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Neden 404 hatasının oluştuğunu şu an belirleyemiyoruz." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Denetleyici" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "Buraya çözümlenir: %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "İstisna" + diff --git a/module/Application/src/Application/Controller/IndexController.php b/module/Application/src/Application/Controller/IndexController.php new file mode 100644 index 00000000..a1aafaee --- /dev/null +++ b/module/Application/src/Application/Controller/IndexController.php @@ -0,0 +1,21 @@ + +

translate('Welcome to %sZend Framework 2%s'), '', '') ?>

+
+

translate('Fork Zend Framework 2 on GitHub') ?> »

+ + +
+ +
+

translate('Follow Development') ?>

+

translate('Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!'), '', '', '', '', '', '') ?>

+

translate('ZF2 Development Portal') ?> »

+
+ +
+

translate('Discover Modules') ?>

+

translate('The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2.'), '', '') ?>

+

translate('Explore ZF2 Modules') ?> »

+
+ +
+

translate('Help & Support') ?>

+

translate('If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We\'d love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s.'), '', '', '', '') ?>

+

translate('Ping us on IRC') ?> »

+
+
diff --git a/module/Application/view/error/404.phtml b/module/Application/view/error/404.phtml new file mode 100644 index 00000000..3edd37a8 --- /dev/null +++ b/module/Application/view/error/404.phtml @@ -0,0 +1,61 @@ +

translate('A 404 error occurred') ?>

+

message ?>

+ +reason) && $this->reason): ?> + +reason) { + case 'error-controller-cannot-dispatch': + $reasonMessage = $this->translate('The requested controller was unable to dispatch the request.'); + break; + case 'error-controller-not-found': + $reasonMessage = $this->translate('The requested controller could not be mapped to an existing controller class.'); + break; + case 'error-controller-invalid': + $reasonMessage = $this->translate('The requested controller was not dispatchable.'); + break; + case 'error-router-no-match': + $reasonMessage = $this->translate('The requested URL could not be matched by routing.'); + break; + default: + $reasonMessage = $this->translate('We cannot determine at this time why a 404 was generated.'); + break; +} +?> + +

+ + + +controller) && $this->controller): ?> + +
+
translate('Controller') ?>:
+
escapeHtml($this->controller) ?> +controller_class) + && $this->controller_class + && $this->controller_class != $this->controller +) { + echo '(' . sprintf($this->translate('resolves to %s'), $this->escapeHtml($this->controller_class)) . ')'; +} +?> +
+
+ + + +exception) && $this->exception): ?> + +

translate('Exception') ?>:

+ +

escapeHtml($this->exception->getMessage()) ?>

+ +

translate('Stack trace') ?>:

+ +
+exception->getTraceAsString() ?>
+
+ + diff --git a/module/Application/view/error/index.phtml b/module/Application/view/error/index.phtml new file mode 100644 index 00000000..5165cd8e --- /dev/null +++ b/module/Application/view/error/index.phtml @@ -0,0 +1,62 @@ +

translate('An error occurred') ?>

+

message ?>

+ +display_exceptions) && $this->display_exceptions): ?> + +exception) && $this->exception instanceof Exception): ?> +
+

translate('Additional information') ?>:

+

exception); ?>

+
+
translate('File') ?>:
+
+
exception->getFile() ?>:exception->getLine() ?>
+
+
translate('Message') ?>:
+
+
exception->getMessage() ?>
+
+
translate('Stack trace') ?>:
+
+
exception->getTraceAsString() ?>
+
+
+exception->getPrevious(); + if ($e) : +?> +
+

translate('Previous exceptions') ?>:

+
    + +
  • +

    +
    +
    translate('File') ?>:
    +
    +
    getFile() ?>:getLine() ?>
    +
    +
    translate('Message') ?>:
    +
    +
    getMessage() ?>
    +
    +
    translate('Stack trace') ?>:
    +
    +
    getTraceAsString() ?>
    +
    +
    +
  • + getPrevious(); + endwhile; + ?> +
+ + + + +

translate('No Exception available') ?>

+ + + + diff --git a/module/Application/view/layout/layout.phtml b/module/Application/view/layout/layout.phtml new file mode 100644 index 00000000..d5af45f6 --- /dev/null +++ b/module/Application/view/layout/layout.phtml @@ -0,0 +1,57 @@ +doctype(); ?> + + + + + headTitle('ZF2 '. $this->translate('Skeleton Application'))->setSeparator(' - ')->setAutoEscape(false) ?> + + headMeta()->appendName('viewport', 'width=device-width, initial-scale=1.0') ?> + + + headLink(array('rel' => 'shortcut icon', 'type' => 'image/vnd.microsoft.icon', 'href' => $this->basePath() . '/images/favicon.ico')) + ->prependStylesheet($this->basePath() . '/css/bootstrap-responsive.min.css') + ->prependStylesheet($this->basePath() . '/css/style.css') + ->prependStylesheet($this->basePath() . '/css/bootstrap.min.css') ?> + + + headScript()->prependFile($this->basePath() . '/js/html5.js', 'text/javascript', array('conditional' => 'lt IE 9',)) + ->prependFile($this->basePath() . '/js/jquery-1.7.2.min.js') ?> + + + + + + + +
+ + content; ?> + +
+ +
+

© 2005 - 2012 by Zend Technologies Ltd. translate('All rights reserved.') ?>

+
+ +
+ + inlineScript() ?> + + diff --git a/public/css/bootstrap-responsive.min.css b/public/css/bootstrap-responsive.min.css new file mode 100644 index 00000000..bc3f2ab7 --- /dev/null +++ b/public/css/bootstrap-responsive.min.css @@ -0,0 +1,3 @@ + +.hidden{display:none;visibility:hidden;} +@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:768px){.container{width:auto;padding:0 20px;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;}}@media (min-width:768px) and (max-width:980px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .span1{width:42px;} .span2{width:104px;} .span3{width:166px;} .span4{width:228px;} .span5{width:290px;} .span6{width:352px;} .span7{width:414px;} .span8{width:476px;} .span9{width:538px;} .span10{width:600px;} .span11{width:662px;} .span12,.container{width:724px;} .offset1{margin-left:82px;} .offset2{margin-left:144px;} .offset3{margin-left:206px;} .offset4{margin-left:268px;} .offset5{margin-left:330px;} .offset6{margin-left:392px;} .offset7{margin-left:454px;} .offset8{margin-left:516px;} .offset9{margin-left:578px;} .offset10{margin-left:640px;} .offset11{margin-left:702px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.801104972%;} .row-fluid .span2{width:14.364640883%;} .row-fluid .span3{width:22.928176794%;} .row-fluid .span4{width:31.491712705%;} .row-fluid .span5{width:40.055248616%;} .row-fluid .span6{width:48.618784527%;} .row-fluid .span7{width:57.182320438000005%;} .row-fluid .span8{width:65.74585634900001%;} .row-fluid .span9{width:74.30939226%;} .row-fluid .span10{width:82.87292817100001%;} .row-fluid .span11{width:91.436464082%;} .row-fluid .span12{width:99.999999993%;} input.span1,textarea.span1,.uneditable-input.span1{width:32px;} input.span2,textarea.span2,.uneditable-input.span2{width:94px;} input.span3,textarea.span3,.uneditable-input.span3{width:156px;} input.span4,textarea.span4,.uneditable-input.span4{width:218px;} input.span5,textarea.span5,.uneditable-input.span5{width:280px;} input.span6,textarea.span6,.uneditable-input.span6{width:342px;} input.span7,textarea.span7,.uneditable-input.span7{width:404px;} input.span8,textarea.span8,.uneditable-input.span8{width:466px;} input.span9,textarea.span9,.uneditable-input.span9{width:528px;} input.span10,textarea.span10,.uneditable-input.span10{width:590px;} input.span11,textarea.span11,.uneditable-input.span11{width:652px;} input.span12,textarea.span12,.uneditable-input.span12{width:714px;}}@media (max-width:980px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .span1{width:70px;} .span2{width:170px;} .span3{width:270px;} .span4{width:370px;} .span5{width:470px;} .span6{width:570px;} .span7{width:670px;} .span8{width:770px;} .span9{width:870px;} .span10{width:970px;} .span11{width:1070px;} .span12,.container{width:1170px;} .offset1{margin-left:130px;} .offset2{margin-left:230px;} .offset3{margin-left:330px;} .offset4{margin-left:430px;} .offset5{margin-left:530px;} .offset6{margin-left:630px;} .offset7{margin-left:730px;} .offset8{margin-left:830px;} .offset9{margin-left:930px;} .offset10{margin-left:1030px;} .offset11{margin-left:1130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.982905983%;} .row-fluid .span2{width:14.529914530000001%;} .row-fluid .span3{width:23.076923077%;} .row-fluid .span4{width:31.623931624%;} .row-fluid .span5{width:40.170940171000005%;} .row-fluid .span6{width:48.717948718%;} .row-fluid .span7{width:57.264957265%;} .row-fluid .span8{width:65.81196581200001%;} .row-fluid .span9{width:74.358974359%;} .row-fluid .span10{width:82.905982906%;} .row-fluid .span11{width:91.45299145300001%;} .row-fluid .span12{width:100%;} input.span1,textarea.span1,.uneditable-input.span1{width:60px;} input.span2,textarea.span2,.uneditable-input.span2{width:160px;} input.span3,textarea.span3,.uneditable-input.span3{width:260px;} input.span4,textarea.span4,.uneditable-input.span4{width:360px;} input.span5,textarea.span5,.uneditable-input.span5{width:460px;} input.span6,textarea.span6,.uneditable-input.span6{width:560px;} input.span7,textarea.span7,.uneditable-input.span7{width:660px;} input.span8,textarea.span8,.uneditable-input.span8{width:760px;} input.span9,textarea.span9,.uneditable-input.span9{width:860px;} input.span10,textarea.span10,.uneditable-input.span10{width:960px;} input.span11,textarea.span11,.uneditable-input.span11{width:1060px;} input.span12,textarea.span12,.uneditable-input.span12{width:1160px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}} diff --git a/public/css/bootstrap.min.css b/public/css/bootstrap.min.css new file mode 100644 index 00000000..b01f92e6 --- /dev/null +++ b/public/css/bootstrap.min.css @@ -0,0 +1,610 @@ +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} +audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} +audio:not([controls]){display:none;} +html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} +a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +a:hover,a:active{outline:0;} +sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} +sup{top:-0.5em;} +sub{bottom:-0.25em;} +img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;} +button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} +button,input{*overflow:visible;line-height:normal;} +button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} +button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} +input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} +input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} +textarea{overflow:auto;vertical-align:top;} +body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;} +a{color:#0088cc;text-decoration:none;} +a:hover{color:#005580;text-decoration:underline;} +.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} +.row:after{clear:both;} +[class*="span"]{float:left;margin-left:20px;} +.span1{width:60px;} +.span2{width:140px;} +.span3{width:220px;} +.span4{width:300px;} +.span5{width:380px;} +.span6{width:460px;} +.span7{width:540px;} +.span8{width:620px;} +.span9{width:700px;} +.span10{width:780px;} +.span11{width:860px;} +.span12,.container{width:940px;} +.offset1{margin-left:100px;} +.offset2{margin-left:180px;} +.offset3{margin-left:260px;} +.offset4{margin-left:340px;} +.offset5{margin-left:420px;} +.offset6{margin-left:500px;} +.offset7{margin-left:580px;} +.offset8{margin-left:660px;} +.offset9{margin-left:740px;} +.offset10{margin-left:820px;} +.offset11{margin-left:900px;} +.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} +.row-fluid:after{clear:both;} +.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;} +.row-fluid>[class*="span"]:first-child{margin-left:0;} +.row-fluid .span1{width:6.382978723%;} +.row-fluid .span2{width:14.89361702%;} +.row-fluid .span3{width:23.404255317%;} +.row-fluid .span4{width:31.914893614%;} +.row-fluid .span5{width:40.425531911%;} +.row-fluid .span6{width:48.93617020799999%;} +.row-fluid .span7{width:57.446808505%;} +.row-fluid .span8{width:65.95744680199999%;} +.row-fluid .span9{width:74.468085099%;} +.row-fluid .span10{width:82.97872339599999%;} +.row-fluid .span11{width:91.489361693%;} +.row-fluid .span12{width:99.99999998999999%;} +.container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";} +.container:after{clear:both;} +.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";} +.container-fluid:after{clear:both;} +p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;} +.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;} +h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;} +h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;} +h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;} +h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;} +h4,h5,h6{line-height:18px;} +h4{font-size:14px;}h4 small{font-size:12px;} +h5{font-size:12px;} +h6{font-size:11px;color:#999999;text-transform:uppercase;} +.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;} +.page-header h1{line-height:1;} +ul,ol{padding:0;margin:0 0 9px 25px;} +ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} +ul{list-style:disc;} +ol{list-style:decimal;} +li{line-height:18px;} +ul.unstyled{margin-left:0;list-style:none;} +dl{margin-bottom:18px;} +dt,dd{line-height:18px;} +dt{font-weight:bold;} +dd{margin-left:9px;} +hr{margin:18px 0;border:0;border-top:1px solid #e5e5e5;border-bottom:1px solid #ffffff;} +strong{font-weight:bold;} +em{font-style:italic;} +.muted{color:#999999;} +abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;} +blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;} +blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} +blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} +q:before,q:after,blockquote:before,blockquote:after{content:"";} +address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;} +small{font-size:100%;} +cite{font-style:normal;} +code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} +pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;}pre.prettyprint{margin-bottom:18px;} +pre code{padding:0;background-color:transparent;} +form{margin:0 0 18px;} +fieldset{padding:0;margin:0;border:0;} +legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;} +label,input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;} +label{display:block;margin-bottom:5px;color:#333333;} +input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.uneditable-textarea{width:auto;height:auto;} +label input,label textarea,label select{display:block;} +input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:0;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +input[type="file"]{padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;} +select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;} +select{width:220px;background-color:#ffffff;} +select[multiple],select[size]{height:auto;} +input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +textarea{height:auto;} +input[type="hidden"]{display:none;} +.radio,.checkbox{padding-left:18px;} +.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;} +.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} +.radio.inline,.checkbox.inline{display:inline-block;margin-bottom:0;vertical-align:middle;} +.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} +.controls>.radio.inline:first-child,.controls>.checkbox.inline:first-child{padding-top:0;} +input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;} +input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;} +input[type="file"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.input-mini{width:60px;} +.input-small{width:90px;} +.input-medium{width:150px;} +.input-large{width:210px;} +.input-xlarge{width:270px;} +.input-xxlarge{width:530px;} +input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;} +input.span1,textarea.span1,.uneditable-input.span1{width:50px;} +input.span2,textarea.span2,.uneditable-input.span2{width:130px;} +input.span3,textarea.span3,.uneditable-input.span3{width:210px;} +input.span4,textarea.span4,.uneditable-input.span4{width:290px;} +input.span5,textarea.span5,.uneditable-input.span5{width:370px;} +input.span6,textarea.span6,.uneditable-input.span6{width:450px;} +input.span7,textarea.span7,.uneditable-input.span7{width:530px;} +input.span8,textarea.span8,.uneditable-input.span8{width:610px;} +input.span9,textarea.span9,.uneditable-input.span9{width:690px;} +input.span10,textarea.span10,.uneditable-input.span10{width:770px;} +input.span11,textarea.span11,.uneditable-input.span11{width:850px;} +input.span12,textarea.span12,.uneditable-input.span12{width:930px;} +input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;} +.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} +.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;} +.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} +.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} +.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;} +.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} +.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} +.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;} +.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} +input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} +.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;} +.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} +:-moz-placeholder{color:#999999;} +::-webkit-input-placeholder{color:#999999;} +.help-block{margin-top:5px;margin-bottom:0;color:#999999;} +.help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;} +.input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";} +.input-prepend:after,.input-append:after{clear:both;} +.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;} +.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;} +.input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;} +.input-prepend .add-on{*margin-top:1px;} +.input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-append .uneditable-input{border-right-color:#ccc;} +.input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;} +.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;} +.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input{display:inline-block;margin-bottom:0;} +.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;} +.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;} +.control-group{margin-bottom:9px;} +.form-horizontal legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;} +.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";} +.form-horizontal .control-group:after{clear:both;} +.form-horizontal .control-group>label{float:left;width:140px;padding-top:5px;text-align:right;} +.form-horizontal .controls{margin-left:160px;} +.form-horizontal .form-actions{padding-left:160px;} +table{max-width:100%;border-collapse:collapse;border-spacing:0;} +.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;border-top:1px solid #ddd;} +.table th{font-weight:bold;vertical-align:bottom;} +.table td{vertical-align:top;} +.table thead:first-child tr th,.table thead:first-child tr td{border-top:0;} +.table tbody+tbody{border-top:2px solid #ddd;} +.table-condensed th,.table-condensed td{padding:4px 5px;} +.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;} +.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} +.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;} +.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;} +.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;} +.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;} +.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} +table .span1{float:none;width:44px;margin-left:0;} +table .span2{float:none;width:124px;margin-left:0;} +table .span3{float:none;width:204px;margin-left:0;} +table .span4{float:none;width:284px;margin-left:0;} +table .span5{float:none;width:364px;margin-left:0;} +table .span6{float:none;width:444px;margin-left:0;} +table .span7{float:none;width:524px;margin-left:0;} +table .span8{float:none;width:604px;margin-left:0;} +table .span9{float:none;width:684px;margin-left:0;} +table .span10{float:none;width:764px;margin-left:0;} +table .span11{float:none;width:844px;margin-left:0;} +table .span12{float:none;width:924px;margin-left:0;} +[class^="icon-"]{display:inline-block;width:14px;height:14px;vertical-align:text-top;background-image:url(../img/glyphicons-halflings.png);background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child{*margin-left:0;} +.icon-white{background-image:url(../img/glyphicons-halflings-white.png);} +.icon-glass{background-position:0 0;} +.icon-music{background-position:-24px 0;} +.icon-search{background-position:-48px 0;} +.icon-envelope{background-position:-72px 0;} +.icon-heart{background-position:-96px 0;} +.icon-star{background-position:-120px 0;} +.icon-star-empty{background-position:-144px 0;} +.icon-user{background-position:-168px 0;} +.icon-film{background-position:-192px 0;} +.icon-th-large{background-position:-216px 0;} +.icon-th{background-position:-240px 0;} +.icon-th-list{background-position:-264px 0;} +.icon-ok{background-position:-288px 0;} +.icon-remove{background-position:-312px 0;} +.icon-zoom-in{background-position:-336px 0;} +.icon-zoom-out{background-position:-360px 0;} +.icon-off{background-position:-384px 0;} +.icon-signal{background-position:-408px 0;} +.icon-cog{background-position:-432px 0;} +.icon-trash{background-position:-456px 0;} +.icon-home{background-position:0 -24px;} +.icon-file{background-position:-24px -24px;} +.icon-time{background-position:-48px -24px;} +.icon-road{background-position:-72px -24px;} +.icon-download-alt{background-position:-96px -24px;} +.icon-download{background-position:-120px -24px;} +.icon-upload{background-position:-144px -24px;} +.icon-inbox{background-position:-168px -24px;} +.icon-play-circle{background-position:-192px -24px;} +.icon-repeat{background-position:-216px -24px;} +.icon-refresh{background-position:-240px -24px;} +.icon-list-alt{background-position:-264px -24px;} +.icon-lock{background-position:-287px -24px;} +.icon-flag{background-position:-312px -24px;} +.icon-headphones{background-position:-336px -24px;} +.icon-volume-off{background-position:-360px -24px;} +.icon-volume-down{background-position:-384px -24px;} +.icon-volume-up{background-position:-408px -24px;} +.icon-qrcode{background-position:-432px -24px;} +.icon-barcode{background-position:-456px -24px;} +.icon-tag{background-position:0 -48px;} +.icon-tags{background-position:-25px -48px;} +.icon-book{background-position:-48px -48px;} +.icon-bookmark{background-position:-72px -48px;} +.icon-print{background-position:-96px -48px;} +.icon-camera{background-position:-120px -48px;} +.icon-font{background-position:-144px -48px;} +.icon-bold{background-position:-167px -48px;} +.icon-italic{background-position:-192px -48px;} +.icon-text-height{background-position:-216px -48px;} +.icon-text-width{background-position:-240px -48px;} +.icon-align-left{background-position:-264px -48px;} +.icon-align-center{background-position:-288px -48px;} +.icon-align-right{background-position:-312px -48px;} +.icon-align-justify{background-position:-336px -48px;} +.icon-list{background-position:-360px -48px;} +.icon-indent-left{background-position:-384px -48px;} +.icon-indent-right{background-position:-408px -48px;} +.icon-facetime-video{background-position:-432px -48px;} +.icon-picture{background-position:-456px -48px;} +.icon-pencil{background-position:0 -72px;} +.icon-map-marker{background-position:-24px -72px;} +.icon-adjust{background-position:-48px -72px;} +.icon-tint{background-position:-72px -72px;} +.icon-edit{background-position:-96px -72px;} +.icon-share{background-position:-120px -72px;} +.icon-check{background-position:-144px -72px;} +.icon-move{background-position:-168px -72px;} +.icon-step-backward{background-position:-192px -72px;} +.icon-fast-backward{background-position:-216px -72px;} +.icon-backward{background-position:-240px -72px;} +.icon-play{background-position:-264px -72px;} +.icon-pause{background-position:-288px -72px;} +.icon-stop{background-position:-312px -72px;} +.icon-forward{background-position:-336px -72px;} +.icon-fast-forward{background-position:-360px -72px;} +.icon-step-forward{background-position:-384px -72px;} +.icon-eject{background-position:-408px -72px;} +.icon-chevron-left{background-position:-432px -72px;} +.icon-chevron-right{background-position:-456px -72px;} +.icon-plus-sign{background-position:0 -96px;} +.icon-minus-sign{background-position:-24px -96px;} +.icon-remove-sign{background-position:-48px -96px;} +.icon-ok-sign{background-position:-72px -96px;} +.icon-question-sign{background-position:-96px -96px;} +.icon-info-sign{background-position:-120px -96px;} +.icon-screenshot{background-position:-144px -96px;} +.icon-remove-circle{background-position:-168px -96px;} +.icon-ok-circle{background-position:-192px -96px;} +.icon-ban-circle{background-position:-216px -96px;} +.icon-arrow-left{background-position:-240px -96px;} +.icon-arrow-right{background-position:-264px -96px;} +.icon-arrow-up{background-position:-289px -96px;} +.icon-arrow-down{background-position:-312px -96px;} +.icon-share-alt{background-position:-336px -96px;} +.icon-resize-full{background-position:-360px -96px;} +.icon-resize-small{background-position:-384px -96px;} +.icon-plus{background-position:-408px -96px;} +.icon-minus{background-position:-433px -96px;} +.icon-asterisk{background-position:-456px -96px;} +.icon-exclamation-sign{background-position:0 -120px;} +.icon-gift{background-position:-24px -120px;} +.icon-leaf{background-position:-48px -120px;} +.icon-fire{background-position:-72px -120px;} +.icon-eye-open{background-position:-96px -120px;} +.icon-eye-close{background-position:-120px -120px;} +.icon-warning-sign{background-position:-144px -120px;} +.icon-plane{background-position:-168px -120px;} +.icon-calendar{background-position:-192px -120px;} +.icon-random{background-position:-216px -120px;} +.icon-comment{background-position:-240px -120px;} +.icon-magnet{background-position:-264px -120px;} +.icon-chevron-up{background-position:-288px -120px;} +.icon-chevron-down{background-position:-313px -119px;} +.icon-retweet{background-position:-336px -120px;} +.icon-shopping-cart{background-position:-360px -120px;} +.icon-folder-close{background-position:-384px -120px;} +.icon-folder-open{background-position:-408px -120px;} +.icon-resize-vertical{background-position:-432px -119px;} +.icon-resize-horizontal{background-position:-456px -118px;} +.dropdown{position:relative;} +.dropdown-toggle{*margin-bottom:-3px;} +.dropdown-toggle:active,.open .dropdown-toggle{outline:0;} +.caret{display:inline-block;width:0;height:0;text-indent:-99999px;*text-indent:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"\2193";} +.dropdown .caret{margin-top:8px;margin-left:2px;} +.dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);} +.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;max-width:220px;_width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.bottom-up{top:auto;bottom:100%;margin-bottom:2px;} +.dropdown-menu .divider{height:1px;margin:5px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;} +.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#555555;white-space:nowrap;} +.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;} +.dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);} +.dropdown.open .dropdown-menu{display:block;} +.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} +.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;} +.collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;} +.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;} +.btn{display:inline-block;padding:4px 10px 4px;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#fafafa;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;*margin-left:.3em;}.btn:first-child{*margin-left:0;} +.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} +.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;color:rgba(0, 0, 0, 0.5);outline:0;} +.btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.btn-large .icon{margin-top:1px;} +.btn-small{padding:5px 9px;font-size:11px;line-height:16px;} +.btn-small .icon{margin-top:-1px;} +.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;} +.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active{color:rgba(255, 255, 255, 0.75);} +.btn-primary{background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-ms-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(top, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0044cc;} +.btn-primary:active,.btn-primary.active{background-color:#003399 \9;} +.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;} +.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} +.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;} +.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} +.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;} +.btn-success:active,.btn-success.active{background-color:#408140 \9;} +.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;} +.btn-info:active,.btn-info.active{background-color:#24748c \9;} +button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} +button.btn.large,input[type="submit"].btn.large{*padding-top:7px;*padding-bottom:7px;} +button.btn.small,input[type="submit"].btn.small{*padding-top:3px;*padding-bottom:3px;} +.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";} +.btn-group:after{clear:both;} +.btn-group:first-child{*margin-left:0;} +.btn-group+.btn-group{margin-left:5px;} +.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;} +.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} +.btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} +.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} +.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;} +.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} +.btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:5px;*padding-bottom:5px;} +.btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);} +.btn .caret{margin-top:7px;margin-left:0;} +.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);} +.btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret{border-top-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);} +.btn-small .caret{margin-top:4px;} +.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.alert,.alert-heading{color:#c09853;} +.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;} +.alert-success{background-color:#dff0d8;border-color:#d6e9c6;} +.alert-success,.alert-success .alert-heading{color:#468847;} +.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;} +.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading{color:#b94a48;} +.alert-info{background-color:#d9edf7;border-color:#bce8f1;} +.alert-info,.alert-info .alert-heading{color:#3a87ad;} +.alert-block{padding-top:14px;padding-bottom:14px;} +.alert-block>p,.alert-block>ul{margin-bottom:0;} +.alert-block p+p{margin-top:5px;} +.nav{margin-left:0;margin-bottom:18px;list-style:none;} +.nav>li>a{display:block;} +.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} +.nav-list{padding-left:14px;padding-right:14px;margin-bottom:0;} +.nav-list>li>a,.nav-list .nav-header{display:block;padding:3px 15px;margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} +.nav-list .nav-header{font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-transform:uppercase;} +.nav-list>li+.nav-header{margin-top:9px;} +.nav-list .active>a,.nav-list .active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} +.nav-list [class^="icon-"]{margin-right:2px;} +.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";} +.nav-tabs:after,.nav-pills:after{clear:both;} +.nav-tabs>li,.nav-pills>li{float:left;} +.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} +.nav-tabs{border-bottom:1px solid #ddd;} +.nav-tabs>li{margin-bottom:-1px;} +.nav-tabs>li>a{padding-top:9px;padding-bottom:9px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} +.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} +.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.nav-pills .active>a,.nav-pills .active>a:hover{color:#ffffff;background-color:#0088cc;} +.nav-stacked>li{float:none;} +.nav-stacked>li>a{margin-right:0;} +.nav-tabs.nav-stacked{border-bottom:0;} +.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} +.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} +.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} +.nav-pills.nav-stacked>li>a{margin-bottom:3px;} +.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} +.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;} +.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;margin-top:6px;} +.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;} +.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;} +.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;} +.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} +.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;opacity:1;filter:alpha(opacity=100);} +.tabs-stacked .open>a:hover{border-color:#999999;} +.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";} +.tabbable:after{clear:both;} +.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;} +.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} +.tab-content>.active,.pill-content>.active{display:block;} +.tabs-below .nav-tabs{border-top:1px solid #ddd;} +.tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;} +.tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} +.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;} +.tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;} +.tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} +.tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} +.tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} +.tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} +.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} +.tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} +.tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} +.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} +.navbar{overflow:visible;margin-bottom:18px;} +.navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);} +.btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;} +.btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;} +.btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} +.btn-navbar .icon-bar+.icon-bar{margin-top:3px;} +.nav-collapse.collapse{height:auto;} +.navbar .brand:hover{text-decoration:none;} +.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;} +.navbar .navbar-text{margin-bottom:0;line-height:40px;color:#999999;}.navbar .navbar-text a:hover{color:#ffffff;background-color:transparent;} +.navbar .btn,.navbar .btn-group{margin-top:5px;} +.navbar .btn-group .btn{margin-top:0;} +.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";} +.navbar-form:after{clear:both;} +.navbar-form input,.navbar-form select{display:inline-block;margin-top:5px;margin-bottom:0;} +.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} +.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} +.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;color:rgba(255, 255, 255, 0.75);background:#666;background:rgba(255, 255, 255, 0.3);border:1px solid #111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query :-moz-placeholder{color:#eeeeee;} +.navbar-search .search-query::-webkit-input-placeholder{color:#eeeeee;} +.navbar-search .search-query:hover{color:#ffffff;background-color:#999999;background-color:rgba(255, 255, 255, 0.5);} +.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} +.navbar-fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030;} +.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} +.navbar .nav.pull-right{float:right;} +.navbar .nav>li{display:block;float:left;} +.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} +.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;} +.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;background-color:rgba(0, 0, 0, 0.5);} +.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;} +.navbar .nav.pull-right{margin-left:10px;margin-right:0;} +.navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} +.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} +.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;} +.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);} +.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;} +.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;} +.navbar .nav.pull-right .dropdown-menu{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before{left:auto;right:12px;} +.navbar .nav.pull-right .dropdown-menu:after{left:auto;right:13px;} +.breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;} +.breadcrumb .divider{padding:0 5px;color:#999999;} +.breadcrumb .active a{color:#333333;} +.pagination{height:36px;margin:18px 0;} +.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} +.pagination li{display:inline;} +.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;} +.pagination a:hover,.pagination .active a{background-color:#f5f5f5;} +.pagination .active a{color:#999999;cursor:default;} +.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;} +.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.pagination-centered{text-align:center;} +.pagination-right{text-align:right;} +.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";} +.pager:after{clear:both;} +.pager li{display:inline;} +.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} +.pager a:hover{text-decoration:none;background-color:#f5f5f5;} +.pager .next a{float:right;} +.pager .previous a{float:left;} +.modal-open .dropdown-menu{z-index:2050;} +.modal-open .dropdown.open{*z-index:2050;} +.modal-open .popover{z-index:2060;} +.modal-open .tooltip{z-index:2070;} +.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} +.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} +.modal{position:fixed;top:50%;left:50%;z-index:1050;max-height:500px;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} +.modal.fade.in{top:50%;} +.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} +.modal-body{padding:15px;} +.modal-footer{padding:14px 15px 15px;margin-bottom:0;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";} +.modal-footer:after{clear:both;} +.modal-footer .btn{float:right;margin-left:5px;margin-bottom:0;} +.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} +.tooltip.top{margin-top:-2px;} +.tooltip.right{margin-left:2px;} +.tooltip.bottom{margin-top:2px;} +.tooltip.left{margin-left:-2px;} +.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.tooltip-arrow{position:absolute;width:0;height:0;} +.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;} +.popover.right{margin-left:5px;} +.popover.bottom{margin-top:5px;} +.popover.left{margin-left:-5px;} +.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.popover .arrow{position:absolute;width:0;height:0;} +.popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);} +.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;} +.popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;} +.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";} +.thumbnails:after{clear:both;} +.thumbnails>li{float:left;margin:0 0 18px 20px;} +.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);} +a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} +.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} +.thumbnail .caption{padding:9px;} +.label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.label-important{background-color:#b94a48;} +.label-warning{background-color:#f89406;} +.label-success{background-color:#468847;} +.label-info{background-color:#3a87ad;} +@-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} +.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} +.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} +.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);} +.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);} +.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);} +.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.accordion{margin-bottom:18px;} +.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.accordion-heading{border-bottom:0;} +.accordion-heading .accordion-toggle{display:block;padding:8px 15px;} +.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} +.carousel{position:relative;margin-bottom:18px;line-height:1;} +.carousel-inner{overflow:hidden;width:100%;position:relative;} +.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;} +.carousel .item>img{display:block;line-height:1;} +.carousel .active,.carousel .next,.carousel .prev{display:block;} +.carousel .active{left:0;} +.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;} +.carousel .next{left:100%;} +.carousel .prev{left:-100%;} +.carousel .next.left,.carousel .prev.right{left:0;} +.carousel .active.left{left:-100%;} +.carousel .active.right{left:100%;} +.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} +.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} +.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);} +.carousel-caption h4,.carousel-caption p{color:#ffffff;} +.hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;} +.hero-unit p{font-size:18px;font-weight:200;line-height:27px;} +.pull-right{float:right;} +.pull-left{float:left;} +.hide{display:none;} +.show{display:block;} +.invisible{visibility:hidden;} diff --git a/public/css/style.css b/public/css/style.css new file mode 100644 index 00000000..28af8659 --- /dev/null +++ b/public/css/style.css @@ -0,0 +1,37 @@ +body { + padding-top: 60px; + padding-bottom: 40px; +} + +.zf-green { + color: #68b604; +} + +.btn-success { + background-color: #57a900; + background-image: -moz-linear-gradient(top, #70d900, #57a900); + background-image: -ms-linear-gradient(top, #70d900, #57a900); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#70d900), to(#57a900)); + background-image: -webkit-linear-gradient(top, #70d900, #57a900); + background-image: -o-linear-gradient(top, #70d900, #57a900); + background-image: linear-gradient(top, #70d900, #57a900); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#70d900', endColorstr='#57a900', GradientType=0); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #57a900; +} + +.btn-success:active, .btn-success.active { + background-color: #57a900; +} + +div.container a.brand { + background: url("../images/zf2-logo.png") no-repeat scroll 0 10px transparent; + margin-left: 0; + padding: 8px 20px 12px 40px; +} diff --git a/public/images/favicon.ico b/public/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..17f119909ffcba66c8a48cba1050d724ab0a51aa GIT binary patch literal 1406 zcmeH{u@S;B3`L(4!_kq77D~2&f)%m@8>CIi3Rxj5&{O4(F&KaWl5ZuLa4BgmpX9H9 z`YL`QaC$|7#dQTcp`$WT2c=`93TJ2EqV#>w00001b5ch_0Itp) z=>Px#24YJ`L;!yP_W%GgN~tse000SaNLh0L04^f{04^f|c%?sf00007bV*G`2iyV+ z0u~zPmpWDe00Lr3L_t(I%azo>i(FL{2k_6yUMCTM712~SHnN3^LXZ#>#6mD{K>q+S zX(BTq2r-aC&_W?)Kx6SHAYz+Fn|-UGg{D#q@kj43WQ(W}QBZutvDmjev$Joqn*)z` zx!n6b_xnBHb7I_-lIg1mkJx`4z((?5a5tV$o(yi!+&@Tx2+;xVFVZx_aXf%ea3pTw zz=& z*KA7NE5{=1(-GdEtJD{D)gIf$xG8VowH+1R9lzF9d;hp8Cvg#v;TN1QJ&Es)a4EB6 zlK#nXw&z@AdSR|r`@17O)2%PzXt!R)mC_@{hd3M|rRdt~`z5`4L;AAE*sb(4E>DKr zcVERJ{Dg0?5({kJiSSaU?AW|pSMAxQrfkZjWC_xn=92RG&mP?K#vF4 za9gH`@MmYF>p7EgOP%X=)!yiw{*-V5$C87=q2#_v)&Aa-_&C;awXWJ1OP6>h_%s*lEe?=BYch#lx|Y3run(); diff --git a/public/js/html5.js b/public/js/html5.js new file mode 100644 index 00000000..6692336c --- /dev/null +++ b/public/js/html5.js @@ -0,0 +1,4 @@ +// iepp v2.1pre @jon_neal & @aFarkas github.com/aFarkas/iepp +// html5shiv @rem remysharp.com/html5-enabling-script +// Dual licensed under the MIT or GPL Version 2 licenses +/*@cc_on(function(a,b){function r(a){var b=-1;while(++b").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( +a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f +.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); diff --git a/vendor/.gitignore b/vendor/.gitignore new file mode 100644 index 00000000..4578c85a --- /dev/null +++ b/vendor/.gitignore @@ -0,0 +1,5 @@ +!.gitignore +.composer +composer +zendframework +autoload.php diff --git a/vendor/README.md b/vendor/README.md new file mode 100644 index 00000000..52144c94 --- /dev/null +++ b/vendor/README.md @@ -0,0 +1 @@ +This vendor/ directory is where third-party modules should be installed. diff --git a/vendor/doctrine/common/.gitignore b/vendor/doctrine/common/.gitignore new file mode 100644 index 00000000..fb5e79d6 --- /dev/null +++ b/vendor/doctrine/common/.gitignore @@ -0,0 +1,4 @@ +build/ +logs/ +reports/ +dist/ diff --git a/vendor/doctrine/common/.gitmodules b/vendor/doctrine/common/.gitmodules new file mode 100644 index 00000000..51f08435 --- /dev/null +++ b/vendor/doctrine/common/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/vendor/doctrine-build-common"] + path = lib/vendor/doctrine-build-common + url = git://github.com/doctrine/doctrine-build-common.git diff --git a/vendor/doctrine/common/.travis.yml b/vendor/doctrine/common/.travis.yml new file mode 100644 index 00000000..4464d4f7 --- /dev/null +++ b/vendor/doctrine/common/.travis.yml @@ -0,0 +1,5 @@ +language: php + +php: + - 5.3 + - 5.4 diff --git a/vendor/doctrine/common/LICENSE b/vendor/doctrine/common/LICENSE new file mode 100644 index 00000000..1c03f74b --- /dev/null +++ b/vendor/doctrine/common/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/vendor/doctrine/common/README.md b/vendor/doctrine/common/README.md new file mode 100644 index 00000000..c63f7627 --- /dev/null +++ b/vendor/doctrine/common/README.md @@ -0,0 +1,12 @@ +# Doctrine Common + +[![Build Status](https://secure.travis-ci.org/doctrine/common.png)](http://travis-ci.org/doctrine/common) + +The Doctrine Common project is a library that provides extensions to core PHP functionality. + +## More resources: + +* [Website](http://www.doctrine-project.org) +* [Documentation](http://www.doctrine-project.org/projects/common/current/docs/en) +* [Issue Tracker](http://www.doctrine-project.org/jira/browse/DCOM) +* [Downloads](http://github.com/doctrine/common/downloads) diff --git a/vendor/doctrine/common/UPGRADE_TO_2_1 b/vendor/doctrine/common/UPGRADE_TO_2_1 new file mode 100644 index 00000000..891a2e5c --- /dev/null +++ b/vendor/doctrine/common/UPGRADE_TO_2_1 @@ -0,0 +1,39 @@ +This document details all the possible changes that you should investigate when updating +your project from Doctrine Common 2.0.x to 2.1 + +## AnnotationReader changes + +The annotation reader was heavily refactored between 2.0 and 2.1-RC1. In theory the operation of the new reader should be backwards compatible, but it has to be setup differently to work that way: + + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\'); + // new code necessary starting here + $reader->setIgnoreNotImportedAnnotations(true); + $reader->setEnableParsePhpImports(false); + $reader = new \Doctrine\Common\Annotations\CachedReader( + new \Doctrine\Common\Annotations\IndexedReader($reader), new ArrayCache() + ); + +## Annotation Base class or @Annotation + +Beginning after 2.1-RC2 you have to either extend ``Doctrine\Common\Annotations\Annotation`` or add @Annotation to your annotations class-level docblock, otherwise the class will simply be ignored. + +## Removed methods on AnnotationReader + +* AnnotationReader::setAutoloadAnnotations() +* AnnotationReader::getAutoloadAnnotations() +* AnnotationReader::isAutoloadAnnotations() + +## AnnotationRegistry + +Autoloading through the PHP autoloader is removed from the 2.1 AnnotationReader. Instead you have to use the global AnnotationRegistry for loading purposes: + + \Doctrine\Common\Annotations\AnnotationRegistry::registerFile($fileWithAnnotations); + \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespace($namespace, $dirs = null); + \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespaces($namespaces); + \Doctrine\Common\Annotations\AnnotationRegistry::registerLoader($callable); + +The $callable for registering a loader accepts a class as first and only parameter and must try to silently autoload it. On success true has to be returned. +The registerAutoloadNamespace function registers a PSR-0 compatible silent autoloader for all classes with the given namespace in the given directories. +If null is passed as directory the include path will be used. + diff --git a/vendor/doctrine/common/UPGRADE_TO_2_2 b/vendor/doctrine/common/UPGRADE_TO_2_2 new file mode 100644 index 00000000..1d93a131 --- /dev/null +++ b/vendor/doctrine/common/UPGRADE_TO_2_2 @@ -0,0 +1,61 @@ +This document details all the possible changes that you should investigate when +updating your project from Doctrine Common 2.1 to 2.2: + +## Annotation Changes + +- AnnotationReader::setIgnoreNotImportedAnnotations has been removed, you need to + add ignore annotation names which are supposed to be ignored via + AnnotationReader::addGlobalIgnoredName + +- AnnotationReader::setAutoloadAnnotations was deprecated by the AnnotationRegistry + in 2.1 and has been removed in 2.2 + +- AnnotationReader::setEnableParsePhpImports was added to ease transition to the new + annotation mechanism in 2.1 and is removed in 2.2 + +- AnnotationReader::isParsePhpImportsEnabled is removed (see above) + +- AnnotationReader::setDefaultAnnotationNamespace was deprecated in favor of explicit + configuration in 2.1 and will be removed in 2.2 (for isolated projects where you + have full-control over _all_ available annotations, we offer a dedicated reader + class ``SimpleAnnotationReader``) + +- AnnotationReader::setAnnotationCreationFunction was deprecated in 2.1 and will be + removed in 2.2. We only offer two creation mechanisms which cannot be changed + anymore to allow the same reader instance to work with all annotations regardless + of which library they are coming from. + +- AnnotationReader::setAnnotationNamespaceAlias was deprecated in 2.1 and will be + removed in 2.2 (see setDefaultAnnotationNamespace) + +- If you use a class as annotation which has not the @Annotation marker in it's + class block, we will now throw an exception instead of silently ignoring it. You + can however still achieve the previous behavior using the @IgnoreAnnotation, or + AnnotationReader::addGlobalIgnoredName (the exception message will contain detailed + instructions when you run into this problem). + +## Cache Changes + +- Renamed old AbstractCache to CacheProvider + +- Dropped the support to the following functions of all cache providers: + + - CacheProvider::deleteByWildcard + + - CacheProvider::deleteByRegEx + + - CacheProvider::deleteByPrefix + + - CacheProvider::deleteBySuffix + +- CacheProvider::deleteAll will not remove ALL entries, it will only mark them as invalid + +- CacheProvider::flushAll will remove ALL entries, namespaced or not + +- Added support to MemcachedCache + +- Added support to WincacheCache + +## ClassLoader Changes + +- ClassLoader::fileExistsInIncludePath() no longer exists. Use the native stream_resolve_include_path() PHP function \ No newline at end of file diff --git a/vendor/doctrine/common/build.properties b/vendor/doctrine/common/build.properties new file mode 100644 index 00000000..ff311a45 --- /dev/null +++ b/vendor/doctrine/common/build.properties @@ -0,0 +1,6 @@ +# Project Name +project.name=DoctrineCommon + +# Version class and file +project.version_class = Doctrine\Common\Version +project.version_file = lib/Doctrine/Common/Version.php diff --git a/vendor/doctrine/common/build.xml b/vendor/doctrine/common/build.xml new file mode 100644 index 00000000..71a9a500 --- /dev/null +++ b/vendor/doctrine/common/build.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DoctrineCommon + Doctrine Common PHP Extensions + pear.doctrine-project.org + The Doctrine Common package contains shared code between the other packages. + + + + + LGPL + + + - + + + + + + + diff --git a/vendor/doctrine/common/composer.json b/vendor/doctrine/common/composer.json new file mode 100644 index 00000000..f995f6c6 --- /dev/null +++ b/vendor/doctrine/common/composer.json @@ -0,0 +1,21 @@ +{ + "name": "doctrine/common", + "type": "library","version":"2.2.3", + "description": "Common Library for Doctrine projects", + "keywords": ["collections", "spl", "eventmanager", "annotations", "persistence"], + "homepage": "http://www.doctrine-project.org", + "license": "LGPL", + "authors": [ + {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"}, + {"name": "Roman Borschel", "email": "roman@code-factory.org"}, + {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"}, + {"name": "Jonathan Wage", "email": "jonwage@gmail.com"}, + {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"} + ], + "require": { + "php": ">=5.3.2" + }, + "autoload": { + "psr-0": { "Doctrine\\Common": "lib/" } + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php new file mode 100644 index 00000000..62512522 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php @@ -0,0 +1,75 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Annotations class + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class Annotation +{ + /** + * Value property. Common among all derived classes. + * + * @var string + */ + public $value; + + /** + * Constructor + * + * @param array $data Key-value for properties to be defined in this class + */ + public final function __construct(array $data) + { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + /** + * Error handler for unknown property accessor in Annotation class. + * + * @param string $name Unknown property name + */ + public function __get($name) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } + + /** + * Error handler for unknown property mutator in Annotation class. + * + * @param string $name Unkown property name + * @param mixed $value Property value + */ + public function __set($name, $value) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php new file mode 100644 index 00000000..21597b14 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php @@ -0,0 +1,47 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the attribute type during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attribute +{ + /** + * @var string + */ + public $name; + + /** + * @var string + */ + public $type; + + /** + * @var boolean + */ + public $required = false; +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php new file mode 100644 index 00000000..6e314be4 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php @@ -0,0 +1,37 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the types of all declared attributes during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attributes +{ + /** + * @var array + */ + public $value; +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php new file mode 100644 index 00000000..1b2b20ac --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php @@ -0,0 +1,44 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser to ignore specific + * annotations during the parsing process. + * + * @Annotation + * @author Johannes M. Schmitt + */ +final class IgnoreAnnotation +{ + public $names; + + public function __construct(array $values) + { + if (is_string($values['value'])) { + $values['value'] = array($values['value']); + } + if (!is_array($values['value'])) { + throw new \RuntimeException(sprintf('@IgnoreAnnotation expects either a string name, or an array of strings, but got %s.', json_encode($values['value']))); + } + + $this->names = $values['value']; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php new file mode 100644 index 00000000..7b89a022 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php @@ -0,0 +1,33 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check if that attribute is required during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Required +{ +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php new file mode 100644 index 00000000..c41896ad --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php @@ -0,0 +1,105 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the annotation target during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Target +{ + const TARGET_CLASS = 1; + const TARGET_METHOD = 2; + const TARGET_PROPERTY = 4; + const TARGET_ANNOTATION = 8; + const TARGET_ALL = 15; + + /** + * @var array + */ + private static $map = array( + 'ALL' => self::TARGET_ALL, + 'CLASS' => self::TARGET_CLASS, + 'METHOD' => self::TARGET_METHOD, + 'PROPERTY' => self::TARGET_PROPERTY, + 'ANNOTATION' => self::TARGET_ANNOTATION, + ); + + /** + * @var array + */ + public $value; + + /** + * Targets as bitmask. + * + * @var integer + */ + public $targets; + + /** + * Literal target declaration. + * + * @var integer + */ + public $literal; + + /** + * Annotation construct + * + * @param array $values + */ + public function __construct(array $values) + { + if (!isset($values['value'])){ + $values['value'] = null; + } + if (is_string($values['value'])){ + $values['value'] = array($values['value']); + } + if (!is_array($values['value'])){ + throw new \InvalidArgumentException( + sprintf('@Target expects either a string value, or an array of strings, "%s" given.', + is_object($values['value']) ? get_class($values['value']) : gettype($values['value']) + ) + ); + } + + $bitmask = 0; + foreach ($values['value'] as $literal) { + if(!isset(self::$map[$literal])){ + throw new \InvalidArgumentException( + sprintf('Invalid Target "%s". Available targets: [%s]', + $literal, implode(', ', array_keys(self::$map))) + ); + } + $bitmask += self::$map[$literal]; + } + + $this->targets = $bitmask; + $this->value = $values['value']; + $this->literal = implode(', ', $this->value); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php new file mode 100644 index 00000000..fdc1913a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php @@ -0,0 +1,111 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Description of AnnotationException + * + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class AnnotationException extends \Exception +{ + /** + * Creates a new AnnotationException describing a Syntax error. + * + * @param string $message Exception message + * @return AnnotationException + */ + public static function syntaxError($message) + { + return new self('[Syntax Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing a Semantical error. + * + * @param string $message Exception message + * @return AnnotationException + */ + public static function semanticalError($message) + { + return new self('[Semantical Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing an error which occurred during + * the creation of the annotation. + * + * @since 2.2 + * @param string $message + * @return AnnotationException + */ + public static function creationError($message) + { + return new self('[Creation Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing an type error of an attribute. + * + * @since 2.2 + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * @param mixed $actual + * @return AnnotationException + */ + public static function typeError($attributeName, $annotationName, $context, $expected, $actual) + { + return new self(sprintf( + '[Type Error] Attribute "%s" of @%s declared on %s expects %s, but got %s.', + $attributeName, + $annotationName, + $context, + $expected, + is_object($actual) ? 'an instance of '.get_class($actual) : gettype($actual) + )); + } + + /** + * Creates a new AnnotationException describing an required error of an attribute. + * + * @since 2.2 + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * @return AnnotationException + */ + public static function requiredError($attributeName, $annotationName, $context, $expected) + { + return new self(sprintf( + '[Type Error] Attribute "%s" of @%s declared on %s expects %s. This value should not be null.', + $attributeName, + $annotationName, + $context, + $expected + )); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php new file mode 100644 index 00000000..be87728b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php @@ -0,0 +1,303 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\IgnoreAnnotation; +use Doctrine\Common\Annotations\Annotation\Target; +use Closure; +use ReflectionClass; +use ReflectionMethod; +use ReflectionProperty; + +/** + * A reader for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +final class AnnotationReader implements Reader +{ + /** + * Global map for imports. + * + * @var array + */ + private static $globalImports = array( + 'ignoreannotation' => 'Doctrine\Common\Annotations\Annotation\IgnoreAnnotation', + ); + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names are case sensitive. + * + * @var array + */ + private static $globalIgnoredNames = array( + 'access'=> true, 'author'=> true, 'copyright'=> true, 'deprecated'=> true, + 'example'=> true, 'ignore'=> true, 'internal'=> true, 'link'=> true, 'see'=> true, + 'since'=> true, 'tutorial'=> true, 'version'=> true, 'package'=> true, + 'subpackage'=> true, 'name'=> true, 'global'=> true, 'param'=> true, + 'return'=> true, 'staticvar'=> true, 'category'=> true, 'staticVar'=> true, + 'static'=> true, 'var'=> true, 'throws'=> true, 'inheritdoc'=> true, + 'inheritDoc'=> true, 'license'=> true, 'todo'=> true, 'deprecated'=> true, + 'deprec'=> true, 'author'=> true, 'property' => true, 'method' => true, + 'abstract'=> true, 'exception'=> true, 'magic' => true, 'api' => true, + 'final'=> true, 'filesource'=> true, 'throw' => true, 'uses' => true, + 'usedby'=> true, 'private' => true, 'Annotation' => true, 'override' => true, + 'codeCoverageIgnore' => true, 'codeCoverageIgnoreStart' => true, 'codeCoverageIgnoreEnd' => true, + 'Required' => true, 'Attribute' => true, 'Attributes' => true, + 'Target' => true, 'SuppressWarnings' => true, + 'ingroup' => true, 'code' => true, 'endcode' => true, + 'package_version' => true, + ); + + /** + * Add a new annotation to the globally ignored annotation names with regard to exception handling. + * + * @param string $name + */ + static public function addGlobalIgnoredName($name) + { + self::$globalIgnoredNames[$name] = true; + } + + /** + * Annotations Parser + * + * @var Doctrine\Common\Annotations\DocParser + */ + private $parser; + + /** + * Annotations Parser used to collect parsing metadata + * + * @var Doctrine\Common\Annotations\DocParser + */ + private $preParser; + + /** + * PHP Parser used to collect imports. + * + * @var Doctrine\Common\Annotations\PhpParser + */ + private $phpParser; + + /** + * In-memory cache mechanism to store imported annotations per class. + * + * @var array + */ + private $imports = array(); + + /** + * In-memory cache mechanism to store ignored annotations per class. + * + * @var array + */ + private $ignoredAnnotationNames = array(); + + /** + * Constructor. + * + * Initializes a new AnnotationReader. + */ + public function __construct() + { + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/IgnoreAnnotation.php'); + + $this->parser = new DocParser; + + $this->preParser = new DocParser; + $this->preParser->setImports(self::$globalImports); + $this->preParser->setIgnoreNotImportedAnnotations(true); + + $this->phpParser = new PhpParser; + } + + /** + * Gets the annotations applied to a class. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @return array An array of Annotations. + */ + public function getClassAnnotations(ReflectionClass $class) + { + $this->parser->setTarget(Target::TARGET_CLASS); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($class->getDocComment(), 'class ' . $class->getName()); + } + + /** + * Gets a class annotation. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getClassAnnotation(ReflectionClass $class, $annotationName) + { + $annotations = $this->getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets the annotations applied to a property. + * + * @param ReflectionProperty $property The ReflectionProperty of the property + * from which the annotations should be read. + * @return array An array of Annotations. + */ + public function getPropertyAnnotations(ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + $this->parser->setTarget(Target::TARGET_PROPERTY); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($property->getDocComment(), $context); + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets the annotations applied to a method. + * + * @param ReflectionMethod $property The ReflectionMethod of the method from which + * the annotations should be read. + * @return array An array of Annotations. + */ + public function getMethodAnnotations(ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + $this->parser->setTarget(Target::TARGET_METHOD); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($method->getDocComment(), $context); + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Returns the ignored annotations for the given class. + * + * @param ReflectionClass $class + * @return array + */ + private function getIgnoredAnnotationNames(ReflectionClass $class) + { + if (isset($this->ignoredAnnotationNames[$name = $class->getName()])) { + return $this->ignoredAnnotationNames[$name]; + } + $this->collectParsingMetadata($class); + + return $this->ignoredAnnotationNames[$name]; + } + + private function getImports(ReflectionClass $class) + { + if (isset($this->imports[$name = $class->getName()])) { + return $this->imports[$name]; + } + $this->collectParsingMetadata($class); + + return $this->imports[$name]; + } + + /** + * Collects parsing metadata for a given class + * + * @param ReflectionClass $class + */ + private function collectParsingMetadata(ReflectionClass $class) + { + $ignoredAnnotationNames = self::$globalIgnoredNames; + + $annotations = $this->preParser->parse($class->getDocComment(), 'class '.$class->name); + foreach ($annotations as $annotation) { + if ($annotation instanceof IgnoreAnnotation) { + foreach ($annotation->names AS $annot) { + $ignoredAnnotationNames[$annot] = true; + } + } + } + + $name = $class->getName(); + $this->imports[$name] = array_merge( + self::$globalImports, + $this->phpParser->parseClass($class), + array('__NAMESPACE__' => $class->getNamespaceName()) + ); + $this->ignoredAnnotationNames[$name] = $ignoredAnnotationNames; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php new file mode 100644 index 00000000..60b00f51 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php @@ -0,0 +1,129 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +final class AnnotationRegistry +{ + /** + * A map of namespaces to use for autoloading purposes based on a PSR-0 convention. + * + * Contains the namespace as key and an array of directories as value. If the value is NULL + * the include path is used for checking for the corresponding file. + * + * This autoloading mechanism does not utilize the PHP autoloading but implements autoloading on its own. + * + * @var array + */ + static private $autoloadNamespaces = array(); + + /** + * A map of autoloader callables. + * + * @var array + */ + static private $loaders = array(); + + static public function reset() + { + self::$autoloadNamespaces = array(); + self::$loaders = array(); + } + + static public function registerFile($file) + { + require_once $file; + } + + /** + * Add a namespace with one or many directories to look for files or null for the include path. + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param string $namespace + * @param string|array|null $dirs + */ + static public function registerAutoloadNamespace($namespace, $dirs = null) + { + self::$autoloadNamespaces[$namespace] = $dirs; + } + + /** + * Register multiple namespaces + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param array $namespaces + */ + static public function registerAutoloadNamespaces(array $namespaces) + { + self::$autoloadNamespaces = array_merge(self::$autoloadNamespaces, $namespaces); + } + + /** + * Register an autoloading callabale for annotations, much like spl_autoload_register(). + * + * NOTE: These class loaders HAVE to be silent when a class was not found! + * IMPORTANT: Loaders have to return true if they loaded a class that could contain the searched annotation class. + * + * @param callabale $callabale + */ + static public function registerLoader($callabale) + { + if (!is_callable($callabale)) { + throw new \InvalidArgumentException("A callable is expected in AnnotationRegistry::registerLoader()."); + } + self::$loaders[] = $callabale; + } + + /** + * Autoload an annotation class silently. + * + * @param string $class + * @return void + */ + static public function loadAnnotationClass($class) + { + foreach (self::$autoloadNamespaces AS $namespace => $dirs) { + if (strpos($class, $namespace) === 0) { + $file = str_replace("\\", DIRECTORY_SEPARATOR, $class) . ".php"; + if ($dirs === null) { + if ($path = stream_resolve_include_path($file)) { + require $path; + return true; + } + } else { + foreach((array)$dirs AS $dir) { + if (file_exists($dir . DIRECTORY_SEPARATOR . $file)) { + require $dir . DIRECTORY_SEPARATOR . $file; + return true; + } + } + } + } + } + + foreach (self::$loaders AS $loader) { + if (call_user_func($loader, $class) === true) { + return true; + } + } + return false; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php new file mode 100644 index 00000000..6ea47c6a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php @@ -0,0 +1,179 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Cache\Cache; + +/** + * A cache aware annotation reader. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + */ +final class CachedReader implements Reader +{ + private static $CACHE_SALT = '@[Annot]'; + + /** + * @var Reader + */ + private $delegate; + + /** + * @var Cache + */ + private $cache; + + /** + * @var boolean + */ + private $debug; + + /** + * @var array + */ + private $loadedAnnotations; + + /** + * @param Reader $reader + * @param Cache $cache + */ + public function __construct(Reader $reader, Cache $cache, $debug = false) + { + $this->delegate = $reader; + $this->cache = $cache; + $this->debug = $debug; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $cacheKey = $class->getName() . self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getClassAnnotations($class); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $cacheKey = $class->getName().'$'.$property->getName().self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getPropertyAnnotations($property); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $cacheKey = $class->getName().'#'.$method->getName().self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getMethodAnnotations($method); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = array(); + } + + private function isCacheFresh($cacheKey, \ReflectionClass $class) + { + if (false === $filename = $class->getFilename()) { + return true; + } + + return $this->cache->fetch('[C]'.$cacheKey) >= filemtime($filename); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php new file mode 100644 index 00000000..c6223e36 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php @@ -0,0 +1,140 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Lexer; + +/** + * Simple lexer for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +final class DocLexer extends Lexer +{ + const T_NONE = 1; + const T_IDENTIFIER = 2; + const T_INTEGER = 3; + const T_STRING = 4; + const T_FLOAT = 5; + + const T_AT = 101; + const T_CLOSE_CURLY_BRACES = 102; + const T_CLOSE_PARENTHESIS = 103; + const T_COMMA = 104; + const T_EQUALS = 105; + const T_FALSE = 106; + const T_NAMESPACE_SEPARATOR = 107; + const T_OPEN_CURLY_BRACES = 108; + const T_OPEN_PARENTHESIS = 109; + const T_TRUE = 110; + const T_NULL = 111; + const T_COLON = 112; + + /** + * @inheritdoc + */ + protected function getCatchablePatterns() + { + return array( + '[a-z_][a-z0-9_:]*', + '(?:[+-]?[0-9]+(?:[\.][0-9]+)*)(?:[eE][+-]?[0-9]+)?', + '"(?:[^"]|"")*"', + ); + } + + /** + * @inheritdoc + */ + protected function getNonCatchablePatterns() + { + return array('\s+', '\*+', '(.)'); + } + + /** + * @inheritdoc + */ + protected function getType(&$value) + { + $type = self::T_NONE; + + // Checking numeric value + if (is_numeric($value)) { + return (strpos($value, '.') !== false || stripos($value, 'e') !== false) + ? self::T_FLOAT : self::T_INTEGER; + } + + if ($value[0] === '"') { + $value = str_replace('""', '"', substr($value, 1, strlen($value) - 2)); + + return self::T_STRING; + } else { + switch (strtolower($value)) { + case '@': + return self::T_AT; + + case ',': + return self::T_COMMA; + + case '(': + return self::T_OPEN_PARENTHESIS; + + case ')': + return self::T_CLOSE_PARENTHESIS; + + case '{': + return self::T_OPEN_CURLY_BRACES; + + case '}': + return self::T_CLOSE_CURLY_BRACES; + + case '=': + return self::T_EQUALS; + + case '\\': + return self::T_NAMESPACE_SEPARATOR; + + case 'true': + return self::T_TRUE; + + case 'false': + return self::T_FALSE; + + case 'null': + return self::T_NULL; + + case ':': + return self::T_COLON; + + default: + if (ctype_alpha($value[0]) || $value[0] === '_') { + return self::T_IDENTIFIER; + } + + break; + } + } + + return $type; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php new file mode 100644 index 00000000..9d16b176 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php @@ -0,0 +1,891 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Closure; +use ReflectionClass; +use Doctrine\Common\Annotations\Annotation\Target; +use Doctrine\Common\Annotations\Annotation\Attribute; +use Doctrine\Common\Annotations\Annotation\Attributes; + +/** + * A parser for docblock annotations. + * + * It is strongly discouraged to change the default annotation parsing process. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +final class DocParser +{ + /** + * An array of all valid tokens for a class name. + * + * @var array + */ + private static $classIdentifiers = array(DocLexer::T_IDENTIFIER, DocLexer::T_TRUE, DocLexer::T_FALSE, DocLexer::T_NULL); + + /** + * The lexer. + * + * @var Doctrine\Common\Annotations\DocLexer + */ + private $lexer; + + /** + * Current target context + * + * @var string + */ + private $target; + + /** + * Doc Parser used to collect annotation target + * + * @var Doctrine\Common\Annotations\DocParser + */ + private static $metadataParser; + + /** + * Flag to control if the current annotation is nested or not. + * + * @var boolean + */ + private $isNestedAnnotation = false; + + /** + * Hashmap containing all use-statements that are to be used when parsing + * the given doc block. + * + * @var array + */ + private $imports = array(); + + /** + * This hashmap is used internally to cache results of class_exists() + * look-ups. + * + * @var array + */ + private $classExists = array(); + + /** + * Whether annotations that have not been imported should be ignored. + * + * @var boolean + */ + private $ignoreNotImportedAnnotations = false; + + /** + * An array of default namespaces if operating in simple mode. + * + * @var array + */ + private $namespaces = array(); + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names must be the raw names as used in the class, not the fully qualified + * class names. + * + * @var array + */ + private $ignoredAnnotationNames = array(); + + /** + * @var string + */ + private $context = ''; + + /** + * Hash-map for caching annotation metadata + * @var array + */ + private static $annotationMetadata = array( + 'Doctrine\Common\Annotations\Annotation\Target' => array( + 'is_annotation' => true, + 'has_constructor' => true, + 'properties' => array(), + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'attribute_types' => array( + 'value' => array( + 'required' => false, + 'type' =>'array', + 'array_type'=>'string', + 'value' =>'array' + ) + ), + ), + 'Doctrine\Common\Annotations\Annotation\Attribute' => array( + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_ANNOTATION', + 'targets' => Target::TARGET_ANNOTATION, + 'default_property' => 'name', + 'properties' => array( + 'name' => 'name', + 'type' => 'type', + 'required' => 'required' + ), + 'attribute_types' => array( + 'value' => array( + 'required' => true, + 'type' =>'string', + 'value' =>'string' + ), + 'type' => array( + 'required' =>true, + 'type' =>'string', + 'value' =>'string' + ), + 'required' => array( + 'required' =>false, + 'type' =>'boolean', + 'value' =>'boolean' + ) + ), + ), + 'Doctrine\Common\Annotations\Annotation\Attributes' => array( + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'properties' => array( + 'value' => 'value' + ), + 'attribute_types' => array( + 'value' => array( + 'type' =>'array', + 'required' =>true, + 'array_type'=>'Doctrine\Common\Annotations\Annotation\Attribute', + 'value' =>'array' + ) + ), + ), + ); + + /** + * Hash-map for handle types declaration + * + * @var array + */ + private static $typeMap = array( + 'float' => 'double', + 'bool' => 'boolean', + // allow uppercase Boolean in honor of George Boole + 'Boolean' => 'boolean', + 'int' => 'integer', + ); + + /** + * Constructs a new DocParser. + */ + public function __construct() + { + $this->lexer = new DocLexer; + } + + /** + * Sets the annotation names that are ignored during the parsing process. + * + * The names are supposed to be the raw names as used in the class, not the + * fully qualified class names. + * + * @param array $names + */ + public function setIgnoredAnnotationNames(array $names) + { + $this->ignoredAnnotationNames = $names; + } + + public function setIgnoreNotImportedAnnotations($bool) + { + $this->ignoreNotImportedAnnotations = (Boolean) $bool; + } + + /** + * Sets the default namespaces. + * @param array $namespaces + */ + public function addNamespace($namespace) + { + if ($this->imports) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + $this->namespaces[] = $namespace; + } + + public function setImports(array $imports) + { + if ($this->namespaces) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + $this->imports = $imports; + } + + /** + * Sets current target context as bitmask. + * + * @param integer $target + */ + public function setTarget($target) + { + $this->target = $target; + } + + /** + * Parses the given docblock string for annotations. + * + * @param string $input The docblock string to parse. + * @param string $context The parsing context. + * @return array Array of annotations. If no annotations are found, an empty array is returned. + */ + public function parse($input, $context = '') + { + if (false === $pos = strpos($input, '@')) { + return array(); + } + + // also parse whatever character is before the @ + if ($pos > 0) { + $pos -= 1; + } + + $this->context = $context; + $this->lexer->setInput(trim(substr($input, $pos), '* /')); + $this->lexer->moveNext(); + + return $this->Annotations(); + } + + /** + * Attempts to match the given token with the current lookahead token. + * If they match, updates the lookahead token; otherwise raises a syntax error. + * + * @param int Token type. + * @return bool True if tokens match; false otherwise. + */ + private function match($token) + { + if ( ! $this->lexer->isNextToken($token) ) { + $this->syntaxError($this->lexer->getLiteral($token)); + } + + return $this->lexer->moveNext(); + } + + /** + * Attempts to match the current lookahead token with any of the given tokens. + * + * If any of them matches, this method updates the lookahead token; otherwise + * a syntax error is raised. + * + * @param array $tokens + * @return bool + */ + private function matchAny(array $tokens) + { + if ( ! $this->lexer->isNextTokenAny($tokens)) { + $this->syntaxError(implode(' or ', array_map(array($this->lexer, 'getLiteral'), $tokens))); + } + + return $this->lexer->moveNext(); + } + + /** + * Generates a new syntax error. + * + * @param string $expected Expected string. + * @param array $token Optional token. + * @throws SyntaxException + */ + private function syntaxError($expected, $token = null) + { + if ($token === null) { + $token = $this->lexer->lookahead; + } + + $message = "Expected {$expected}, got "; + + if ($this->lexer->lookahead === null) { + $message .= 'end of string'; + } else { + $message .= "'{$token['value']}' at position {$token['position']}"; + } + + if (strlen($this->context)) { + $message .= ' in ' . $this->context; + } + + $message .= '.'; + + throw AnnotationException::syntaxError($message); + } + + /** + * Attempt to check if a class exists or not. This never goes through the PHP autoloading mechanism + * but uses the {@link AnnotationRegistry} to load classes. + * + * @param string $fqcn + * @return boolean + */ + private function classExists($fqcn) + { + if (isset($this->classExists[$fqcn])) { + return $this->classExists[$fqcn]; + } + + // first check if the class already exists, maybe loaded through another AnnotationReader + if (class_exists($fqcn, false)) { + return $this->classExists[$fqcn] = true; + } + + // final check, does this class exist? + return $this->classExists[$fqcn] = AnnotationRegistry::loadAnnotationClass($fqcn); + } + + /** + * Collects parsing metadata for a given annotation class + * + * @param string $name The annotation name + */ + private function collectAnnotationMetadata($name) + { + if (self::$metadataParser == null){ + self::$metadataParser = new self(); + self::$metadataParser->setTarget(Target::TARGET_CLASS); + self::$metadataParser->setIgnoreNotImportedAnnotations(true); + self::$metadataParser->setImports(array( + 'target' => 'Doctrine\Common\Annotations\Annotation\Target', + 'attribute' => 'Doctrine\Common\Annotations\Annotation\Attribute', + 'attributes' => 'Doctrine\Common\Annotations\Annotation\Attributes' + )); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Target.php'); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attribute.php'); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attributes.php'); + } + + $class = new \ReflectionClass($name); + $docComment = $class->getDocComment(); + + // Sets default values for annotation metadata + $metadata = array( + 'default_property' => null, + 'has_constructor' => (null !== $constructor = $class->getConstructor()) && $constructor->getNumberOfParameters() > 0, + 'properties' => array(), + 'property_types' => array(), + 'attribute_types' => array(), + 'targets_literal' => null, + 'targets' => Target::TARGET_ALL, + 'is_annotation' => false !== strpos($docComment, '@Annotation'), + ); + + // verify that the class is really meant to be an annotation + if ($metadata['is_annotation']) { + foreach (self::$metadataParser->parse($docComment, 'class @' . $name) as $annotation) { + if ($annotation instanceof Target) { + $metadata['targets'] = $annotation->targets; + $metadata['targets_literal'] = $annotation->literal; + + } elseif ($annotation instanceof Attributes) { + foreach ($annotation->value as $attrib) { + // handle internal type declaration + $type = isset(self::$typeMap[$attrib->type]) ? self::$typeMap[$attrib->type] : $attrib->type; + + // handle the case if the property type is mixed + if ('mixed' !== $type) { + // Checks if the property has array + if (false !== $pos = strpos($type, '<')) { + $arrayType = substr($type, $pos+1, -1); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$attrib->name]['array_type'] = $arrayType; + } + + $metadata['attribute_types'][$attrib->name]['type'] = $type; + $metadata['attribute_types'][$attrib->name]['value'] = $attrib->type; + $metadata['attribute_types'][$attrib->name]['required'] = $attrib->required; + } + } + } + } + + // if not has a constructor will inject values into public properties + if (false === $metadata['has_constructor']) { + // collect all public properties + foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) { + $metadata['properties'][$property->name] = $property->name; + + // checks if the property has @var annotation + if ((false !== $propertyComment = $property->getDocComment()) + && false !== strpos($propertyComment, '@var') + && preg_match('/@var\s+([^\s]+)/',$propertyComment, $matches)) { + // literal type declaration + $value = $matches[1]; + + // handle internal type declaration + $type = isset(self::$typeMap[$value]) ? self::$typeMap[$value] : $value; + + // handle the case if the property type is mixed + if ('mixed' !== $type) { + // Checks if the property has @var array annotation + if (false !== $pos = strpos($type, '<')) { + $arrayType = substr($type, $pos+1, -1); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$property->name]['array_type'] = $arrayType; + } + + $metadata['attribute_types'][$property->name]['type'] = $type; + $metadata['attribute_types'][$property->name]['value'] = $value; + $metadata['attribute_types'][$property->name]['required'] = false !== strpos($propertyComment, '@Required'); + } + } + } + + // choose the first property as default property + $metadata['default_property'] = reset($metadata['properties']); + } + } + + self::$annotationMetadata[$name] = $metadata; + } + + /** + * Annotations ::= Annotation {[ "*" ]* [Annotation]}* + * + * @return array + */ + private function Annotations() + { + $annotations = array(); + + while (null !== $this->lexer->lookahead) { + if (DocLexer::T_AT !== $this->lexer->lookahead['type']) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is preceded by non-catchable pattern + if (null !== $this->lexer->token && $this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value'])) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is followed by either a namespace separator, or + // an identifier token + if ((null === $peek = $this->lexer->glimpse()) + || (DocLexer::T_NAMESPACE_SEPARATOR !== $peek['type'] && !in_array($peek['type'], self::$classIdentifiers, true)) + || $peek['position'] !== $this->lexer->lookahead['position'] + 1) { + $this->lexer->moveNext(); + continue; + } + + $this->isNestedAnnotation = false; + if (false !== $annot = $this->Annotation()) { + $annotations[] = $annot; + } + } + + return $annotations; + } + + /** + * Annotation ::= "@" AnnotationName ["(" [Values] ")"] + * AnnotationName ::= QualifiedName | SimpleName + * QualifiedName ::= NameSpacePart "\" {NameSpacePart "\"}* SimpleName + * NameSpacePart ::= identifier | null | false | true + * SimpleName ::= identifier | null | false | true + * + * @return mixed False if it is not a valid annotation. + */ + private function Annotation() + { + $this->match(DocLexer::T_AT); + + // check if we have an annotation + if ($this->lexer->isNextTokenAny(self::$classIdentifiers)) { + $this->lexer->moveNext(); + $name = $this->lexer->token['value']; + } else if ($this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) { + $name = ''; + } else { + $this->syntaxError('namespace separator or identifier'); + } + + while ($this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value']) && $this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) { + $this->match(DocLexer::T_NAMESPACE_SEPARATOR); + $this->matchAny(self::$classIdentifiers); + $name .= '\\'.$this->lexer->token['value']; + } + + // only process names which are not fully qualified, yet + // fully qualified names must start with a \ + $originalName = $name; + if ('\\' !== $name[0]) { + $alias = (false === $pos = strpos($name, '\\'))? $name : substr($name, 0, $pos); + + $found = false; + if ($this->namespaces) { + foreach ($this->namespaces as $namespace) { + if ($this->classExists($namespace.'\\'.$name)) { + $name = $namespace.'\\'.$name; + $found = true; + break; + } + } + } elseif (isset($this->imports[$loweredAlias = strtolower($alias)])) { + if (false !== $pos) { + $name = $this->imports[$loweredAlias].substr($name, $pos); + } else { + $name = $this->imports[$loweredAlias]; + } + $found = true; + } elseif (isset($this->imports['__NAMESPACE__']) && $this->classExists($this->imports['__NAMESPACE__'].'\\'.$name)) { + $name = $this->imports['__NAMESPACE__'].'\\'.$name; + $found = true; + } elseif ($this->classExists($name)) { + $found = true; + } + + if (!$found) { + if ($this->ignoreNotImportedAnnotations || isset($this->ignoredAnnotationNames[$name])) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s was never imported. Did you maybe forget to add a "use" statement for this annotation?', $name, $this->context)); + } + } + + if (!$this->classExists($name)) { + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s does not exist, or could not be auto-loaded.', $name, $this->context)); + } + + // at this point, $name contains the fully qualified class name of the + // annotation, and it is also guaranteed that this class exists, and + // that it is loaded + + + // collects the metadata annotation only if there is not yet + if (!isset(self::$annotationMetadata[$name])) { + $this->collectAnnotationMetadata($name); + } + + // verify that the class is really meant to be an annotation and not just any ordinary class + if (self::$annotationMetadata[$name]['is_annotation'] === false) { + if (isset($this->ignoredAnnotationNames[$originalName])) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The class "%s" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "%s". If it is indeed no annotation, then you need to add @IgnoreAnnotation("%s") to the _class_ doc comment of %s.', $name, $name, $originalName, $this->context)); + } + + //if target is nested annotation + $target = $this->isNestedAnnotation ? Target::TARGET_ANNOTATION : $this->target; + + // Next will be nested + $this->isNestedAnnotation = true; + + //if annotation does not support current target + if (0 === (self::$annotationMetadata[$name]['targets'] & $target) && $target) { + throw AnnotationException::semanticalError( + sprintf('Annotation @%s is not allowed to be declared on %s. You may only use this annotation on these code elements: %s.', + $originalName, $this->context, self::$annotationMetadata[$name]['targets_literal']) + ); + } + + $values = array(); + if ($this->lexer->isNextToken(DocLexer::T_OPEN_PARENTHESIS)) { + $this->match(DocLexer::T_OPEN_PARENTHESIS); + + if ( ! $this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) { + $values = $this->Values(); + } + + $this->match(DocLexer::T_CLOSE_PARENTHESIS); + } + + // checks all declared attributes + foreach (self::$annotationMetadata[$name]['attribute_types'] as $property => $type) { + if ($property === self::$annotationMetadata[$name]['default_property'] + && !isset($values[$property]) && isset($values['value'])) { + $property = 'value'; + } + + // handle a not given attribute or null value + if (!isset($values[$property])) { + if ($type['required']) { + throw AnnotationException::requiredError($property, $originalName, $this->context, 'a(n) '.$type['value']); + } + + continue; + } + + if ($type['type'] === 'array') { + // handle the case of a single value + if (!is_array($values[$property])) { + $values[$property] = array($values[$property]); + } + + // checks if the attribute has array type declaration, such as "array" + if (isset($type['array_type'])) { + foreach ($values[$property] as $item) { + if (gettype($item) !== $type['array_type'] && !$item instanceof $type['array_type']) { + throw AnnotationException::typeError($property, $originalName, $this->context, 'either a(n) '.$type['array_type'].', or an array of '.$type['array_type'].'s', $item); + } + } + } + } elseif (gettype($values[$property]) !== $type['type'] && !$values[$property] instanceof $type['type']) { + throw AnnotationException::typeError($property, $originalName, $this->context, 'a(n) '.$type['value'], $values[$property]); + } + } + + // check if the annotation expects values via the constructor, + // or directly injected into public properties + if (self::$annotationMetadata[$name]['has_constructor'] === true) { + return new $name($values); + } + + $instance = new $name(); + foreach ($values as $property => $value) { + if (!isset(self::$annotationMetadata[$name]['properties'][$property])) { + if ('value' !== $property) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not have a property named "%s". Available properties: %s', $originalName, $this->context, $property, implode(', ', self::$annotationMetadata[$name]['properties']))); + } + + // handle the case if the property has no annotations + if (!$property = self::$annotationMetadata[$name]['default_property']) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not accept any values, but got %s.', $originalName, $this->context, json_encode($values))); + } + } + + $instance->{$property} = $value; + } + + return $instance; + } + + /** + * Values ::= Array | Value {"," Value}* + * + * @return array + */ + private function Values() + { + $values = array(); + + // Handle the case of a single array as value, i.e. @Foo({....}) + if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { + $values['value'] = $this->Value(); + return $values; + } + + $values[] = $this->Value(); + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + $token = $this->lexer->lookahead; + $value = $this->Value(); + + if ( ! is_object($value) && ! is_array($value)) { + $this->syntaxError('Value', $token); + } + + $values[] = $value; + } + + foreach ($values as $k => $value) { + if (is_object($value) && $value instanceof \stdClass) { + $values[$value->name] = $value->value; + } else if ( ! isset($values['value'])){ + $values['value'] = $value; + } else { + if ( ! is_array($values['value'])) { + $values['value'] = array($values['value']); + } + + $values['value'][] = $value; + } + + unset($values[$k]); + } + + return $values; + } + + /** + * Value ::= PlainValue | FieldAssignment + * + * @return mixed + */ + private function Value() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type']) { + return $this->FieldAssignment(); + } + + return $this->PlainValue(); + } + + /** + * PlainValue ::= integer | string | float | boolean | Array | Annotation + * + * @return mixed + */ + private function PlainValue() + { + if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { + return $this->Arrayx(); + } + + if ($this->lexer->isNextToken(DocLexer::T_AT)) { + return $this->Annotation(); + } + + switch ($this->lexer->lookahead['type']) { + case DocLexer::T_STRING: + $this->match(DocLexer::T_STRING); + return $this->lexer->token['value']; + + case DocLexer::T_INTEGER: + $this->match(DocLexer::T_INTEGER); + return (int)$this->lexer->token['value']; + + case DocLexer::T_FLOAT: + $this->match(DocLexer::T_FLOAT); + return (float)$this->lexer->token['value']; + + case DocLexer::T_TRUE: + $this->match(DocLexer::T_TRUE); + return true; + + case DocLexer::T_FALSE: + $this->match(DocLexer::T_FALSE); + return false; + + case DocLexer::T_NULL: + $this->match(DocLexer::T_NULL); + return null; + + default: + $this->syntaxError('PlainValue'); + } + } + + /** + * FieldAssignment ::= FieldName "=" PlainValue + * FieldName ::= identifier + * + * @return array + */ + private function FieldAssignment() + { + $this->match(DocLexer::T_IDENTIFIER); + $fieldName = $this->lexer->token['value']; + + $this->match(DocLexer::T_EQUALS); + + $item = new \stdClass(); + $item->name = $fieldName; + $item->value = $this->PlainValue(); + + return $item; + } + + /** + * Array ::= "{" ArrayEntry {"," ArrayEntry}* [","] "}" + * + * @return array + */ + private function Arrayx() + { + $array = $values = array(); + + $this->match(DocLexer::T_OPEN_CURLY_BRACES); + $values[] = $this->ArrayEntry(); + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + + // optional trailing comma + if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) { + break; + } + + $values[] = $this->ArrayEntry(); + } + + $this->match(DocLexer::T_CLOSE_CURLY_BRACES); + + foreach ($values as $value) { + list ($key, $val) = $value; + + if ($key !== null) { + $array[$key] = $val; + } else { + $array[] = $val; + } + } + + return $array; + } + + /** + * ArrayEntry ::= Value | KeyValuePair + * KeyValuePair ::= Key ("=" | ":") PlainValue + * Key ::= string | integer + * + * @return array + */ + private function ArrayEntry() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type'] + || DocLexer::T_COLON === $peek['type']) { + $this->matchAny(array(DocLexer::T_INTEGER, DocLexer::T_STRING)); + + $key = $this->lexer->token['value']; + $this->matchAny(array(DocLexer::T_EQUALS, DocLexer::T_COLON)); + + return array($key, $this->PlainValue()); + } + + return array(null, $this->Value()); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php new file mode 100644 index 00000000..4a42b583 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php @@ -0,0 +1,209 @@ +. + */ + +namespace Doctrine\Common\Annotations; + + +/** + * File cache reader for annotations. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + */ +class FileCacheReader implements Reader +{ + /** + * @var Reader + */ + private $reader; + private $dir; + private $debug; + private $loadedAnnotations = array(); + + public function __construct(Reader $reader, $cacheDir, $debug = false) + { + $this->reader = $reader; + if (!is_dir($cacheDir) && !@mkdir($cacheDir, 0777, true)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist and could not be created.', $cacheDir)); + } + if (!is_writable($cacheDir)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" is not writable. Both, the webserver and the console user need access. You can manage access rights for multiple users with "chmod +a". If your system does not support this, check out the acl package.', $cacheDir)); + } + + $this->dir = rtrim($cacheDir, '\\/'); + $this->debug = $debug; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $key = $class->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + @unlink($path); + + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $key = $class->getName().'$'.$property->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + unlink($path); + + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $key = $class->getName().'#'.$method->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + unlink($path); + + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + private function saveCacheFile($path, $data) + { + file_put_contents($path, 'getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = array(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php new file mode 100644 index 00000000..1eea4921 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php @@ -0,0 +1,94 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Reader; + +/** + * Allows the reader to be used in-place of Doctrine's reader. + * + * @author Johannes M. Schmitt + */ +class IndexedReader implements Reader +{ + private $delegate; + + public function __construct(Reader $reader) + { + $this->delegate = $reader; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $annotations = array(); + foreach ($this->delegate->getClassAnnotations($class) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getClassAnnotation(\ReflectionClass $class, $annotation) + { + return $this->delegate->getClassAnnotation($class, $annotation); + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $annotations = array(); + foreach ($this->delegate->getMethodAnnotations($method) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getMethodAnnotation(\ReflectionMethod $method, $annotation) + { + return $this->delegate->getMethodAnnotation($method, $annotation); + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $annotations = array(); + foreach ($this->delegate->getPropertyAnnotations($property) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getPropertyAnnotation(\ReflectionProperty $property, $annotation) + { + return $this->delegate->getPropertyAnnotation($property, $annotation); + } + + /** + * Proxy all methods to the delegate. + * + * @param type $method + * @param type $args + * @return type + */ + public function __call($method, $args) + { + return call_user_func_array(array($this->delegate, $method), $args); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php new file mode 100644 index 00000000..a14f8f5b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php @@ -0,0 +1,203 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use SplFileObject; + +/** + * Parses a file for namespaces/use/class declarations. + * + * @author Fabien Potencier + * @author Christian Kaps + */ +final class PhpParser +{ + /** + * The token list. + * + * @var array + */ + private $tokens; + + /** + * The number of tokens. + * + * @var int + */ + private $numTokens = 0; + + /** + * The current array pointer. + * + * @var int + */ + private $pointer = 0; + + /** + * Parses a class. + * + * @param \ReflectionClass $class A ReflectionClass object. + * @return array A list with use statements in the form (Alias => FQN). + */ + public function parseClass(\ReflectionClass $class) + { + if (false === $filename = $class->getFilename()) { + return array(); + } + + $content = $this->getFileContent($filename, $class->getStartLine()); + $namespace = str_replace('\\', '\\\\', $class->getNamespaceName()); + $content = preg_replace('/^.*?(\bnamespace\s+' . $namespace . '\s*[;{].*)$/s', '\\1', $content); + $this->tokens = token_get_all('numTokens = count($this->tokens); + $this->pointer = 0; + + $statements = $this->parseUseStatements($class->getNamespaceName()); + + return $statements; + } + + /** + * Get the content of the file right up to the given line number. + * + * @param string $filename The name of the file to load. + * @param int $lineNumber The number of lines to read from file. + * @return string The content of the file. + */ + private function getFileContent($filename, $lineNumber) + { + $content = ''; + $lineCnt = 0; + $file = new SplFileObject($filename); + while(!$file->eof()) { + if ($lineCnt++ == $lineNumber) { + break; + } + + $content .= $file->fgets(); + } + + return $content; + } + + /** + * Gets the next non whitespace and non comment token. + * + * @return array The token if exists, null otherwise. + */ + private function next() + { + for ($i = $this->pointer; $i < $this->numTokens; $i++) { + $this->pointer++; + if ($this->tokens[$i][0] === T_WHITESPACE || + $this->tokens[$i][0] === T_COMMENT || + $this->tokens[$i][0] === T_DOC_COMMENT) { + + continue; + } + + return $this->tokens[$i]; + } + + return null; + } + + /** + * Get all use statements. + * + * @param string $namespaceName The namespace name of the reflected class. + * @return array A list with all found use statements. + */ + private function parseUseStatements($namespaceName) + { + $statements = array(); + while (($token = $this->next())) { + if ($token[0] === T_USE) { + $statements = array_merge($statements, $this->parseUseStatement()); + continue; + } else if ($token[0] !== T_NAMESPACE || $this->parseNamespace() != $namespaceName) { + continue; + } + + // Get fresh array for new namespace. This is to prevent the parser to collect the use statements + // for a previous namespace with the same name. This is the case if a namespace is defined twice + // or if a namespace with the same name is commented out. + $statements = array(); + } + + return $statements; + } + + /** + * Get the namespace name. + * + * @return string The found namespace name. + */ + private function parseNamespace() + { + $namespace = ''; + while (($token = $this->next())){ + if ($token[0] === T_STRING || $token[0] === T_NS_SEPARATOR) { + $namespace .= $token[1]; + } else { + break; + } + } + + return $namespace; + } + + /** + * Parse a single use statement. + * + * @return array A list with all found class names for a use statement. + */ + private function parseUseStatement() + { + $class = ''; + $alias = ''; + $statements = array(); + $explicitAlias = false; + while (($token = $this->next())) { + $isNameToken = $token[0] === T_STRING || $token[0] === T_NS_SEPARATOR; + if (!$explicitAlias && $isNameToken) { + $class .= $token[1]; + $alias = $token[1]; + } else if ($explicitAlias && $isNameToken) { + $alias .= $token[1]; + } else if ($token[0] === T_AS) { + $explicitAlias = true; + $alias = ''; + } else if ($token === ',') { + $statements[strtolower($alias)] = $class; + $class = ''; + $alias = ''; + $explicitAlias = false; + } else if ($token === ';') { + $statements[strtolower($alias)] = $class; + break; + } else { + break; + } + } + + return $statements; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php new file mode 100644 index 00000000..8e85d392 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php @@ -0,0 +1,35 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Interface for annotation readers. + * + * @author Johannes M. Schmitt + */ +interface Reader +{ + function getClassAnnotations(\ReflectionClass $class); + function getClassAnnotation(\ReflectionClass $class, $annotationName); + function getMethodAnnotations(\ReflectionMethod $method); + function getMethodAnnotation(\ReflectionMethod $method, $annotationName); + function getPropertyAnnotations(\ReflectionProperty $property); + function getPropertyAnnotation(\ReflectionProperty $property, $annotationName); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php new file mode 100644 index 00000000..a13c7fa0 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php @@ -0,0 +1,152 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\Target; + +/** + * Simple Annotation Reader. + * + * This annotation reader is intended to be used in projects where you have + * full-control over all annotations that are available. + * + * @since 2.2 + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +class SimpleAnnotationReader implements Reader +{ + /** + * @var DocParser + */ + private $parser; + + /** + * Constructor. + * + * Initializes a new SimpleAnnotationReader. + */ + public function __construct() + { + $this->parser = new DocParser(); + $this->parser->setIgnoreNotImportedAnnotations(true); + } + + /** + * Adds a namespace in which we will look for annotations. + * + * @param string $namespace + */ + public function addNamespace($namespace) + { + $this->parser->addNamespace($namespace); + } + + /** + * Gets the annotations applied to a class. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @return array An array of Annotations. + */ + public function getClassAnnotations(\ReflectionClass $class) + { + return $this->parser->parse($class->getDocComment(), 'class '.$class->getName()); + } + + /** + * Gets the annotations applied to a method. + * + * @param ReflectionMethod $property The ReflectionMethod of the method from which + * the annotations should be read. + * @return array An array of Annotations. + */ + public function getMethodAnnotations(\ReflectionMethod $method) + { + return $this->parser->parse($method->getDocComment(), 'method '.$method->getDeclaringClass()->name.'::'.$method->getName().'()'); + } + + /** + * Gets the annotations applied to a property. + * + * @param ReflectionProperty $property The ReflectionProperty of the property + * from which the annotations should be read. + * @return array An array of Annotations. + */ + public function getPropertyAnnotations(\ReflectionProperty $property) + { + return $this->parser->parse($property->getDocComment(), 'property '.$property->getDeclaringClass()->name.'::$'.$property->getName()); + } + + /** + * Gets a class annotation. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php new file mode 100644 index 00000000..a59296f5 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php @@ -0,0 +1,97 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * APC cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class ApcCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return apc_fetch($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + $found = false; + + apc_fetch($id, $found); + + return $found; + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return (bool) apc_store($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return apc_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return apc_clear_cache() && apc_clear_cache('user'); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = apc_cache_info(); + $sma = apc_sma_info(); + + return array( + Cache::STATS_HITS => $info['num_hits'], + Cache::STATS_MISSES => $info['num_misses'], + Cache::STATS_UPTIME => $info['start_time'], + Cache::STATS_MEMORY_USAGE => $info['mem_size'], + Cache::STATS_MEMORY_AVAILIABLE => $sma['avail_mem'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php new file mode 100644 index 00000000..8a0b982b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php @@ -0,0 +1,96 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Array cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class ArrayCache extends CacheProvider +{ + /** + * @var array $data + */ + private $data = array(); + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return (isset($this->data[$id])) ? $this->data[$id] : false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return isset($this->data[$id]); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + $this->data[$id] = $data; + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + unset($this->data[$id]); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->data = array(); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php new file mode 100644 index 00000000..d303bde4 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php @@ -0,0 +1,102 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Interface for cache drivers. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Fabio B. Silva + */ +interface Cache +{ + const STATS_HITS = 'hits'; + const STATS_MISSES = 'misses'; + const STATS_UPTIME = 'uptime'; + const STATS_MEMORY_USAGE = 'memory_usage'; + const STATS_MEMORY_AVAILIABLE = 'memory_available'; + + /** + * Fetches an entry from the cache. + * + * @param string $id cache id The id of the cache entry to fetch. + * @return string The cached data or FALSE, if no cache entry exists for the given id. + */ + function fetch($id); + + /** + * Test if an entry exists in the cache. + * + * @param string $id cache id The cache id of the entry to check for. + * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. + */ + function contains($id); + + /** + * Puts data into the cache. + * + * @param string $id The cache id. + * @param string $data The cache entry/data. + * @param int $lifeTime The lifetime. If != 0, sets a specific lifetime for this cache entry (0 => infinite lifeTime). + * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. + */ + function save($id, $data, $lifeTime = 0); + + /** + * Deletes a cache entry. + * + * @param string $id cache id + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + function delete($id); + + /** + * Retrieves cached information from data store + * + * The server's statistics array has the following values: + * + * - hits + * Number of keys that have been requested and found present. + * + * - misses + * Number of items that have been requested and not found. + * + * - uptime + * Time that the server is running. + * + * - memory_usage + * Memory used by this server to store items. + * + * - memory_available + * Memory allowed to use for storage. + * + * @since 2.2 + * @var array Associative array with server's statistics if available, NULL otherwise. + */ + function getStats(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php new file mode 100644 index 00000000..fa11fc22 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php @@ -0,0 +1,188 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Base class for cache provider implementations. + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Fabio B. Silva + */ +abstract class CacheProvider implements Cache +{ + const DOCTRINE_NAMESPACE_CACHEKEY = 'DoctrineNamespaceCacheKey[%s]'; + + /** + * @var string The namespace to prefix all cache ids with + */ + private $namespace = ''; + + /** + * Set the namespace to prefix all cache ids with. + * + * @param string $namespace + * @return void + */ + public function setNamespace($namespace) + { + $this->namespace = (string) $namespace; + } + + /** + * Retrieve the namespace that prefixes all cache ids. + * + * @return string + */ + public function getNamespace() + { + return $this->namespace; + } + + /** + * {@inheritdoc} + */ + public function fetch($id) + { + return $this->doFetch($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function contains($id) + { + return $this->doContains($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function save($id, $data, $lifeTime = 0) + { + return $this->doSave($this->getNamespacedId($id), $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + public function delete($id) + { + return $this->doDelete($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function getStats() + { + return $this->doGetStats(); + } + + /** + * Deletes all cache entries. + * + * @return boolean TRUE if the cache entries were successfully flushed, FALSE otherwise. + */ + public function flushAll() + { + return $this->doFlush(); + } + + /** + * Delete all cache entries. + * + * @return boolean TRUE if the cache entries were successfully deleted, FALSE otherwise. + */ + public function deleteAll() + { + $namespaceCacheKey = sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); + $namespaceVersion = ($this->doContains($namespaceCacheKey)) ? $this->doFetch($namespaceCacheKey) : 1; + + return $this->doSave($namespaceCacheKey, $namespaceVersion + 1); + } + + /** + * Prefix the passed id with the configured namespace value + * + * @param string $id The id to namespace + * @return string $id The namespaced id + */ + private function getNamespacedId($id) + { + $namespaceCacheKey = sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); + $namespaceVersion = ($this->doContains($namespaceCacheKey)) ? $this->doFetch($namespaceCacheKey) : 1; + + return sprintf('%s[%s][%s]', $this->namespace, $id, $namespaceVersion); + } + + /** + * Fetches an entry from the cache. + * + * @param string $id cache id The id of the cache entry to fetch. + * @return string The cached data or FALSE, if no cache entry exists for the given id. + */ + abstract protected function doFetch($id); + + /** + * Test if an entry exists in the cache. + * + * @param string $id cache id The cache id of the entry to check for. + * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. + */ + abstract protected function doContains($id); + + /** + * Puts data into the cache. + * + * @param string $id The cache id. + * @param string $data The cache entry/data. + * @param int $lifeTime The lifetime. If != false, sets a specific lifetime for this cache entry (null => infinite lifeTime). + * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. + */ + abstract protected function doSave($id, $data, $lifeTime = false); + + /** + * Deletes a cache entry. + * + * @param string $id cache id + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + abstract protected function doDelete($id); + + /** + * Deletes all cache entries. + * + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + abstract protected function doFlush(); + + /** + * Retrieves cached information from data store + * + * @since 2.2 + * @return array An associative array with server's statistics if available, NULL otherwise. + */ + abstract protected function doGetStats(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php new file mode 100644 index 00000000..dd6d1e31 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php @@ -0,0 +1,121 @@ +. + */ + +namespace Doctrine\Common\Cache; + +use \Memcache; + +/** + * Memcache cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class MemcacheCache extends CacheProvider +{ + /** + * @var Memcache + */ + private $memcache; + + /** + * Sets the memcache instance to use. + * + * @param Memcache $memcache + */ + public function setMemcache(Memcache $memcache) + { + $this->memcache = $memcache; + } + + /** + * Gets the memcache instance used by the cache. + * + * @return Memcache + */ + public function getMemcache() + { + return $this->memcache; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcache->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (bool) $this->memcache->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + return $this->memcache->set($id, $data, 0, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->memcache->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcache->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcache->getStats(); + return array( + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php new file mode 100644 index 00000000..4675fae7 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php @@ -0,0 +1,124 @@ +. + */ + +namespace Doctrine\Common\Cache; + +use \Memcached; + +/** + * Memcached cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class MemcachedCache extends CacheProvider +{ + /** + * @var Memcached + */ + private $memcached; + + /** + * Sets the memcache instance to use. + * + * @param Memcached $memcached + */ + public function setMemcached(Memcached $memcached) + { + $this->memcached = $memcached; + } + + /** + * Gets the memcached instance used by the cache. + * + * @return Memcached + */ + public function getMemcached() + { + return $this->memcached; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcached->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (false !== $this->memcached->get($id)); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + return $this->memcached->set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->memcached->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcached->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcached->getStats(); + $servers = $this->memcached->getServerList(); + $key = $servers[0]['host'] . ':' . $servers[0]['port']; + $stats = $stats[$key]; + return array( + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php new file mode 100644 index 00000000..ed8ca74a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php @@ -0,0 +1,92 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * WinCache cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class WincacheCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return wincache_ucache_get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return wincache_ucache_exists($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return (bool) wincache_ucache_set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return wincache_ucache_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return wincache_ucache_clear(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = wincache_ucache_info(); + $meminfo= wincache_ucache_meminfo(); + return array( + Cache::STATS_HITS => $info['total_hit_count'], + Cache::STATS_MISSES => $info['total_miss_count'], + Cache::STATS_UPTIME => $info['total_cache_uptime'], + Cache::STATS_MEMORY_USAGE => $meminfo['memory_total'], + Cache::STATS_MEMORY_AVAILIABLE => $meminfo['memory_free'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php new file mode 100644 index 00000000..6e22d265 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php @@ -0,0 +1,110 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Xcache cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class XcacheCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->doContains($id) ? unserialize(xcache_get($id)) : false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return xcache_isset($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return xcache_set($id, serialize($data), (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return xcache_unset($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->checkAuthorization(); + + xcache_clear_cache(XC_TYPE_VAR, 0); + + return true; + } + + /** + * Checks that xcache.admin.enable_auth is Off + * + * @throws \BadMethodCallException When xcache.admin.enable_auth is On + * @return void + */ + protected function checkAuthorization() + { + if (ini_get('xcache.admin.enable_auth')) { + throw new \BadMethodCallException('To use all features of \Doctrine\Common\Cache\XcacheCache, you must set "xcache.admin.enable_auth" to "Off" in your php.ini.'); + } + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $this->checkAuthorization(); + + $info = xcache_info(XC_TYPE_VAR, 0); + return array( + Cache::STATS_HITS => $info['hits'], + Cache::STATS_MISSES => $info['misses'], + Cache::STATS_UPTIME => null, + Cache::STATS_MEMORY_USAGE => $info['size'], + Cache::STATS_MEMORY_AVAILIABLE => $info['avail'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php new file mode 100644 index 00000000..4e4dabe7 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php @@ -0,0 +1,84 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Zend Data Cache cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Ralph Schindler + * @author Guilherme Blanco + */ +class ZendDataCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return zend_shm_cache_fetch($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (false !== zend_shm_cache_fetch($id)); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return zend_shm_cache_store($id, $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return zend_shm_cache_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $namespace = $this->getNamespace(); + if (empty($namespace)) { + return zend_shm_cache_clear(); + } + return zend_shm_cache_clear($namespace); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php new file mode 100644 index 00000000..375b0d6b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php @@ -0,0 +1,262 @@ +. + */ + +namespace Doctrine\Common; + +/** + * A ClassLoader is an autoloader for class files that can be + * installed on the SPL autoload stack. It is a class loader that either loads only classes + * of a specific namespace or all namespaces and it is suitable for working together + * with other autoloaders in the SPL autoload stack. + * + * If no include path is configured through the constructor or {@link setIncludePath}, a ClassLoader + * relies on the PHP include_path. + * + * @author Roman Borschel + * @since 2.0 + */ +class ClassLoader +{ + /** + * @var string PHP file extension + */ + protected $fileExtension = '.php'; + + /** + * @var string Current namespace + */ + protected $namespace; + + /** + * @var string Current include path + */ + protected $includePath; + + /** + * @var string PHP namespace separator + */ + protected $namespaceSeparator = '\\'; + + /** + * Creates a new ClassLoader that loads classes of the + * specified namespace from the specified include path. + * + * If no include path is given, the ClassLoader relies on the PHP include_path. + * If neither a namespace nor an include path is given, the ClassLoader will + * be responsible for loading all classes, thereby relying on the PHP include_path. + * + * @param string $ns The namespace of the classes to load. + * @param string $includePath The base include path to use. + */ + public function __construct($ns = null, $includePath = null) + { + $this->namespace = $ns; + $this->includePath = $includePath; + } + + /** + * Sets the namespace separator used by classes in the namespace of this ClassLoader. + * + * @param string $sep The separator to use. + */ + public function setNamespaceSeparator($sep) + { + $this->namespaceSeparator = $sep; + } + + /** + * Gets the namespace separator used by classes in the namespace of this ClassLoader. + * + * @return string + */ + public function getNamespaceSeparator() + { + return $this->namespaceSeparator; + } + + /** + * Sets the base include path for all class files in the namespace of this ClassLoader. + * + * @param string $includePath + */ + public function setIncludePath($includePath) + { + $this->includePath = $includePath; + } + + /** + * Gets the base include path for all class files in the namespace of this ClassLoader. + * + * @return string + */ + public function getIncludePath() + { + return $this->includePath; + } + + /** + * Sets the file extension of class files in the namespace of this ClassLoader. + * + * @param string $fileExtension + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * Gets the file extension of class files in the namespace of this ClassLoader. + * + * @return string + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Registers this ClassLoader on the SPL autoload stack. + */ + public function register() + { + spl_autoload_register(array($this, 'loadClass')); + } + + /** + * Removes this ClassLoader from the SPL autoload stack. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $classname The name of the class to load. + * @return boolean TRUE if the class has been successfully loaded, FALSE otherwise. + */ + public function loadClass($className) + { + if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) { + return false; + } + + require ($this->includePath !== null ? $this->includePath . DIRECTORY_SEPARATOR : '') + . str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) + . $this->fileExtension; + + return true; + } + + /** + * Asks this ClassLoader whether it can potentially load the class (file) with + * the given name. + * + * @param string $className The fully-qualified name of the class. + * @return boolean TRUE if this ClassLoader can load the class, FALSE otherwise. + */ + public function canLoadClass($className) + { + if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) { + return false; + } + + $file = str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) . $this->fileExtension; + + if ($this->includePath !== null) { + return file_exists($this->includePath . DIRECTORY_SEPARATOR . $file); + } + + return (false !== stream_resolve_include_path($file)); + } + + /** + * Checks whether a class with a given name exists. A class "exists" if it is either + * already defined in the current request or if there is an autoloader on the SPL + * autoload stack that is a) responsible for the class in question and b) is able to + * load a class file in which the class definition resides. + * + * If the class is not already defined, each autoloader in the SPL autoload stack + * is asked whether it is able to tell if the class exists. If the autoloader is + * a ClassLoader, {@link canLoadClass} is used, otherwise the autoload + * function of the autoloader is invoked and expected to return a value that + * evaluates to TRUE if the class (file) exists. As soon as one autoloader reports + * that the class exists, TRUE is returned. + * + * Note that, depending on what kinds of autoloaders are installed on the SPL + * autoload stack, the class (file) might already be loaded as a result of checking + * for its existence. This is not the case with a ClassLoader, who separates + * these responsibilities. + * + * @param string $className The fully-qualified name of the class. + * @return boolean TRUE if the class exists as per the definition given above, FALSE otherwise. + */ + public static function classExists($className) + { + if (class_exists($className, false) || interface_exists($className, false)) { + return true; + } + + foreach (spl_autoload_functions() as $loader) { + if (is_array($loader)) { // array(???, ???) + if (is_object($loader[0])) { + if ($loader[0] instanceof ClassLoader) { // array($obj, 'methodName') + if ($loader[0]->canLoadClass($className)) { + return true; + } + } else if ($loader[0]->{$loader[1]}($className)) { + return true; + } + } else if ($loader[0]::$loader[1]($className)) { // array('ClassName', 'methodName') + return true; + } + } else if ($loader instanceof \Closure) { // function($className) {..} + if ($loader($className)) { + return true; + } + } else if (is_string($loader) && $loader($className)) { // "MyClass::loadClass" + return true; + } + } + + return class_exists($className, false) || interface_exists($className, false); + } + + /** + * Gets the ClassLoader from the SPL autoload stack that is responsible + * for (and is able to load) the class with the given name. + * + * @param string $className The name of the class. + * @return The ClassLoader for the class or NULL if no such ClassLoader exists. + */ + public static function getClassLoader($className) + { + foreach (spl_autoload_functions() as $loader) { + if (is_array($loader) + && $loader[0] instanceof ClassLoader + && $loader[0]->canLoadClass($className) + ) { + return $loader[0]; + } + } + + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php new file mode 100644 index 00000000..2a7d4eaf --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php @@ -0,0 +1,447 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Closure, ArrayIterator; + +/** + * An ArrayCollection is a Collection implementation that wraps a regular PHP array. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class ArrayCollection implements Collection +{ + /** + * An array containing the entries of this collection. + * + * @var array + */ + private $_elements; + + /** + * Initializes a new ArrayCollection. + * + * @param array $elements + */ + public function __construct(array $elements = array()) + { + $this->_elements = $elements; + } + + /** + * Gets the PHP array representation of this collection. + * + * @return array The PHP array representation of this collection. + */ + public function toArray() + { + return $this->_elements; + } + + /** + * Sets the internal iterator to the first element in the collection and + * returns this element. + * + * @return mixed + */ + public function first() + { + return reset($this->_elements); + } + + /** + * Sets the internal iterator to the last element in the collection and + * returns this element. + * + * @return mixed + */ + public function last() + { + return end($this->_elements); + } + + /** + * Gets the current key/index at the current internal iterator position. + * + * @return mixed + */ + public function key() + { + return key($this->_elements); + } + + /** + * Moves the internal iterator position to the next element. + * + * @return mixed + */ + public function next() + { + return next($this->_elements); + } + + /** + * Gets the element of the collection at the current internal iterator position. + * + * @return mixed + */ + public function current() + { + return current($this->_elements); + } + + /** + * Removes an element with a specific key/index from the collection. + * + * @param mixed $key + * @return mixed The removed element or NULL, if no element exists for the given key. + */ + public function remove($key) + { + if (isset($this->_elements[$key])) { + $removed = $this->_elements[$key]; + unset($this->_elements[$key]); + + return $removed; + } + + return null; + } + + /** + * Removes the specified element from the collection, if it is found. + * + * @param mixed $element The element to remove. + * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. + */ + public function removeElement($element) + { + $key = array_search($element, $this->_elements, true); + + if ($key !== false) { + unset($this->_elements[$key]); + + return true; + } + + return false; + } + + /** + * ArrayAccess implementation of offsetExists() + * + * @see containsKey() + */ + public function offsetExists($offset) + { + return $this->containsKey($offset); + } + + /** + * ArrayAccess implementation of offsetGet() + * + * @see get() + */ + public function offsetGet($offset) + { + return $this->get($offset); + } + + /** + * ArrayAccess implementation of offsetGet() + * + * @see add() + * @see set() + */ + public function offsetSet($offset, $value) + { + if ( ! isset($offset)) { + return $this->add($value); + } + return $this->set($offset, $value); + } + + /** + * ArrayAccess implementation of offsetUnset() + * + * @see remove() + */ + public function offsetUnset($offset) + { + return $this->remove($offset); + } + + /** + * Checks whether the collection contains a specific key/index. + * + * @param mixed $key The key to check for. + * @return boolean TRUE if the given key/index exists, FALSE otherwise. + */ + public function containsKey($key) + { + return isset($this->_elements[$key]); + } + + /** + * Checks whether the given element is contained in the collection. + * Only element values are compared, not keys. The comparison of two elements + * is strict, that means not only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element + * @return boolean TRUE if the given element is contained in the collection, + * FALSE otherwise. + */ + public function contains($element) + { + foreach ($this->_elements as $collectionElement) { + if ($element === $collectionElement) { + return true; + } + } + + return false; + } + + /** + * Tests for the existance of an element that satisfies the given predicate. + * + * @param Closure $p The predicate. + * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. + */ + public function exists(Closure $p) + { + foreach ($this->_elements as $key => $element) { + if ($p($key, $element)) { + return true; + } + } + return false; + } + + /** + * Searches for a given element and, if found, returns the corresponding key/index + * of that element. The comparison of two elements is strict, that means not + * only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element The element to search for. + * @return mixed The key/index of the element or FALSE if the element was not found. + */ + public function indexOf($element) + { + return array_search($element, $this->_elements, true); + } + + /** + * Gets the element with the given key/index. + * + * @param mixed $key The key. + * @return mixed The element or NULL, if no element exists for the given key. + */ + public function get($key) + { + if (isset($this->_elements[$key])) { + return $this->_elements[$key]; + } + return null; + } + + /** + * Gets all keys/indexes of the collection elements. + * + * @return array + */ + public function getKeys() + { + return array_keys($this->_elements); + } + + /** + * Gets all elements. + * + * @return array + */ + public function getValues() + { + return array_values($this->_elements); + } + + /** + * Returns the number of elements in the collection. + * + * Implementation of the Countable interface. + * + * @return integer The number of elements in the collection. + */ + public function count() + { + return count($this->_elements); + } + + /** + * Adds/sets an element in the collection at the index / with the specified key. + * + * When the collection is a Map this is like put(key,value)/add(key,value). + * When the collection is a List this is like add(position,value). + * + * @param mixed $key + * @param mixed $value + */ + public function set($key, $value) + { + $this->_elements[$key] = $value; + } + + /** + * Adds an element to the collection. + * + * @param mixed $value + * @return boolean Always TRUE. + */ + public function add($value) + { + $this->_elements[] = $value; + return true; + } + + /** + * Checks whether the collection is empty. + * + * Note: This is preferrable over count() == 0. + * + * @return boolean TRUE if the collection is empty, FALSE otherwise. + */ + public function isEmpty() + { + return ! $this->_elements; + } + + /** + * Gets an iterator for iterating over the elements in the collection. + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_elements); + } + + /** + * Applies the given function to each element in the collection and returns + * a new collection with the elements returned by the function. + * + * @param Closure $func + * @return Collection + */ + public function map(Closure $func) + { + return new static(array_map($func, $this->_elements)); + } + + /** + * Returns all the elements of this collection that satisfy the predicate p. + * The order of the elements is preserved. + * + * @param Closure $p The predicate used for filtering. + * @return Collection A collection with the results of the filter operation. + */ + public function filter(Closure $p) + { + return new static(array_filter($this->_elements, $p)); + } + + /** + * Applies the given predicate p to all elements of this collection, + * returning true, if the predicate yields true for all elements. + * + * @param Closure $p The predicate. + * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. + */ + public function forAll(Closure $p) + { + foreach ($this->_elements as $key => $element) { + if ( ! $p($key, $element)) { + return false; + } + } + + return true; + } + + /** + * Partitions this collection in two collections according to a predicate. + * Keys are preserved in the resulting collections. + * + * @param Closure $p The predicate on which to partition. + * @return array An array with two elements. The first element contains the collection + * of elements where the predicate returned TRUE, the second element + * contains the collection of elements where the predicate returned FALSE. + */ + public function partition(Closure $p) + { + $coll1 = $coll2 = array(); + foreach ($this->_elements as $key => $element) { + if ($p($key, $element)) { + $coll1[$key] = $element; + } else { + $coll2[$key] = $element; + } + } + return array(new static($coll1), new static($coll2)); + } + + /** + * Returns a string representation of this object. + * + * @return string + */ + public function __toString() + { + return __CLASS__ . '@' . spl_object_hash($this); + } + + /** + * Clears the collection. + */ + public function clear() + { + $this->_elements = array(); + } + + /** + * Extract a slice of $length elements starting at position $offset from the Collection. + * + * If $length is null it returns all elements from $offset to the end of the Collection. + * Keys have to be preserved by this method. Calling this method will only return the + * selected slice and NOT change the elements contained in the collection slice is called on. + * + * @param int $offset + * @param int $length + * @return array + */ + public function slice($offset, $length = null) + { + return array_slice($this->_elements, $offset, $length, true); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php new file mode 100644 index 00000000..9fca659c --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php @@ -0,0 +1,243 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Closure, Countable, IteratorAggregate, ArrayAccess; + +/** + * The missing (SPL) Collection/Array/OrderedMap interface. + * + * A Collection resembles the nature of a regular PHP array. That is, + * it is essentially an ordered map that can also be used + * like a list. + * + * A Collection has an internal iterator just like a PHP array. In addition, + * a Collection can be iterated with external iterators, which is preferrable. + * To use an external iterator simply use the foreach language construct to + * iterate over the collection (which calls {@link getIterator()} internally) or + * explicitly retrieve an iterator though {@link getIterator()} which can then be + * used to iterate over the collection. + * You can not rely on the internal iterator of the collection being at a certain + * position unless you explicitly positioned it before. Prefer iteration with + * external iterators. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface Collection extends Countable, IteratorAggregate, ArrayAccess +{ + /** + * Adds an element at the end of the collection. + * + * @param mixed $element The element to add. + * @return boolean Always TRUE. + */ + function add($element); + + /** + * Clears the collection, removing all elements. + */ + function clear(); + + /** + * Checks whether an element is contained in the collection. + * This is an O(n) operation, where n is the size of the collection. + * + * @param mixed $element The element to search for. + * @return boolean TRUE if the collection contains the element, FALSE otherwise. + */ + function contains($element); + + /** + * Checks whether the collection is empty (contains no elements). + * + * @return boolean TRUE if the collection is empty, FALSE otherwise. + */ + function isEmpty(); + + /** + * Removes the element at the specified index from the collection. + * + * @param string|integer $key The kex/index of the element to remove. + * @return mixed The removed element or NULL, if the collection did not contain the element. + */ + function remove($key); + + /** + * Removes the specified element from the collection, if it is found. + * + * @param mixed $element The element to remove. + * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. + */ + function removeElement($element); + + /** + * Checks whether the collection contains an element with the specified key/index. + * + * @param string|integer $key The key/index to check for. + * @return boolean TRUE if the collection contains an element with the specified key/index, + * FALSE otherwise. + */ + function containsKey($key); + + /** + * Gets the element at the specified key/index. + * + * @param string|integer $key The key/index of the element to retrieve. + * @return mixed + */ + function get($key); + + /** + * Gets all keys/indices of the collection. + * + * @return array The keys/indices of the collection, in the order of the corresponding + * elements in the collection. + */ + function getKeys(); + + /** + * Gets all values of the collection. + * + * @return array The values of all elements in the collection, in the order they + * appear in the collection. + */ + function getValues(); + + /** + * Sets an element in the collection at the specified key/index. + * + * @param string|integer $key The key/index of the element to set. + * @param mixed $value The element to set. + */ + function set($key, $value); + + /** + * Gets a native PHP array representation of the collection. + * + * @return array + */ + function toArray(); + + /** + * Sets the internal iterator to the first element in the collection and + * returns this element. + * + * @return mixed + */ + function first(); + + /** + * Sets the internal iterator to the last element in the collection and + * returns this element. + * + * @return mixed + */ + function last(); + + /** + * Gets the key/index of the element at the current iterator position. + * + */ + function key(); + + /** + * Gets the element of the collection at the current iterator position. + * + */ + function current(); + + /** + * Moves the internal iterator position to the next element. + * + */ + function next(); + + /** + * Tests for the existence of an element that satisfies the given predicate. + * + * @param Closure $p The predicate. + * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. + */ + function exists(Closure $p); + + /** + * Returns all the elements of this collection that satisfy the predicate p. + * The order of the elements is preserved. + * + * @param Closure $p The predicate used for filtering. + * @return Collection A collection with the results of the filter operation. + */ + function filter(Closure $p); + + /** + * Applies the given predicate p to all elements of this collection, + * returning true, if the predicate yields true for all elements. + * + * @param Closure $p The predicate. + * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. + */ + function forAll(Closure $p); + + /** + * Applies the given function to each element in the collection and returns + * a new collection with the elements returned by the function. + * + * @param Closure $func + * @return Collection + */ + function map(Closure $func); + + /** + * Partitions this collection in two collections according to a predicate. + * Keys are preserved in the resulting collections. + * + * @param Closure $p The predicate on which to partition. + * @return array An array with two elements. The first element contains the collection + * of elements where the predicate returned TRUE, the second element + * contains the collection of elements where the predicate returned FALSE. + */ + function partition(Closure $p); + + /** + * Gets the index/key of a given element. The comparison of two elements is strict, + * that means not only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element The element to search for. + * @return mixed The key/index of the element or FALSE if the element was not found. + */ + function indexOf($element); + + /** + * Extract a slice of $length elements starting at position $offset from the Collection. + * + * If $length is null it returns all elements from $offset to the end of the Collection. + * Keys have to be preserved by this method. Calling this method will only return the + * selected slice and NOT change the elements contained in the collection slice is called on. + * + * @param int $offset + * @param int $length + * @return array + */ + function slice($offset, $length = null); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php new file mode 100644 index 00000000..8c5669be --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php @@ -0,0 +1,28 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Base exception class for package Doctrine\Common + * @author heinrich + * + */ +class CommonException extends \Exception { +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php new file mode 100644 index 00000000..bc95d303 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php @@ -0,0 +1,47 @@ +. + */ + + +namespace Doctrine\Common; + +/** + * Comparable interface that allows to compare two value objects to each other for similarity. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.com + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + */ +interface Comparable +{ + /** + * Compare the current object to the passed $other. + * + * Returns 0 if they are semantically equal, 1 if the other object + * is less than the current one, or -1 if its more than the current one. + * + * This method should not check for identity using ===, only for semantical equality for example + * when two different DateTime instances point to the exact same Date + TZ. + * + * @return int + */ + public function compareTo($other); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php new file mode 100644 index 00000000..6a3c0699 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php @@ -0,0 +1,69 @@ +. + */ + +namespace Doctrine\Common; + +/** + * EventArgs is the base class for classes containing event data. + * + * This class contains no event data. It is used by events that do not pass state + * information to an event handler when an event is raised. The single empty EventArgs + * instance can be obtained through {@link getEmptyInstance}. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class EventArgs +{ + /** + * @var EventArgs Single instance of EventArgs + * @static + */ + private static $_emptyEventArgsInstance; + + /** + * Gets the single, empty and immutable EventArgs instance. + * + * This instance will be used when events are dispatched without any parameter, + * like this: EventManager::dispatchEvent('eventname'); + * + * The benefit from this is that only one empty instance is instantiated and shared + * (otherwise there would be instances for every dispatched in the abovementioned form) + * + * @see EventManager::dispatchEvent + * @link http://msdn.microsoft.com/en-us/library/system.eventargs.aspx + * @static + * @return EventArgs + */ + public static function getEmptyInstance() + { + if ( ! self::$_emptyEventArgsInstance) { + self::$_emptyEventArgsInstance = new EventArgs; + } + + return self::$_emptyEventArgsInstance; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php new file mode 100644 index 00000000..a1f11ed2 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php @@ -0,0 +1,136 @@ +. + */ + +namespace Doctrine\Common; + +/** + * The EventManager is the central point of Doctrine's event listener system. + * Listeners are registered on the manager and events are dispatched through the + * manager. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class EventManager +{ + /** + * Map of registered listeners. + * => + * + * @var array + */ + private $_listeners = array(); + + /** + * Dispatches an event to all registered listeners. + * + * @param string $eventName The name of the event to dispatch. The name of the event is + * the name of the method that is invoked on listeners. + * @param EventArgs $eventArgs The event arguments to pass to the event handlers/listeners. + * If not supplied, the single empty EventArgs instance is used. + * @return boolean + */ + public function dispatchEvent($eventName, EventArgs $eventArgs = null) + { + if (isset($this->_listeners[$eventName])) { + $eventArgs = $eventArgs === null ? EventArgs::getEmptyInstance() : $eventArgs; + + foreach ($this->_listeners[$eventName] as $listener) { + $listener->$eventName($eventArgs); + } + } + } + + /** + * Gets the listeners of a specific event or all listeners. + * + * @param string $event The name of the event. + * @return array The event listeners for the specified event, or all event listeners. + */ + public function getListeners($event = null) + { + return $event ? $this->_listeners[$event] : $this->_listeners; + } + + /** + * Checks whether an event has any registered listeners. + * + * @param string $event + * @return boolean TRUE if the specified event has any listeners, FALSE otherwise. + */ + public function hasListeners($event) + { + return isset($this->_listeners[$event]) && $this->_listeners[$event]; + } + + /** + * Adds an event listener that listens on the specified events. + * + * @param string|array $events The event(s) to listen on. + * @param object $listener The listener object. + */ + public function addEventListener($events, $listener) + { + // Picks the hash code related to that listener + $hash = spl_object_hash($listener); + + foreach ((array) $events as $event) { + // Overrides listener if a previous one was associated already + // Prevents duplicate listeners on same event (same instance only) + $this->_listeners[$event][$hash] = $listener; + } + } + + /** + * Removes an event listener from the specified events. + * + * @param string|array $events + * @param object $listener + */ + public function removeEventListener($events, $listener) + { + // Picks the hash code related to that listener + $hash = spl_object_hash($listener); + + foreach ((array) $events as $event) { + // Check if actually have this listener associated + if (isset($this->_listeners[$event][$hash])) { + unset($this->_listeners[$event][$hash]); + } + } + } + + /** + * Adds an EventSubscriber. The subscriber is asked for all the events he is + * interested in and added as a listener for these events. + * + * @param Doctrine\Common\EventSubscriber $subscriber The subscriber. + */ + public function addEventSubscriber(EventSubscriber $subscriber) + { + $this->addEventListener($subscriber->getSubscribedEvents(), $subscriber); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php new file mode 100644 index 00000000..ed3383fa --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php @@ -0,0 +1,45 @@ +. + */ + +namespace Doctrine\Common; + +/** + * An EventSubscriber knows himself what events he is interested in. + * If an EventSubscriber is added to an EventManager, the manager invokes + * {@link getSubscribedEvents} and registers the subscriber as a listener for all + * returned events. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface EventSubscriber +{ + /** + * Returns an array of events this subscriber wants to listen to. + * + * @return array + */ + function getSubscribedEvents(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php new file mode 100644 index 00000000..8df3b843 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php @@ -0,0 +1,266 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Base class for writing simple lexers, i.e. for creating small DSLs. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @todo Rename: AbstractLexer + */ +abstract class Lexer +{ + /** + * @var array Array of scanned tokens + */ + private $tokens = array(); + + /** + * @var integer Current lexer position in input string + */ + private $position = 0; + + /** + * @var integer Current peek of current lexer position + */ + private $peek = 0; + + /** + * @var array The next token in the input. + */ + public $lookahead; + + /** + * @var array The last matched/seen token. + */ + public $token; + + /** + * Sets the input data to be tokenized. + * + * The Lexer is immediately reset and the new input tokenized. + * Any unprocessed tokens from any previous input are lost. + * + * @param string $input The input to be tokenized. + */ + public function setInput($input) + { + $this->tokens = array(); + $this->reset(); + $this->scan($input); + } + + /** + * Resets the lexer. + */ + public function reset() + { + $this->lookahead = null; + $this->token = null; + $this->peek = 0; + $this->position = 0; + } + + /** + * Resets the peek pointer to 0. + */ + public function resetPeek() + { + $this->peek = 0; + } + + /** + * Resets the lexer position on the input to the given position. + * + * @param integer $position Position to place the lexical scanner + */ + public function resetPosition($position = 0) + { + $this->position = $position; + } + + /** + * Checks whether a given token matches the current lookahead. + * + * @param integer|string $token + * @return boolean + */ + public function isNextToken($token) + { + return null !== $this->lookahead && $this->lookahead['type'] === $token; + } + + /** + * Checks whether any of the given tokens matches the current lookahead + * + * @param array $tokens + * @return boolean + */ + public function isNextTokenAny(array $tokens) + { + return null !== $this->lookahead && in_array($this->lookahead['type'], $tokens, true); + } + + /** + * Moves to the next token in the input string. + * + * A token is an associative array containing three items: + * - 'value' : the string value of the token in the input string + * - 'type' : the type of the token (identifier, numeric, string, input + * parameter, none) + * - 'position' : the position of the token in the input string + * + * @return array|null the next token; null if there is no more tokens left + */ + public function moveNext() + { + $this->peek = 0; + $this->token = $this->lookahead; + $this->lookahead = (isset($this->tokens[$this->position])) + ? $this->tokens[$this->position++] : null; + + return $this->lookahead !== null; + } + + /** + * Tells the lexer to skip input tokens until it sees a token with the given value. + * + * @param $type The token type to skip until. + */ + public function skipUntil($type) + { + while ($this->lookahead !== null && $this->lookahead['type'] !== $type) { + $this->moveNext(); + } + } + + /** + * Checks if given value is identical to the given token + * + * @param mixed $value + * @param integer $token + * @return boolean + */ + public function isA($value, $token) + { + return $this->getType($value) === $token; + } + + /** + * Moves the lookahead token forward. + * + * @return array | null The next token or NULL if there are no more tokens ahead. + */ + public function peek() + { + if (isset($this->tokens[$this->position + $this->peek])) { + return $this->tokens[$this->position + $this->peek++]; + } else { + return null; + } + } + + /** + * Peeks at the next token, returns it and immediately resets the peek. + * + * @return array|null The next token or NULL if there are no more tokens ahead. + */ + public function glimpse() + { + $peek = $this->peek(); + $this->peek = 0; + return $peek; + } + + /** + * Scans the input string for tokens. + * + * @param string $input a query string + */ + protected function scan($input) + { + static $regex; + + if ( ! isset($regex)) { + $regex = '/(' . implode(')|(', $this->getCatchablePatterns()) . ')|' + . implode('|', $this->getNonCatchablePatterns()) . '/i'; + } + + $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE; + $matches = preg_split($regex, $input, -1, $flags); + + foreach ($matches as $match) { + // Must remain before 'value' assignment since it can change content + $type = $this->getType($match[0]); + + $this->tokens[] = array( + 'value' => $match[0], + 'type' => $type, + 'position' => $match[1], + ); + } + } + + /** + * Gets the literal for a given token. + * + * @param integer $token + * @return string + */ + public function getLiteral($token) + { + $className = get_class($this); + $reflClass = new \ReflectionClass($className); + $constants = $reflClass->getConstants(); + + foreach ($constants as $name => $value) { + if ($value === $token) { + return $className . '::' . $name; + } + } + + return $token; + } + + /** + * Lexical catchable patterns. + * + * @return array + */ + abstract protected function getCatchablePatterns(); + + /** + * Lexical non-catchable patterns. + * + * @return array + */ + abstract protected function getNonCatchablePatterns(); + + /** + * Retrieve token type. Also processes the token value if necessary. + * + * @param string $value + * @return integer + */ + abstract protected function getType(&$value); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php new file mode 100644 index 00000000..93e504ae --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php @@ -0,0 +1,45 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Contract for classes that provide the service of notifying listeners of + * changes to their properties. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface NotifyPropertyChanged +{ + /** + * Adds a listener that wants to be notified about property changes. + * + * @param PropertyChangedListener $listener + */ + function addPropertyChangedListener(PropertyChangedListener $listener); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php new file mode 100644 index 00000000..9fff343c --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php @@ -0,0 +1,224 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\ManagerRegistry; + +/** + * Abstract implementation of the ManagerRegistry contract. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +abstract class AbstractManagerRegistry implements ManagerRegistry +{ + private $name; + private $connections; + private $managers; + private $defaultConnection; + private $defaultManager; + private $proxyInterfaceName; + + public function __construct($name, array $connections, array $managers, $defaultConnection, $defaultManager, $proxyInterfaceName) + { + $this->name = $name; + $this->connections = $connections; + $this->managers = $managers; + $this->defaultConnection = $defaultConnection; + $this->defaultManager = $defaultManager; + $this->proxyInterfaceName = $proxyInterfaceName; + } + + /** + * Fetches/creates the given services + * + * A service in this context is connection or a manager instance + * + * @param string $name name of the service + * @return object instance of the given service + */ + abstract protected function getService($name); + + /** + * Resets the given services + * + * A service in this context is connection or a manager instance + * + * @param string $name name of the service + * @return void + */ + abstract protected function resetService($name); + + /** + * Get the name of the registry + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @inheritdoc + */ + public function getConnection($name = null) + { + if (null === $name) { + $name = $this->defaultConnection; + } + + if (!isset($this->connections[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Connection named "%s" does not exist.', $this->name, $name)); + } + + return $this->getService($this->connections[$name]); + } + + /** + * @inheritdoc + */ + public function getConnectionNames() + { + return $this->connections; + } + + /** + * @inheritdoc + */ + public function getConnections() + { + $connections = array(); + foreach ($this->connections as $name => $id) { + $connections[$name] = $this->getService($id); + } + + return $connections; + } + + /** + * @inheritdoc + */ + public function getDefaultConnectionName() + { + return $this->defaultConnection; + } + + /** + * @inheritdoc + */ + public function getDefaultManagerName() + { + return $this->defaultManager; + } + + /** + * @inheritdoc + */ + public function getManager($name = null) + { + if (null === $name) { + $name = $this->defaultManager; + } + + if (!isset($this->managers[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); + } + + return $this->getService($this->managers[$name]); + } + + /** + * @inheritdoc + */ + public function getManagerForClass($class) + { + // Check for namespace alias + if (strpos($class, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $class); + $class = $this->getAliasNamespace($namespaceAlias) . '\\' . $simpleClassName; + } + + $proxyClass = new \ReflectionClass($class); + if ($proxyClass->implementsInterface($this->proxyInterfaceName)) { + $class = $proxyClass->getParentClass()->getName(); + } + + foreach ($this->managers as $id) { + $manager = $this->getService($id); + + if (!$manager->getMetadataFactory()->isTransient($class)) { + return $manager; + } + } + } + + /** + * @inheritdoc + */ + public function getManagerNames() + { + return $this->managers; + } + + /** + * @inheritdoc + */ + public function getManagers() + { + $dms = array(); + foreach ($this->managers as $name => $id) { + $dms[$name] = $this->getService($id); + } + + return $dms; + } + + /** + * @inheritdoc + */ + public function getRepository($persistentObjectName, $persistentManagerName = null) + { + return $this->getManager($persistentManagerName)->getRepository($persistentObjectName); + } + + /** + * @inheritdoc + */ + public function resetManager($name = null) + { + if (null === $name) { + $name = $this->defaultManager; + } + + if (!isset($this->managers[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); + } + + // force the creation of a new document manager + // if the current one is closed + $this->resetService($this->managers[$name]); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php new file mode 100644 index 00000000..a47727fa --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php @@ -0,0 +1,63 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract covering connection for a Doctrine persistence layer ManagerRegistry class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +interface ConnectionRegistry +{ + /** + * Gets the default connection name. + * + * @return string The default connection name + */ + function getDefaultConnectionName(); + + /** + * Gets the named connection. + * + * @param string $name The connection name (null for the default one) + * + * @return Connection + */ + function getConnection($name = null); + + /** + * Gets an array of all registered connections + * + * @return array An array of Connection instances + */ + function getConnections(); + + /** + * Gets all connection names. + * + * @return array An array of connection names + */ + function getConnectionNames(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php new file mode 100644 index 00000000..8055b66d --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php @@ -0,0 +1,77 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs; +use Doctrine\Common\Persistence\ObjectManager; + +/** + * Lifecycle Events are triggered by the UnitOfWork during lifecycle transitions + * of entities. + * + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class LifecycleEventArgs extends EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var object + */ + private $entity; + + /** + * Constructor + * + * @param object $entity + * @param ObjectManager $objectManager + */ + public function __construct($entity, ObjectManager $objectManager) + { + $this->entity = $entity; + $this->objectManager = $objectManager; + } + + /** + * Retireve associated Entity. + * + * @return object + */ + public function getEntity() + { + return $this->entity; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php new file mode 100644 index 00000000..4a18d167 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php @@ -0,0 +1,76 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs; +use Doctrine\Common\Persistence\ObjectManager; +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Class that holds event arguments for a loadMetadata event. + * + * @author Jonathan H. Wage + * @since 2.2 + */ +class LoadClassMetadataEventArgs extends EventArgs +{ + /** + * @var ClassMetadata + */ + private $classMetadata; + + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * Constructor. + * + * @param ClasseMetadata $classMetadata + * @param ObjectManager $objectManager + */ + public function __construct(ClassMetadata $classMetadata, ObjectManager $objectManager) + { + $this->classMetadata = $classMetadata; + $this->objectManager = $objectManager; + } + + /** + * Retrieve associated ClassMetadata. + * + * @return ClassMetadata + */ + public function getClassMetadata() + { + return $this->classMetadata; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php new file mode 100644 index 00000000..33c4d796 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php @@ -0,0 +1,59 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\Persistence\ObjectManager; + +/** + * Provides event arguments for the preFlush event. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class ManagerEventArgs extends \Doctrine\Common\EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * Constructor. + * + * @param ObjectManager $objectManager + */ + public function __construct(ObjectManager $objectManager) + { + $this->objectManager = $objectManager; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php new file mode 100644 index 00000000..f67ab50e --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php @@ -0,0 +1,84 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +/** + * Provides event arguments for the onClear event. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class OnClearEventArgs extends \Doctrine\Common\EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var string + */ + private $entityClass; + + /** + * Constructor. + * + * @param ObjectManager $objectManager + * @param string $entityClass Optional entity class + */ + public function __construct($objectManager, $entityClass = null) + { + $this->objectManager = $objectManager; + $this->entityClass = $entityClass; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } + + /** + * Name of the entity class that is cleared, or empty if all are cleared. + * + * @return string + */ + public function getEntityClass() + { + return $this->entityClass; + } + + /** + * Check if event clears all entities. + * + * @return bool + */ + public function clearsAllEntities() + { + return ($this->entityClass === null); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php new file mode 100644 index 00000000..191d053a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php @@ -0,0 +1,129 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs, + Doctrine\Common\Persistence\ObjectManager; + +/** + * Class that holds event arguments for a preUpdate event. + * + * @author Guilherme Blanco + * @author Roman Borschel + * @author Benjamin Eberlei + * @since 2.2 + */ +class PreUpdateEventArgs extends LifecycleEventArgs +{ + /** + * @var array + */ + private $entityChangeSet; + + /** + * Constructor. + * + * @param object $entity + * @param ObjectManager $objectManager + * @param array $changeSet + */ + public function __construct($entity, ObjectManager $objectManager, array &$changeSet) + { + parent::__construct($entity, $objectManager); + + $this->entityChangeSet = &$changeSet; + } + + /** + * Retrieve entity changeset. + * + * @return array + */ + public function getEntityChangeSet() + { + return $this->entityChangeSet; + } + + /** + * Check if field has a changeset. + * + * @return boolean + */ + public function hasChangedField($field) + { + return isset($this->entityChangeSet[$field]); + } + + /** + * Get the old value of the changeset of the changed field. + * + * @param string $field + * @return mixed + */ + public function getOldValue($field) + { + $this->assertValidField($field); + + return $this->entityChangeSet[$field][0]; + } + + /** + * Get the new value of the changeset of the changed field. + * + * @param string $field + * @return mixed + */ + public function getNewValue($field) + { + $this->assertValidField($field); + + return $this->entityChangeSet[$field][1]; + } + + /** + * Set the new value of this field. + * + * @param string $field + * @param mixed $value + */ + public function setNewValue($field, $value) + { + $this->assertValidField($field); + + $this->entityChangeSet[$field][1] = $value; + } + + /** + * Assert the field exists in changeset. + * + * @param string $field + */ + private function assertValidField($field) + { + if ( ! isset($this->entityChangeSet[$field])) { + throw new \InvalidArgumentException(sprintf( + 'Field "%s" is not a valid field of the entity "%s" in PreUpdateEventArgs.', + $field, + get_class($this->getEntity()) + )); + } + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php new file mode 100644 index 00000000..4d92426b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php @@ -0,0 +1,112 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract covering object managers for a Doctrine persistence layer ManagerRegistry class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +interface ManagerRegistry extends ConnectionRegistry +{ + /** + * Gets the default object manager name. + * + * @return string The default object manager name + */ + function getDefaultManagerName(); + + /** + * Gets a named object manager. + * + * @param string $name The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectManager + */ + function getManager($name = null); + + /** + * Gets an array of all registered object managers + * + * @return array An array of ObjectManager instances + */ + function getManagers(); + + /** + * Resets a named object manager. + * + * This method is useful when an object manager has been closed + * because of a rollbacked transaction AND when you think that + * it makes sense to get a new one to replace the closed one. + * + * Be warned that you will get a brand new object manager as + * the existing one is not useable anymore. This means that any + * other object with a dependency on this object manager will + * hold an obsolete reference. You can inject the registry instead + * to avoid this problem. + * + * @param string $name The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectManager + */ + function resetManager($name = null); + + /** + * Resolves a registered namespace alias to the full namespace. + * + * This method looks for the alias in all registered object managers. + * + * @param string $alias The alias + * + * @return string The full namespace + */ + function getAliasNamespace($alias); + + /** + * Gets all connection names. + * + * @return array An array of connection names + */ + function getManagerNames(); + + /** + * Gets the ObjectRepository for an persistent object. + * + * @param string $persistentObject The name of the persistent object. + * @param string $persistentManagerName The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectRepository + */ + function getRepository($persistentObject, $persistentManagerName = null); + + /** + * Gets the object manager associated with a given class. + * + * @param string $class A persistent object class name + * + * @return \Doctrine\Common\Persistence\ObjectManager|null + */ + function getManagerForClass($class); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php new file mode 100644 index 00000000..a2a61850 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php @@ -0,0 +1,359 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use Doctrine\Common\Cache\Cache; + +/** + * The ClassMetadataFactory is used to create ClassMetadata objects that contain all the + * metadata mapping informations of a class which describes how a class should be mapped + * to a relational database. + * + * This class was abstracted from the ORM ClassMetadataFactory + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +abstract class AbstractClassMetadataFactory implements ClassMetadataFactory +{ + /** + * Salt used by specific Object Manager implementation. + * + * @var string + */ + protected $cacheSalt = "\$CLASSMETADATA"; + + /** + * @var \Doctrine\Common\Cache\Cache + */ + private $cacheDriver; + + /** + * @var array + */ + private $loadedMetadata = array(); + + /** + * @var bool + */ + protected $initialized = false; + + /** + * @var ReflectionService + */ + private $reflectionService; + + /** + * Sets the cache driver used by the factory to cache ClassMetadata instances. + * + * @param Doctrine\Common\Cache\Cache $cacheDriver + */ + public function setCacheDriver(Cache $cacheDriver = null) + { + $this->cacheDriver = $cacheDriver; + } + + /** + * Gets the cache driver used by the factory to cache ClassMetadata instances. + * + * @return Doctrine\Common\Cache\Cache + */ + public function getCacheDriver() + { + return $this->cacheDriver; + } + + /** + * Return an array of all the loaded metadata currently in memory. + * + * @return array + */ + public function getLoadedMetadata() + { + return $this->loadedMetadata; + } + + /** + * Forces the factory to load the metadata of all classes known to the underlying + * mapping driver. + * + * @return array The ClassMetadata instances of all mapped classes. + */ + public function getAllMetadata() + { + if ( ! $this->initialized) { + $this->initialize(); + } + + $driver = $this->getDriver(); + $metadata = array(); + foreach ($driver->getAllClassNames() as $className) { + $metadata[] = $this->getMetadataFor($className); + } + + return $metadata; + } + + /** + * Lazy initialization of this stuff, especially the metadata driver, + * since these are not needed at all when a metadata cache is active. + * + * @return void + */ + abstract protected function initialize(); + + /** + * Get the fully qualified class-name from the namespace alias. + * + * @param string $namespaceAlias + * @param string $simpleClassName + * @return string + */ + abstract protected function getFqcnFromAlias($namespaceAlias, $simpleClassName); + + /** + * Return the mapping driver implementation. + * + * @return MappingDriver + */ + abstract protected function getDriver(); + + /** + * Wakeup reflection after ClassMetadata gets unserialized from cache. + * + * @param ClassMetadata $class + * @param ReflectionService $reflService + * @return void + */ + abstract protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService); + + /** + * Initialize Reflection after ClassMetadata was constructed. + * + * @param ClassMetadata $class + * @param ReflectionSErvice $reflService + * @return void + */ + abstract protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService); + + /** + * Gets the class metadata descriptor for a class. + * + * @param string $className The name of the class. + * @return Doctrine\Common\Persistence\Mapping\ClassMetadata + */ + public function getMetadataFor($className) + { + if ( ! isset($this->loadedMetadata[$className])) { + $realClassName = $className; + + // Check for namespace alias + if (strpos($className, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $className); + $realClassName = $this->getFqcnFromAlias($namespaceAlias, $simpleClassName); + + if (isset($this->loadedMetadata[$realClassName])) { + // We do not have the alias name in the map, include it + $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; + + return $this->loadedMetadata[$realClassName]; + } + } + + if ($this->cacheDriver) { + if (($cached = $this->cacheDriver->fetch($realClassName . $this->cacheSalt)) !== false) { + $this->loadedMetadata[$realClassName] = $cached; + $this->wakeupReflection($cached, $this->getReflectionService()); + } else { + foreach ($this->loadMetadata($realClassName) as $loadedClassName) { + $this->cacheDriver->save( + $loadedClassName . $this->cacheSalt, $this->loadedMetadata[$loadedClassName], null + ); + } + } + } else { + $this->loadMetadata($realClassName); + } + + if ($className != $realClassName) { + // We do not have the alias name in the map, include it + $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; + } + } + + return $this->loadedMetadata[$className]; + } + + /** + * Checks whether the factory has the metadata for a class loaded already. + * + * @param string $className + * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. + */ + public function hasMetadataFor($className) + { + return isset($this->loadedMetadata[$className]); + } + + /** + * Sets the metadata descriptor for a specific class. + * + * NOTE: This is only useful in very special cases, like when generating proxy classes. + * + * @param string $className + * @param ClassMetadata $class + */ + public function setMetadataFor($className, $class) + { + $this->loadedMetadata[$className] = $class; + } + + /** + * Get array of parent classes for the given entity class + * + * @param string $name + * @return array $parentClasses + */ + protected function getParentClasses($name) + { + // Collect parent classes, ignoring transient (not-mapped) classes. + $parentClasses = array(); + foreach (array_reverse($this->getReflectionService()->getParentClasses($name)) as $parentClass) { + if ( ! $this->getDriver()->isTransient($parentClass)) { + $parentClasses[] = $parentClass; + } + } + return $parentClasses; + } + + /** + * Loads the metadata of the class in question and all it's ancestors whose metadata + * is still not loaded. + * + * @param string $name The name of the class for which the metadata should get loaded. + * @param array $tables The metadata collection to which the loaded metadata is added. + */ + protected function loadMetadata($name) + { + if ( ! $this->initialized) { + $this->initialize(); + } + + $loaded = array(); + + $parentClasses = $this->getParentClasses($name); + $parentClasses[] = $name; + + // Move down the hierarchy of parent classes, starting from the topmost class + $parent = null; + $rootEntityFound = false; + $visited = array(); + $reflService = $this->getReflectionService(); + foreach ($parentClasses as $className) { + if (isset($this->loadedMetadata[$className])) { + $parent = $this->loadedMetadata[$className]; + if (isset($parent->isMappedSuperclass) && $parent->isMappedSuperclass === false) { + $rootEntityFound = true; + array_unshift($visited, $className); + } + continue; + } + + $class = $this->newClassMetadataInstance($className); + $this->initializeReflection($class, $reflService); + + $this->doLoadMetadata($class, $parent, $rootEntityFound); + + $this->loadedMetadata[$className] = $class; + + $parent = $class; + + if (isset($parent->isMappedSuperclass) && $class->isMappedSuperclass === false) { + $rootEntityFound = true; + array_unshift($visited, $className); + } + + $this->wakeupReflection($class, $reflService); + + $loaded[] = $className; + } + + return $loaded; + } + + /** + * Actually load the metadata from the underlying metadata + * + * @param ClassMetadata $class + * @param ClassMetadata $parent + * @param bool $rootEntityFound + * @return void + */ + abstract protected function doLoadMetadata($class, $parent, $rootEntityFound); + + /** + * Creates a new ClassMetadata instance for the given class name. + * + * @param string $className + * @return ClassMetadata + */ + abstract protected function newClassMetadataInstance($className); + + /** + * Check if this class is mapped by this Object Manager + ClassMetadata configuration + * + * @param $class + * @return bool + */ + public function isTransient($class) + { + if ( ! $this->initialized) { + $this->initialize(); + } + + return $this->getDriver()->isTransient($class); + } + + /** + * Set reflectionService. + * + * @param ReflectionService $reflectionService + */ + public function setReflectionService(ReflectionService $reflectionService) + { + $this->reflectionService = $reflectionService; + } + + /** + * Get the reflection service associated with this metadata factory. + * + * @return ReflectionService + */ + public function getReflectionService() + { + if ($this->reflectionService === null) { + $this->reflectionService = new RuntimeReflectionService(); + } + return $this->reflectionService; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php new file mode 100644 index 00000000..705d59ac --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php @@ -0,0 +1,165 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ClassMetadata +{ + /** + * Get fully-qualified class name of this persistent class. + * + * @return string + */ + function getName(); + + /** + * Gets the mapped identifier field name. + * + * The returned structure is an array of the identifier field names. + * + * @return array + */ + function getIdentifier(); + + /** + * Gets the ReflectionClass instance for this mapped class. + * + * @return ReflectionClass + */ + function getReflectionClass(); + + /** + * Checks if the given field name is a mapped identifier for this class. + * + * @param string $fieldName + * @return boolean + */ + function isIdentifier($fieldName); + + /** + * Checks if the given field is a mapped property for this class. + * + * @param string $fieldName + * @return boolean + */ + function hasField($fieldName); + + /** + * Checks if the given field is a mapped association for this class. + * + * @param string $fieldName + * @return boolean + */ + function hasAssociation($fieldName); + + /** + * Checks if the given field is a mapped single valued association for this class. + * + * @param string $fieldName + * @return boolean + */ + function isSingleValuedAssociation($fieldName); + + /** + * Checks if the given field is a mapped collection valued association for this class. + * + * @param string $fieldName + * @return boolean + */ + function isCollectionValuedAssociation($fieldName); + + /** + * A numerically indexed list of field names of this persistent class. + * + * This array includes identifier fields if present on this class. + * + * @return array + */ + function getFieldNames(); + + /** + * Returns an array of identifier field names numerically indexed. + * + * @return array + */ + function getIdentifierFieldNames(); + + /** + * A numerically indexed list of association names of this persistent class. + * + * This array includes identifier associations if present on this class. + * + * @return array + */ + function getAssociationNames(); + + /** + * Returns a type name of this field. + * + * This type names can be implementation specific but should at least include the php types: + * integer, string, boolean, float/double, datetime. + * + * @param string $fieldName + * @return string + */ + function getTypeOfField($fieldName); + + /** + * Returns the target class name of the given association. + * + * @param string $assocName + * @return string + */ + function getAssociationTargetClass($assocName); + + /** + * Checks if the association is the inverse side of a bidirectional association + * + * @param string $assocName + * @return boolean + */ + function isAssociationInverseSide($assocName); + + /** + * Returns the target field of the owning side of the association + * + * @param string $assocName + * @return string + */ + function getAssociationMappedByTargetField($assocName); + + /** + * Return the identifier of this object as an array with field name as key. + * + * Has to return an empty array if no identifier isset. + * + * @param object $object + * @return array + */ + function getIdentifierValues($object); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php new file mode 100644 index 00000000..bf27ba9a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php @@ -0,0 +1,74 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ClassMetadataFactory +{ + /** + * Forces the factory to load the metadata of all classes known to the underlying + * mapping driver. + * + * @return array The ClassMetadata instances of all mapped classes. + */ + function getAllMetadata(); + + /** + * Gets the class metadata descriptor for a class. + * + * @param string $className The name of the class. + * @return ClassMetadata + */ + function getMetadataFor($className); + + /** + * Checks whether the factory has the metadata for a class loaded already. + * + * @param string $className + * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. + */ + function hasMetadataFor($className); + + /** + * Sets the metadata descriptor for a specific class. + * + * @param string $className + * @param ClassMetadata $class + */ + function setMetadataFor($className, $class); + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped directly or as a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + function isTransient($className); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php new file mode 100644 index 00000000..f52d37ee --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php @@ -0,0 +1,214 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Cache\ArrayCache, + Doctrine\Common\Annotations\AnnotationReader, + Doctrine\Common\Annotations\AnnotationRegistry, + Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The AnnotationDriver reads the mapping metadata from docblock annotations. + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +abstract class AnnotationDriver implements MappingDriver +{ + /** + * The AnnotationReader. + * + * @var AnnotationReader + */ + protected $reader; + + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * The file extension of mapping documents. + * + * @var string + */ + protected $fileExtension = '.php'; + + /** + * Cache for AnnotationDriver#getAllClassNames() + * + * @var array + */ + protected $classNames; + + /** + * Name of the entity annotations as keys + * + * @var array + */ + protected $entityAnnotationClasses = array(); + + /** + * Initializes a new AnnotationDriver that uses the given AnnotationReader for reading + * docblock annotations. + * + * @param AnnotationReader $reader The AnnotationReader to use, duck-typed. + * @param string|array $paths One or multiple paths where mapping classes can be found. + */ + public function __construct($reader, $paths = null) + { + $this->reader = $reader; + if ($paths) { + $this->addPaths((array) $paths); + } + } + + /** + * Append lookup paths to metadata driver. + * + * @param array $paths + */ + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * Retrieve the defined metadata lookup paths. + * + * @return array + */ + public function getPaths() + { + return $this->paths; + } + + /** + * Retrieve the current annotation reader + * + * @return AnnotationReader + */ + public function getReader() + { + return $this->reader; + } + + /** + * Get the file extension used to look for mapping files under + * + * @return void + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * Whether the class with the specified name is transient. Only non-transient + * classes, that is entities and mapped superclasses, should have their metadata loaded. + * + * A class is non-transient if it is annotated with an annotation + * from the {@see AnnotationDriver::entityAnnotationClasses}. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + $classAnnotations = $this->reader->getClassAnnotations(new \ReflectionClass($className)); + + foreach ($classAnnotations as $annot) { + if (isset($this->entityAnnotationClasses[get_class($annot)])) { + return false; + } + } + return true; + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames() + { + if ($this->classNames !== null) { + return $this->classNames; + } + + if (!$this->paths) { + throw MappingException::pathRequired(); + } + + $classes = array(); + $includedFiles = array(); + + foreach ($this->paths as $path) { + if ( ! is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RegexIterator( + new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS), + \RecursiveIteratorIterator::LEAVES_ONLY + ), + '/^.+' . str_replace('.', '\.', $this->fileExtension) . '$/i', + \RecursiveRegexIterator::GET_MATCH + ); + + foreach ($iterator as $file) { + $sourceFile = realpath($file[0]); + + require_once $sourceFile; + + $includedFiles[] = $sourceFile; + } + } + + $declared = get_declared_classes(); + + foreach ($declared as $className) { + $rc = new \ReflectionClass($className); + $sourceFile = $rc->getFileName(); + if (in_array($sourceFile, $includedFiles) && ! $this->isTransient($className)) { + $classes[] = $className; + } + } + + $this->classNames = $classes; + + return $classes; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php new file mode 100644 index 00000000..efaf545e --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php @@ -0,0 +1,169 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * Locate the file that contains the metadata information for a given class name. + * + * This behavior is inpependent of the actual content of the file. It just detects + * the file which is responsible for the given class name. + * + * @author Benjamin Eberlei + * @author Johannes M. Schmitt + */ +class DefaultFileLocator implements FileLocator +{ + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * The file extension of mapping documents. + * + * @var string + */ + protected $fileExtension; + + /** + * Initializes a new FileDriver that looks in the given path(s) for mapping + * documents and operates in the specified operating mode. + * + * @param string|array $paths One or multiple paths where mapping documents can be found. + */ + public function __construct($paths, $fileExtension = null) + { + $this->addPaths((array) $paths); + $this->fileExtension = $fileExtension; + } + + /** + * Append lookup paths to metadata driver. + * + * @param array $paths + */ + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * Retrieve the defined metadata lookup paths. + * + * @return array + */ + public function getPaths() + { + return $this->paths; + } + + /** + * Get the file extension used to look for mapping files under + * + * @return void + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * {@inheritDoc} + */ + public function findMappingFile($className) + { + $fileName = str_replace('\\', '.', $className) . $this->fileExtension; + + // Check whether file exists + foreach ($this->paths as $path) { + if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { + return $path . DIRECTORY_SEPARATOR . $fileName; + } + } + + throw MappingException::mappingFileNotFound($className, $fileName); + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames($globalBasename) + { + $classes = array(); + + if ($this->paths) { + foreach ($this->paths as $path) { + if ( ! is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + $fileName = $file->getBasename($this->fileExtension); + + if ($fileName == $file->getBasename() || $fileName == $globalBasename) { + continue; + } + + // NOTE: All files found here means classes are not transient! + $classes[] = str_replace('.', '\\', $fileName); + } + } + } + + return $classes; + } + + /** + * {@inheritDoc} + */ + public function fileExists($className) + { + $fileName = str_replace('\\', '.', $className) . $this->fileExtension; + + // Check whether file exists + foreach ((array) $this->paths as $path) { + if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php new file mode 100644 index 00000000..22cf117d --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php @@ -0,0 +1,178 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * Base driver for file-based metadata drivers. + * + * A file driver operates in a mode where it loads the mapping files of individual + * classes on demand. This requires the user to adhere to the convention of 1 mapping + * file per class and the file names of the mapping files must correspond to the full + * class name, including namespace, with the namespace delimiters '\', replaced by dots '.'. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.com + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +abstract class FileDriver implements MappingDriver +{ + /** + * @var FileLocator + */ + protected $locator; + + /** + * @var array + */ + protected $classCache; + + /** + * @var string + */ + protected $globalBasename; + + /** + * Initializes a new FileDriver that looks in the given path(s) for mapping + * documents and operates in the specified operating mode. + * + * @param string|array|FileLocator $paths A FileLocator or one/multiple paths where mapping documents can be found. + * @param string $fileExtension + */ + public function __construct($locator, $fileExtension = null) + { + if ($locator instanceof FileLocator) { + $this->locator = $locator; + } else { + $this->locator = new DefaultFileLocator((array)$locator, $fileExtension); + } + } + + public function setGlobalBasename($file) + { + $this->globalBasename = $file; + } + + public function getGlobalBasename() + { + return $this->globalBasename; + } + + /** + * Get the element of schema meta data for the class from the mapping file. + * This will lazily load the mapping file if it is not loaded yet + * + * @return array $element The element of schema meta data + */ + public function getElement($className) + { + if ($this->classCache === null) { + $this->initialize(); + } + + if (isset($this->classCache[$className])) { + return $this->classCache[$className]; + } + + $result = $this->loadMappingFile($this->locator->findMappingFile($className)); + + return $result[$className]; + } + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped as an Entity or a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + if ($this->classCache === null) { + $this->initialize(); + } + + if (isset($this->classCache[$className])) { + return false; + } + + return !$this->locator->fileExists($className); + } + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + public function getAllClassNames() + { + if ($this->classCache === null) { + $this->initialize(); + } + + $classNames = (array)$this->locator->getAllClassNames($this->globalBasename); + if ($this->classCache) { + $classNames = array_merge(array_keys($this->classCache), $classNames); + } + return $classNames; + } + + /** + * Loads a mapping file with the given name and returns a map + * from class/entity names to their corresponding file driver elements. + * + * @param string $file The mapping file to load. + * @return array + */ + abstract protected function loadMappingFile($file); + + /** + * Initialize the class cache from all the global files. + * + * Using this feature adds a substantial performance hit to file drivers as + * more metadata has to be loaded into memory than might actually be + * necessary. This may not be relevant to scenarios where caching of + * metadata is in place, however hits very hard in scenarios where no + * caching is used. + * + * @return void + */ + protected function initialize() + { + $this->classCache = array(); + if (null !== $this->globalBasename) { + foreach ($this->locator->getPaths() as $path) { + $file = $path.'/'.$this->globalBasename.$this->locator->getFileExtension(); + if (is_file($file)) { + $this->classCache = array_merge( + $this->classCache, + $this->loadMappingFile($file) + ); + } + } + } + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php new file mode 100644 index 00000000..a1019d71 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php @@ -0,0 +1,69 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +/** + * Locate the file that contains the metadata information for a given class name. + * + * This behavior is inpependent of the actual content of the file. It just detects + * the file which is responsible for the given class name. + * + * @author Benjamin Eberlei + * @author Johannes M. Schmitt + */ +interface FileLocator +{ + /** + * Locate mapping file for the given class name. + * + * @param string $className + * @return string + */ + function findMappingFile($className); + + /** + * Get all class names that are found with this file locator. + * + * @param string $globalBasename Passed to allow excluding the basename + * @return array + */ + function getAllClassNames($globalBasename); + + /** + * Check if a file can be found for this class name. + * + * @return bool + */ + function fileExists($className); + + /** + * Get all the paths that this file locator looks for mapping files. + * + * @return array + */ + function getPaths(); + + /** + * Get the file extension that mapping files are suffixed with. + * + * @return string + */ + function getFileExtension(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php new file mode 100644 index 00000000..c050d323 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php @@ -0,0 +1,56 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Contract for metadata drivers. + * + * @since 2.2 + * @author Jonathan H. Wage + */ +interface MappingDriver +{ + /** + * Loads the metadata for the specified class into the provided container. + * + * @param string $className + * @param ClassMetadata $metadata + */ + function loadMetadataForClass($className, ClassMetadata $metadata); + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + function getAllClassNames(); + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped as an Entity or a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + function isTransient($className); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php new file mode 100644 index 00000000..c7c14527 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php @@ -0,0 +1,125 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\Driver\MappingDriver, + Doctrine\Common\Persistence\Mapping\ClassMetadata, + Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The DriverChain allows you to add multiple other mapping drivers for + * certain namespaces + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class MappingDriverChain implements MappingDriver +{ + /** + * @var array + */ + private $drivers = array(); + + /** + * Add a nested driver. + * + * @param Driver $nestedDriver + * @param string $namespace + */ + public function addDriver(MappingDriver $nestedDriver, $namespace) + { + $this->drivers[$namespace] = $nestedDriver; + } + + /** + * Get the array of nested drivers. + * + * @return array $drivers + */ + public function getDrivers() + { + return $this->drivers; + } + + /** + * Loads the metadata for the specified class into the provided container. + * + * @param string $className + * @param ClassMetadataInfo $metadata + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + foreach ($this->drivers as $namespace => $driver) { + if (strpos($className, $namespace) === 0) { + $driver->loadMetadataForClass($className, $metadata); + return; + } + } + + throw MappingException::classNotFoundInNamespaces($className, array_keys($this->drivers)); + } + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + public function getAllClassNames() + { + $classNames = array(); + $driverClasses = array(); + foreach ($this->drivers AS $namespace => $driver) { + $oid = spl_object_hash($driver); + if (!isset($driverClasses[$oid])) { + $driverClasses[$oid] = $driver->getAllClassNames(); + } + + foreach ($driverClasses[$oid] AS $className) { + if (strpos($className, $namespace) === 0) { + $classNames[$className] = true; + } + } + } + return array_keys($classNames); + } + + /** + * Whether the class with the specified name should have its metadata loaded. + * + * This is only the case for non-transient classes either mapped as an Entity or MappedSuperclass. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + foreach ($this->drivers AS $namespace => $driver) { + if (strpos($className, $namespace) === 0) { + return $driver->isTransient($className); + } + } + + // class isTransient, i.e. not an entity or mapped superclass + return true; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php new file mode 100644 index 00000000..7751dae3 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * The PHPDriver includes php files which just populate ClassMetadataInfo + * instances with plain php code + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class PHPDriver extends FileDriver +{ + /** + * {@inheritdoc} + */ + protected $metadata; + + /** + * {@inheritDoc} + */ + public function __construct($locator, $fileExtension = null) + { + $fileExtension = ".php"; + parent::__construct($locator, $fileExtension); + } + + /** + * {@inheritdoc} + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + $this->metadata = $metadata; + $this->loadMappingFile($this->locator->findMappingFile($className)); + } + + /** + * {@inheritdoc} + */ + protected function loadMappingFile($file) + { + $metadata = $this->metadata; + include $file; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php new file mode 100644 index 00000000..9103ed86 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php @@ -0,0 +1,131 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The StaticPHPDriver calls a static loadMetadata() method on your entity + * classes where you can manually populate the ClassMetadata instance. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class StaticPHPDriver implements MappingDriver +{ + /** + * Paths of entity directories. + * + * @var array + */ + private $paths = array(); + + /** + * Map of all class names. + * + * @var array + */ + private $classNames; + + public function __construct($paths) + { + $this->addPaths((array) $paths); + } + + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * {@inheritdoc} + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + $className::loadMetadata($metadata); + } + + /** + * {@inheritDoc} + * @todo Same code exists in AnnotationDriver, should we re-use it somehow or not worry about it? + */ + public function getAllClassNames() + { + if ($this->classNames !== null) { + return $this->classNames; + } + + if (!$this->paths) { + throw MappingException::pathRequired(); + } + + $classes = array(); + $includedFiles = array(); + + foreach ($this->paths as $path) { + if (!is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + if ($file->getBasename('.php') == $file->getBasename()) { + continue; + } + + $sourceFile = realpath($file->getPathName()); + require_once $sourceFile; + $includedFiles[] = $sourceFile; + } + } + + $declared = get_declared_classes(); + + foreach ($declared as $className) { + $rc = new \ReflectionClass($className); + $sourceFile = $rc->getFileName(); + if (in_array($sourceFile, $includedFiles) && !$this->isTransient($className)) { + $classes[] = $className; + } + } + + $this->classNames = $classes; + + return $classes; + } + + /** + * {@inheritdoc} + */ + public function isTransient($className) + { + return ! method_exists($className, 'loadMetadata'); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php new file mode 100644 index 00000000..d338cf60 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php @@ -0,0 +1,198 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The Symfony File Locator makes a simplifying assumptions compared + * to the DefaultFileLocator. By assuming paths only contain entities of a certain + * namespace the mapping files consists of the short classname only. + * + * @author Fabien Potencier + * @author Benjamin Eberlei + * @license MIT + */ +class SymfonyFileLocator implements FileLocator +{ + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * A map of mapping directory path to namespace prefix used to expand class shortnames. + * + * @var array + */ + protected $prefixes = array(); + + /** + * File extension that is searched for. + * + * @var string + */ + protected $fileExtension; + + public function __construct(array $prefixes, $fileExtension = null) + { + $this->addNamespacePrefixes($prefixes); + $this->fileExtension = $fileExtension; + } + + public function addNamespacePrefixes(array $prefixes) + { + $this->prefixes = array_merge($this->prefixes, $prefixes); + $this->paths = array_merge($this->paths, array_keys($prefixes)); + } + + public function getNamespacePrefixes() + { + return $this->prefixes; + } + + /** + * {@inheritDoc} + */ + public function getPaths() + { + return $this->paths; + } + + /** + * {@inheritDoc} + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * {@inheritDoc} + */ + public function fileExists($className) + { + $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; + foreach ($this->paths as $path) { + if (!isset($this->prefixes[$path])) { + // global namespace class + if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { + return true; + } + + continue; + } + + $prefix = $this->prefixes[$path]; + + if (0 !== strpos($className, $prefix.'\\')) { + continue; + } + + $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; + return is_file($filename); + } + + return false; + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames($globalBasename = null) + { + $classes = array(); + + if ($this->paths) { + foreach ((array) $this->paths as $path) { + if (!is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + $fileName = $file->getBasename($this->fileExtension); + + if ($fileName == $file->getBasename() || $fileName == $globalBasename) { + continue; + } + + // NOTE: All files found here means classes are not transient! + if (isset($this->prefixes[$path])) { + $classes[] = $this->prefixes[$path].'\\'.str_replace('.', '\\', $fileName); + } else { + $classes[] = str_replace('.', '\\', $fileName); + } + } + } + } + + return $classes; + } + + /** + * {@inheritDoc} + */ + public function findMappingFile($className) + { + $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; + foreach ($this->paths as $path) { + if (!isset($this->prefixes[$path])) { + if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { + return $path.DIRECTORY_SEPARATOR.$defaultFileName; + } + + continue; + } + + $prefix = $this->prefixes[$path]; + + if (0 !== strpos($className, $prefix.'\\')) { + continue; + } + + $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; + if (is_file($filename)) { + return $filename; + } + + throw MappingException::mappingFileNotFound($className, $filename); + } + + throw MappingException::mappingFileNotFound($className, substr($className, strrpos($className, '\\') + 1).$this->fileExtension); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php new file mode 100644 index 00000000..4ecd2ad5 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php @@ -0,0 +1,57 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * A MappingException indicates that something is wrong with the mapping setup. + * + * @since 2.2 + */ +class MappingException extends \Exception +{ + public static function classNotFoundInNamespaces($className, $namespaces) + { + return new self("The class '" . $className . "' was not found in the ". + "chain configured namespaces " . implode(", ", $namespaces)); + } + + public static function pathRequired() + { + return new self("Specifying the paths to your entities is required ". + "in the AnnotationDriver to retrieve all class names."); + } + + public static function fileMappingDriversRequireConfiguredDirectoryPath($path = null) + { + if ( ! empty($path)) { + $path = '[' . $path . ']'; + } + + return new self( + 'File mapping drivers must have a valid directory path, ' . + 'however the given path ' . $path . ' seems to be incorrect!' + ); + } + + public static function mappingFileNotFound($entityName, $fileName) + { + return new self("No mapping file found named '$fileName' for class '$entityName'."); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php new file mode 100644 index 00000000..4e0e312f --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php @@ -0,0 +1,80 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Very simple reflection service abstraction. + * + * This is required inside metadata layers that may require either + * static or runtime reflection. + * + * @author Benjamin Eberlei + */ +interface ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + function getParentClasses($class); + + /** + * Return the shortname of a class. + * + * @param string $class + * @return string + */ + function getClassShortName($class); + + /** + * @param string $class + * @return string + */ + function getClassNamespace($class); + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + function getClass($class); + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + function getAccessibleProperty($class, $property); + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + function hasPublicMethod($class, $method); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php new file mode 100644 index 00000000..abcff581 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php @@ -0,0 +1,102 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use ReflectionClass; +use ReflectionProperty; + +/** + * PHP Runtime Reflection Service + * + * @author Benjamin Eberlei + */ +class RuntimeReflectionService implements ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + public function getParentClasses($class) + { + return class_parents($class); + } + + /** + * Return the shortname of a class. + * + * @param string $class + * @return string + */ + public function getClassShortName($class) + { + $r = new ReflectionClass($class); + return $r->getShortName(); + } + + /** + * @param string $class + * @return string + */ + public function getClassNamespace($class) + { + $r = new ReflectionClass($class); + return $r->getNamespaceName(); + } + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + public function getClass($class) + { + return new ReflectionClass($class); + } + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + public function getAccessibleProperty($class, $property) + { + $property = new ReflectionProperty($class, $property); + $property->setAccessible(true); + return $property; + } + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + public function hasPublicMethod($class, $method) + { + return method_exists($class, $method) && is_callable(array($class, $method)); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php new file mode 100644 index 00000000..2de6e761 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php @@ -0,0 +1,107 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use ReflectionClass; +use ReflectionProperty; + +/** + * PHP Runtime Reflection Service + * + * @author Benjamin Eberlei + */ +class StaticReflectionService implements ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + public function getParentClasses($class) + { + return array(); + } + + /** + * Return the shortname of a class. + * + * @param string $className + * @return string + */ + public function getClassShortName($className) + { + if (strpos($className, '\\') !== false) { + $className = substr($className, strrpos($className, "\\")+1); + } + return $className; + } + + /** + * Return the namespace of a class. + * + * @param string $className + * @return string + */ + public function getClassNamespace($className) + { + $namespace = ''; + if (strpos($className, '\\') !== false) { + $namespace = strrev(substr( strrev($className), strpos(strrev($className), '\\')+1 )); + } + return $namespace; + } + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + public function getClass($class) + { + return null; + } + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + public function getAccessibleProperty($class, $property) + { + return null; + } + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + public function hasPublicMethod($class, $method) + { + return method_exists($class, $method) && is_callable(array($class, $method)); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php new file mode 100644 index 00000000..6d70fc12 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php @@ -0,0 +1,143 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract for a Doctrine persistence layer ObjectManager class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ObjectManager +{ + /** + * Finds a object by its identifier. + * + * This is just a convenient shortcut for getRepository($className)->find($id). + * + * @param string + * @param mixed + * @return object + */ + function find($className, $id); + + /** + * Tells the ObjectManager to make an instance managed and persistent. + * + * The object will be entered into the database as a result of the flush operation. + * + * NOTE: The persist operation always considers objects that are not yet known to + * this ObjectManager as NEW. Do not pass detached objects to the persist operation. + * + * @param object $object The instance to make managed and persistent. + */ + function persist($object); + + /** + * Removes an object instance. + * + * A removed object will be removed from the database as a result of the flush operation. + * + * @param object $object The object instance to remove. + */ + function remove($object); + + /** + * Merges the state of a detached object into the persistence context + * of this ObjectManager and returns the managed copy of the object. + * The object passed to merge will not become associated/managed with this ObjectManager. + * + * @param object $object + */ + function merge($object); + + /** + * Detaches an object from the ObjectManager, causing a managed object to + * become detached. Unflushed changes made to the object if any + * (including removal of the object), will not be synchronized to the database. + * Objects which previously referenced the detached object will continue to + * reference it. + * + * @param object $object The object to detach. + */ + function detach($object); + + /** + * Refreshes the persistent state of an object from the database, + * overriding any local changes that have not yet been persisted. + * + * @param object $object The object to refresh. + */ + function refresh($object); + + /** + * Flushes all changes to objects that have been queued up to now to the database. + * This effectively synchronizes the in-memory state of managed objects with the + * database. + */ + function flush(); + + /** + * Gets the repository for a class. + * + * @param string $className + * @return \Doctrine\Common\Persistence\ObjectRepository + */ + function getRepository($className); + + /** + * Returns the ClassMetadata descriptor for a class. + * + * The class name must be the fully-qualified class name without a leading backslash + * (as it is returned by get_class($obj)). + * + * @param string $className + * @return \Doctrine\Common\Persistence\Mapping\ClassMetadata + */ + function getClassMetadata($className); + + /** + * Gets the metadata factory used to gather the metadata of classes. + * + * @return Doctrine\Common\Persistence\Mapping\ClassMetadataFactory + */ + function getMetadataFactory(); + + /** + * Helper method to initialize a lazy loading proxy or persistent collection. + * + * This method is a no-op for other objects. + * + * @param object $obj + */ + function initializeObject($obj); + + /** + * Check if the object is part of the current UnitOfWork and therefore + * managed. + * + * @param object $object + * @return bool + */ + function contains($object); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php new file mode 100644 index 00000000..015dd3dd --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php @@ -0,0 +1,49 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Makes a Persistent Objects aware of its own object-manager. + * + * Using this interface the managing object manager and class metadata instances + * are injected into the persistent object after construction. This allows + * you to implement ActiveRecord functionality on top of the persistance-ignorance + * that Doctrine propagates. + * + * Word of Warning: This is a very powerful hook to change how you can work with your domain models. + * Using this hook will break the Single Responsibility Principle inside your Domain Objects + * and increase the coupling of database and objects. + * + * Every ObjectManager has to implement this functionality itself. + * + * @author Benjamin Eberlei + */ +interface ObjectManagerAware +{ + /** + * Injects responsible ObjectManager and the ClassMetadata into this persistent object. + * + * @param ObjectManager $objectManager + * @param ClassMetadata $classMetadata + */ + public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php new file mode 100644 index 00000000..22633288 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php @@ -0,0 +1,78 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract for a Doctrine persistence layer ObjectRepository class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ObjectRepository +{ + /** + * Finds an object by its primary key / identifier. + * + * @param $id The identifier. + * @return object The object. + */ + function find($id); + + /** + * Finds all objects in the repository. + * + * @return mixed The objects. + */ + function findAll(); + + /** + * Finds objects by a set of criteria. + * + * Optionally sorting and limiting details can be passed. An implementation may throw + * an UnexpectedValueException if certain values of the sorting or limiting details are + * not supported. + * + * @throws UnexpectedValueException + * @param array $criteria + * @param array|null $orderBy + * @param int|null $limit + * @param int|null $offset + * @return mixed The objects. + */ + function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null); + + /** + * Finds a single object by a set of criteria. + * + * @param array $criteria + * @return object The object. + */ + function findOneBy(array $criteria); + + /** + * Returns the class name of the object managed by the repository + * + * @return string + */ + function getClassName(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php new file mode 100644 index 00000000..4274af62 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php @@ -0,0 +1,233 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; + +/** + * PersistentObject base class that implements getter/setter methods for all mapped fields and associations + * by overriding __call. + * + * This class is a forward compatible implementation of the PersistentObject trait. + * + * + * Limitations: + * + * 1. All persistent objects have to be associated with a single ObjectManager, multiple + * ObjectManagers are not supported. You can set the ObjectManager with `PersistentObject#setObjectManager()`. + * 2. Setters and getters only work if a ClassMetadata instance was injected into the PersistentObject. + * This is either done on `postLoad` of an object or by accessing the global object manager. + * 3. There are no hooks for setters/getters. Just implement the method yourself instead of relying on __call(). + * 4. Slower than handcoded implementations: An average of 7 method calls per access to a field and 11 for an association. + * 5. Only the inverse side associations get autoset on the owning side aswell. Setting objects on the owning side + * will not set the inverse side associations. + * + * @example + * + * PersistentObject::setObjectManager($em); + * + * class Foo extends PersistentObject + * { + * private $id; + * } + * + * $foo = new Foo(); + * $foo->getId(); // method exists through __call + * + * @author Benjamin Eberlei + */ +abstract class PersistentObject implements ObjectManagerAware +{ + /** + * @var ObjectManager + */ + private static $objectManager; + + /** + * @var ClassMetadata + */ + private $cm; + + /** + * Set the object manager responsible for all persistent object base classes. + * + * @param ObjectManager $objectManager + */ + static public function setObjectManager(ObjectManager $objectManager = null) + { + self::$objectManager = $objectManager; + } + + /** + * @return ObjectManager + */ + static public function getObjectManager() + { + return self::$objectManager; + } + + /** + * Inject Doctrine Object Manager + * + * @param ObjectManager $objectManager + * @param ClassMetadata $classMetadata + */ + public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata) + { + if ($objectManager !== self::$objectManager) { + throw new \RuntimeException("Trying to use PersistentObject with different ObjectManager instances. " . + "Was PersistentObject::setObjectManager() called?"); + } + + $this->cm = $classMetadata; + } + + /** + * Sets a persistent fields value. + * + * @throws InvalidArgumentException - When the wrong target object type is passed to an association + * @throws BadMethodCallException - When no persistent field exists by that name. + * @param string $field + * @param array $args + * @return void + */ + private function set($field, $args) + { + $this->initializeDoctrine(); + + if ($this->cm->hasField($field) && !$this->cm->isIdentifier($field)) { + $this->$field = $args[0]; + } else if ($this->cm->hasAssociation($field) && $this->cm->isSingleValuedAssociation($field)) { + $targetClass = $this->cm->getAssociationTargetClass($field); + if (!($args[0] instanceof $targetClass) && $args[0] !== null) { + throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); + } + $this->$field = $args[0]; + $this->completeOwningSide($field, $targetClass, $args[0]); + } else { + throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); + } + } + + /** + * Get persistent field value. + * + * @throws BadMethodCallException - When no persistent field exists by that name. + * @param string $field + * @return mixed + */ + private function get($field) + { + $this->initializeDoctrine(); + + if ( $this->cm->hasField($field) || $this->cm->hasAssociation($field) ) { + return $this->$field; + } else { + throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); + } + } + + /** + * If this is an inverse side association complete the owning side. + * + * @param string $field + * @param ClassMetadata $targetClass + * @param object $targetObject + */ + private function completeOwningSide($field, $targetClass, $targetObject) + { + // add this object on the owning side aswell, for obvious infinite recursion + // reasons this is only done when called on the inverse side. + if ($this->cm->isAssociationInverseSide($field)) { + $mappedByField = $this->cm->getAssociationMappedByTargetField($field); + $targetMetadata = self::$objectManager->getClassMetadata($targetClass); + + $setter = ($targetMetadata->isCollectionValuedAssociation($mappedByField) ? "add" : "set").$mappedByField; + $targetObject->$setter($this); + } + } + + /** + * Add an object to a collection + * + * @param type $field + * @param assoc $args + */ + private function add($field, $args) + { + $this->initializeDoctrine(); + + if ($this->cm->hasAssociation($field) && $this->cm->isCollectionValuedAssociation($field)) { + $targetClass = $this->cm->getAssociationTargetClass($field); + if (!($args[0] instanceof $targetClass)) { + throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); + } + if (!($this->$field instanceof Collection)) { + $this->$field = new ArrayCollection($this->$field ?: array()); + } + $this->$field->add($args[0]); + $this->completeOwningSide($field, $targetClass, $args[0]); + } else { + throw new \BadMethodCallException("There is no method add".$field."() on ".$this->cm->getName()); + } + } + + /** + * Initialize Doctrine Metadata for this class. + * + * @return void + */ + private function initializeDoctrine() + { + if ($this->cm !== null) { + return; + } + + if (!self::$objectManager) { + throw new \RuntimeException("No runtime object manager set. Call PersistentObject#setObjectManager()."); + } + + $this->cm = self::$objectManager->getClassMetadata(get_class($this)); + } + + /** + * Magic method that implements + * + * @param string $method + * @param array $args + * @return mixed + */ + public function __call($method, $args) + { + $command = substr($method, 0, 3); + $field = lcfirst(substr($method, 3)); + if ($command == "set") { + $this->set($field, $args); + } else if ($command == "get") { + return $this->get($field); + } else if ($command == "add") { + $this->add($field, $args); + } else { + throw new \BadMethodCallException("There is no method ".$method." on ".$this->cm->getName()); + } + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php new file mode 100644 index 00000000..726979fc --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php @@ -0,0 +1,60 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Interface for proxy classes. + * + * @author Roman Borschel + * @since 2.2 + */ +interface Proxy +{ + /** + * Marker for Proxy class names. + * + * @var string + */ + const MARKER = '__CG__'; + + /** + * Length of the proxy marker + * + * @var int + */ + const MARKER_LENGTH = 6; + + /** + * Initialize this proxy if its not yet initialized. + * + * Acts as a no-op if already initialized. + * + * @return void + */ + public function __load(); + + /** + * Is this proxy initialized or not. + * + * @return bool + */ + public function __isInitialized(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php b/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php new file mode 100644 index 00000000..87c5b413 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php @@ -0,0 +1,48 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Contract for classes that are potential listeners of a NotifyPropertyChanged + * implementor. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface PropertyChangedListener +{ + /** + * Notifies the listener of a property change. + * + * @param object $sender The object on which the property changed. + * @param string $propertyName The name of the property that changed. + * @param mixed $oldValue The old value of the property that changed. + * @param mixed $newValue The new value of the property that changed. + */ + function propertyChanged($sender, $propertyName, $oldValue, $newValue); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php new file mode 100644 index 00000000..c3462782 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php @@ -0,0 +1,103 @@ +. + */ + +namespace Doctrine\Common\Util; + +use Doctrine\Common\Persistence\Proxy; + +/** + * Class and reflection related functionality for objects that + * might or not be proxy objects at the moment. + * + * @author Benjamin Eberlei + * @author Johannes Schmitt + */ +class ClassUtils +{ + /** + * Get the real class name of a class name that could be a proxy. + * + * @param string + * @return string + */ + public static function getRealClass($class) + { + if (false === $pos = strrpos($class, '\\'.Proxy::MARKER.'\\')) { + return $class; + } + + return substr($class, $pos + Proxy::MARKER_LENGTH + 2); + } + + /** + * Get the real class name of an object (even if its a proxy) + * + * @param object + * @return string + */ + public static function getClass($object) + { + return self::getRealClass(get_class($object)); + } + + /** + * Get the real parent class name of a class or object + * + * @param string + * @return string + */ + public static function getParentClass($className) + { + return get_parent_class( self::getRealClass( $className ) ); + } + + /** + * Create a new reflection class + * + * @param string + * @return ReflectionClass + */ + public static function newReflectionClass($class) + { + return new \ReflectionClass( self::getRealClass( $class ) ); + } + + /** + * Create a new reflection object + * + * @param object + * @return ReflectionObject + */ + public static function newReflectionObject($object) + { + return self::newReflectionClass( self::getClass( $object ) ); + } + + /** + * Given a class name and a proxy namespace return the proxy name. + * + * @param string $className + * @param string $proxyNamespace + * @return string + */ + public static function generateProxyClassName($className, $proxyNamespace) + { + return rtrim($proxyNamespace, '\\') . '\\'.Proxy::MARKER.'\\' . ltrim($className, '\\'); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php new file mode 100644 index 00000000..57ae3120 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php @@ -0,0 +1,123 @@ +. + */ + +namespace Doctrine\Common\Util; + +/** + * Static class containing most used debug methods. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Giorgio Sironi + */ +final class Debug +{ + /** + * Private constructor (prevents from instantiation) + * + */ + private function __construct() {} + + /** + * Prints a dump of the public, protected and private properties of $var. + * + * @static + * @link http://xdebug.org/ + * @param mixed $var + * @param integer $maxDepth Maximum nesting level for object properties + * @param boolean $stripTags Flag that indicate if output should strip HTML tags + */ + public static function dump($var, $maxDepth = 2, $stripTags = true) + { + ini_set('html_errors', 'On'); + + if (extension_loaded('xdebug')) { + ini_set('xdebug.var_display_max_depth', $maxDepth); + } + + $var = self::export($var, $maxDepth++); + + ob_start(); + var_dump($var); + $dump = ob_get_contents(); + ob_end_clean(); + + echo ($stripTags ? strip_tags(html_entity_decode($dump)) : $dump); + + ini_set('html_errors', 'Off'); + } + + public static function export($var, $maxDepth) + { + $return = null; + $isObj = is_object($var); + + if ($isObj && in_array('Doctrine\Common\Collections\Collection', class_implements($var))) { + $var = $var->toArray(); + } + + if ($maxDepth) { + if (is_array($var)) { + $return = array(); + + foreach ($var as $k => $v) { + $return[$k] = self::export($v, $maxDepth - 1); + } + } else if ($isObj) { + $return = new \stdclass(); + if ($var instanceof \DateTime) { + $return->__CLASS__ = "DateTime"; + $return->date = $var->format('c'); + $return->timezone = $var->getTimeZone()->getName(); + } else { + $reflClass = ClassUtils::newReflectionObject($var); + $return->__CLASS__ = ClassUtils::getClass($var); + + if ($var instanceof \Doctrine\Common\Persistence\Proxy) { + $return->__IS_PROXY__ = true; + $return->__PROXY_INITIALIZED__ = $var->__isInitialized(); + } + + foreach ($reflClass->getProperties() as $reflProperty) { + $name = $reflProperty->getName(); + + $reflProperty->setAccessible(true); + $return->$name = self::export($reflProperty->getValue($var), $maxDepth - 1); + } + } + } else { + $return = $var; + } + } else { + $return = is_object($var) ? get_class($var) + : (is_array($var) ? 'Array(' . count($var) . ')' : $var); + } + + return $return; + } + + public static function toString($obj) + { + return method_exists('__toString', $obj) ? (string) $obj : get_class($obj) . '@' . spl_object_hash($obj); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php new file mode 100644 index 00000000..ba1eb17b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php @@ -0,0 +1,72 @@ +. + */ + +namespace Doctrine\Common\Util; + +/** + * Doctrine inflector has static methods for inflecting text + * + * The methods in these classes are from several different sources collected + * across several different php projects and several different authors. The + * original author names and emails are not known + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 1.0 + * @version $Revision: 3189 $ + * @author Konsta Vesterinen + * @author Jonathan H. Wage + */ +class Inflector +{ + /** + * Convert word in to the format for a Doctrine table name. Converts 'ModelName' to 'model_name' + * + * @param string $word Word to tableize + * @return string $word Tableized word + */ + public static function tableize($word) + { + return strtolower(preg_replace('~(?<=\\w)([A-Z])~', '_$1', $word)); + } + + /** + * Convert a word in to the format for a Doctrine class name. Converts 'table_name' to 'TableName' + * + * @param string $word Word to classify + * @return string $word Classified word + */ + public static function classify($word) + { + return str_replace(" ", "", ucwords(strtr($word, "_-", " "))); + } + + /** + * Camelize a word. This uses the classify() method and turns the first character to lowercase + * + * @param string $word + * @return string $word + */ + public static function camelize($word) + { + return lcfirst(self::classify($word)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Version.php b/vendor/doctrine/common/lib/Doctrine/Common/Version.php new file mode 100644 index 00000000..7a87311f --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Version.php @@ -0,0 +1,55 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Class to store and retrieve the version of Doctrine + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class Version +{ + /** + * Current Doctrine Version + */ + const VERSION = '2.2.3'; + + /** + * Compares a Doctrine version with the current one. + * + * @param string $version Doctrine version to compare. + * @return int Returns -1 if older, 0 if it is the same, 1 if version + * passed as argument is newer. + */ + public static function compare($version) + { + $currentVersion = str_replace(' ', '', strtolower(self::VERSION)); + $version = str_replace(' ', '', $version); + + return version_compare($version, $currentVersion); + } +} diff --git a/vendor/doctrine/common/phpunit.xml.dist b/vendor/doctrine/common/phpunit.xml.dist new file mode 100644 index 00000000..b9d3b340 --- /dev/null +++ b/vendor/doctrine/common/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + ./tests/Doctrine/ + + + + + + ./lib/Doctrine/ + + + + + + performance + + + diff --git a/vendor/doctrine/common/tests/.gitignore b/vendor/doctrine/common/tests/.gitignore new file mode 100644 index 00000000..72104052 --- /dev/null +++ b/vendor/doctrine/common/tests/.gitignore @@ -0,0 +1,3 @@ +Doctrine/Tests/Proxies/ +Doctrine/Tests/ORM/Proxy/generated/ +Doctrine/Tests/ORM/Tools/Export/export diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php new file mode 100644 index 00000000..0a329a3c --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php @@ -0,0 +1,538 @@ +getReader(); + + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\DummyClass'); + $this->assertEquals(1, count($reader->getClassAnnotations($class))); + $this->assertInstanceOf($annotName = 'Doctrine\Tests\Common\Annotations\DummyAnnotation', $annot = $reader->getClassAnnotation($class, $annotName)); + $this->assertEquals("hello", $annot->dummyValue); + + $field1Prop = $class->getProperty('field1'); + $propAnnots = $reader->getPropertyAnnotations($field1Prop); + $this->assertEquals(1, count($propAnnots)); + $this->assertInstanceOf($annotName, $annot = $reader->getPropertyAnnotation($field1Prop, $annotName)); + $this->assertEquals("fieldHello", $annot->dummyValue); + + $getField1Method = $class->getMethod('getField1'); + $methodAnnots = $reader->getMethodAnnotations($getField1Method); + $this->assertEquals(1, count($methodAnnots)); + $this->assertInstanceOf($annotName, $annot = $reader->getMethodAnnotation($getField1Method, $annotName)); + $this->assertEquals(array(1, 2, "three"), $annot->value); + + $field2Prop = $class->getProperty('field2'); + $propAnnots = $reader->getPropertyAnnotations($field2Prop); + $this->assertEquals(1, count($propAnnots)); + $this->assertInstanceOf($annotName = 'Doctrine\Tests\Common\Annotations\DummyJoinTable', $joinTableAnnot = $reader->getPropertyAnnotation($field2Prop, $annotName)); + $this->assertEquals(1, count($joinTableAnnot->joinColumns)); + $this->assertEquals(1, count($joinTableAnnot->inverseJoinColumns)); + $this->assertTrue($joinTableAnnot->joinColumns[0] instanceof DummyJoinColumn); + $this->assertTrue($joinTableAnnot->inverseJoinColumns[0] instanceof DummyJoinColumn); + $this->assertEquals('col1', $joinTableAnnot->joinColumns[0]->name); + $this->assertEquals('col2', $joinTableAnnot->joinColumns[0]->referencedColumnName); + $this->assertEquals('col3', $joinTableAnnot->inverseJoinColumns[0]->name); + $this->assertEquals('col4', $joinTableAnnot->inverseJoinColumns[0]->referencedColumnName); + + $dummyAnnot = $reader->getMethodAnnotation($class->getMethod('getField1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('', $dummyAnnot->dummyValue); + $this->assertEquals(array(1, 2, 'three'), $dummyAnnot->value); + + $dummyAnnot = $reader->getPropertyAnnotation($class->getProperty('field1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('fieldHello', $dummyAnnot->dummyValue); + + $classAnnot = $reader->getClassAnnotation($class, 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('hello', $classAnnot->dummyValue); + } + + public function testAnnotationsWithValidTargets() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithValidAnnotationTarget'); + + $this->assertEquals(1,count($reader->getClassAnnotations($class))); + $this->assertEquals(1,count($reader->getPropertyAnnotations($class->getProperty('foo')))); + $this->assertEquals(1,count($reader->getMethodAnnotations($class->getMethod('someFunction')))); + $this->assertEquals(1,count($reader->getPropertyAnnotations($class->getProperty('nested')))); + } + + public function testAnnotationsWithVarType() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $this->assertEquals(1,count($fooAnnot = $reader->getPropertyAnnotations($class->getProperty('foo')))); + $this->assertEquals(1,count($barAnnot = $reader->getMethodAnnotations($class->getMethod('bar')))); + + $this->assertInternalType('string', $fooAnnot[0]->string); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', $barAnnot[0]->annotation); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetPropertyMethod is not allowed to be declared on class Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass. You may only use this annotation on these code elements: METHOD, PROPERTY + */ + public function testClassWithInvalidAnnotationTargetAtClassDocBlock() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetClass is not allowed to be declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty::$foo. You may only use this annotation on these code elements: CLASS + */ + public function testClassWithInvalidAnnotationTargetAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty', 'foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetAnnotation is not allowed to be declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty::$bar. You may only use this annotation on these code elements: ANNOTATION + */ + public function testClassWithInvalidNestedAnnotationTargetAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty', 'bar')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetClass is not allowed to be declared on method Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod::functionName(). You may only use this annotation on these code elements: CLASS + */ + public function testClassWithInvalidAnnotationTargetAtMethodDocBlock() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod', 'functionName')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtClassDocBlock() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError','foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtMethodDocBlock() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError','bar')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Type Error] Attribute "string" of @AnnotationWithVarType declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType::$invalidProperty expects a(n) string, but got integer. + */ + public function testClassWithPropertyInvalidVarTypeError() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $reader->getPropertyAnnotations($class->getProperty('invalidProperty')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Type Error] Attribute "annotation" of @AnnotationWithVarType declared on method Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType::invalidMethod() expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll, but got an instance of Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. + */ + public function testClassWithMethodInvalidVarTypeError() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $reader->getMethodAnnotations($class->getMethod('invalidMethod')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in class Doctrine\Tests\Common\Annotations\DummyClassSyntaxError. + */ + public function testClassSyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\DummyClassSyntaxError')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in method Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError::foo(). + */ + public function testMethodSyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError', 'foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in property Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError::$foo. + */ + public function testPropertySyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError', 'foo')); + } + + /** + * @group regression + */ + public function testMultipleAnnotationsOnSameLine() + { + $reader = $this->getReader(); + $annots = $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClass2', 'id')); + $this->assertEquals(3, count($annots)); + } + + public function testNonAnnotationProblem() + { + $reader = $this->getReader(); + + $this->assertNotNull($annot = $reader->getPropertyAnnotation(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClassNonAnnotationProblem', 'foo'), $name = 'Doctrine\Tests\Common\Annotations\DummyAnnotation')); + $this->assertInstanceOf($name, $annot); + } + + public function testImportWithConcreteAnnotation() + { + $reader = $this->getReader(); + $property = new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestImportWithConcreteAnnotation', 'field'); + $annotations = $reader->getPropertyAnnotations($property); + $this->assertEquals(1, count($annotations)); + $this->assertNotNull($reader->getPropertyAnnotation($property, 'Doctrine\Tests\Common\Annotations\DummyAnnotation')); + } + + public function testImportWithInheritance() + { + $reader = $this->getReader(); + + $class = new TestParentClass(); + $ref = new \ReflectionClass($class); + + $childAnnotations = $reader->getPropertyAnnotations($ref->getProperty('child')); + $this->assertEquals(1, count($childAnnotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Foo\Name', reset($childAnnotations)); + + $parentAnnotations = $reader->getPropertyAnnotations($ref->getProperty('parent')); + $this->assertEquals(1, count($parentAnnotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Bar\Name', reset($parentAnnotations)); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation "@NameFoo" in property Doctrine\Tests\Common\Annotations\TestAnnotationNotImportedClass::$field was never imported. + */ + public function testImportDetectsNotImportedAnnotation() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestAnnotationNotImportedClass', 'field')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation "@Foo\Bar\Name" in property Doctrine\Tests\Common\Annotations\TestNonExistentAnnotationClass::$field was never imported. + */ + public function testImportDetectsNonExistentAnnotation() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestNonExistentAnnotationClass', 'field')); + } + + public function testTopLevelAnnotation() + { + $reader = $this->getReader(); + $annotations = $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestTopLevelAnnotationClass', 'field')); + + $this->assertEquals(1, count($annotations)); + $this->assertInstanceOf('\TopLevelAnnotation', reset($annotations)); + } + + public function testIgnoresAnnotationsNotPrefixedWithWhitespace() + { + $reader = $this->getReader(); + + $annotation = $reader->getClassAnnotation(new \ReflectionClass(new TestIgnoresNonAnnotationsClass()), 'Doctrine\Tests\Common\Annotations\Name'); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Name', $annotation); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The class "Doctrine\Tests\Common\Annotations\Fixtures\NoAnnotation" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "Doctrine\Tests\Common\Annotations\Fixtures\NoAnnotation". If it is indeed no annotation, then you need to add @IgnoreAnnotation("NoAnnotation") to the _class_ doc comment of class Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageClass. + */ + public function testErrorWhenInvalidAnnotationIsUsed() + { + $reader = $this->getReader(); + $ref = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageClass'); + $reader->getClassAnnotations($ref); + } + + public function testInvalidAnnotationUsageButIgnoredClass() + { + $reader = $this->getReader(); + $ref = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageButIgnoredClass'); + $annots = $reader->getClassAnnotations($ref); + + $this->assertEquals(2, count($annots)); + } + + /** + * @group DDC-1660 + * @group regression + */ + public function testInvalidAnnotationButIgnored() + { + $reader = $this->getReader(); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassDDC1660'); + + $this->assertTrue(class_exists('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Version')); + $this->assertCount(0, $reader->getClassAnnotations($class)); + $this->assertCount(0, $reader->getMethodAnnotations($class->getMethod('bar'))); + $this->assertCount(0, $reader->getPropertyAnnotations($class->getProperty('foo'))); + } + + abstract protected function getReader(); +} + +/** + * @parseAnnotation("var") + * @author Johannes M. Schmitt + * + */ +class TestParseAnnotationClass +{ + /** + * @var + */ + private $field; +} + +/** + * @Name + * @author Johannes M. Schmitt + */ +class TestIgnoresNonAnnotationsClass +{ +} + +class TestTopLevelAnnotationClass +{ + /** + * @\TopLevelAnnotation + */ + private $field; +} + +class TestNonExistentAnnotationClass +{ + /** + * @Foo\Bar\Name + */ + private $field; +} + +class TestAnnotationNotImportedClass +{ + /** + * @NameFoo + */ + private $field; +} + +class TestChildClass +{ + /** + * @\Doctrine\Tests\Common\Annotations\Foo\Name(name = "foo") + */ + protected $child; +} + +class TestParentClass extends TestChildClass +{ + /** + * @\Doctrine\Tests\Common\Annotations\Bar\Name(name = "bar") + */ + private $parent; +} + +class TestImportWithConcreteAnnotation +{ + /** + * @DummyAnnotation(dummyValue = "bar") + */ + private $field; +} + +/** + * A description of this class. + * + * Let's see if the parser recognizes that this @ is not really referring to an + * annotation. Also make sure that @var \ is not concated to "@var\is". + * + * @author robo + * @since 2.0 + * @DummyAnnotation(dummyValue="hello") + */ +class DummyClass { + /** + * A nice property. + * + * @var mixed + * @DummyAnnotation(dummyValue="fieldHello") + */ + private $field1; + + /** + * @DummyJoinTable(name="join_table", + * joinColumns={@DummyJoinColumn(name="col1", referencedColumnName="col2")}, + * inverseJoinColumns={ + * @DummyJoinColumn(name="col3", referencedColumnName="col4") + * }) + */ + private $field2; + + /** + * Gets the value of field1. + * + * @return mixed + * @DummyAnnotation({1,2,"three"}) + */ + public function getField1() { + } +} + +/** + * @ignoreAnnotation("var") + */ +class DummyClass2 { + /** + * @DummyId @DummyColumn(type="integer") @DummyGeneratedValue + * @var integer + */ + private $id; +} + +/** @Annotation */ +class DummyId extends \Doctrine\Common\Annotations\Annotation {} +/** @Annotation */ +class DummyColumn extends \Doctrine\Common\Annotations\Annotation { + public $type; +} +/** @Annotation */ +class DummyGeneratedValue extends \Doctrine\Common\Annotations\Annotation {} +/** @Annotation */ +class DummyAnnotation extends \Doctrine\Common\Annotations\Annotation { + public $dummyValue; +} +/** @Annotation */ +class DummyJoinColumn extends \Doctrine\Common\Annotations\Annotation { + public $name; + public $referencedColumnName; +} +/** @Annotation */ +class DummyJoinTable extends \Doctrine\Common\Annotations\Annotation { + public $name; + public $joinColumns; + public $inverseJoinColumns; +} + +/** + * @DummyAnnotation(@) + */ +class DummyClassSyntaxError +{ + +} + +class DummyClassMethodSyntaxError +{ + /** + * @DummyAnnotation(@) + */ + public function foo() + { + + } +} + +class DummyClassPropertySyntaxError +{ + /** + * @DummyAnnotation(@) + */ + public $foo; +} + +/** + * @ignoreAnnotation({"since", "var"}) + */ +class DummyClassNonAnnotationProblem +{ + /** + * @DummyAnnotation + * + * @var \Test + * @since 0.1 + */ + public $foo; +} + + +/** +* @DummyAnnotation Foo bar +*/ +class DummyClassWithEmail +{ + +} + +namespace Doctrine\Tests\Common\Annotations\Foo; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation +{ + public $name; +} + +namespace Doctrine\Tests\Common\Annotations\Bar; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation +{ + public $name; +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php new file mode 100644 index 00000000..d2cc6678 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php @@ -0,0 +1,13 @@ +getMock('Doctrine\Common\Cache\Cache'); + $cache + ->expects($this->at(0)) + ->method('fetch') + ->with($this->equalTo($cacheKey)) + ->will($this->returnValue(array())) + ; + $cache + ->expects($this->at(1)) + ->method('fetch') + ->with($this->equalTo('[C]'.$cacheKey)) + ->will($this->returnValue(time() - 10)) + ; + $cache + ->expects($this->at(2)) + ->method('save') + ->with($this->equalTo($cacheKey)) + ; + $cache + ->expects($this->at(3)) + ->method('save') + ->with($this->equalTo('[C]'.$cacheKey)) + ; + + $reader = new CachedReader(new AnnotationReader(), $cache, true); + $route = new Route(); + $route->pattern = '/someprefix'; + $this->assertEquals(array($route), $reader->getClassAnnotations(new \ReflectionClass($name))); + } + + protected function getReader() + { + $this->cache = new ArrayCache(); + return new CachedReader(new AnnotationReader(), $this->cache); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php new file mode 100644 index 00000000..cb080f08 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php @@ -0,0 +1,27 @@ +setInput("@Name"); + $this->assertNull($lexer->token); + $this->assertNull($lexer->lookahead); + + $this->assertTrue($lexer->moveNext()); + $this->assertNull($lexer->token); + $this->assertEquals('@', $lexer->lookahead['value']); + + $this->assertTrue($lexer->moveNext()); + $this->assertEquals('@', $lexer->token['value']); + $this->assertEquals('Name', $lexer->lookahead['value']); + + $this->assertFalse($lexer->moveNext()); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php new file mode 100644 index 00000000..56cae7fd --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php @@ -0,0 +1,1118 @@ +createTestParser(); + + // Nested arrays with nested annotations + $result = $parser->parse('@Name(foo={1,2, {"key"=@Name}})'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertNull($annot->value); + $this->assertEquals(3, count($annot->foo)); + $this->assertEquals(1, $annot->foo[0]); + $this->assertEquals(2, $annot->foo[1]); + $this->assertTrue(is_array($annot->foo[2])); + + $nestedArray = $annot->foo[2]; + $this->assertTrue(isset($nestedArray['key'])); + $this->assertTrue($nestedArray['key'] instanceof Name); + } + + public function testBasicAnnotations() + { + $parser = $this->createTestParser(); + + // Marker annotation + $result = $parser->parse("@Name"); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertNull($annot->value); + $this->assertNull($annot->foo); + + // Associative arrays + $result = $parser->parse('@Name(foo={"key1" = "value1"})'); + $annot = $result[0]; + $this->assertNull($annot->value); + $this->assertTrue(is_array($annot->foo)); + $this->assertTrue(isset($annot->foo['key1'])); + + // Numerical arrays + $result = $parser->parse('@Name({2="foo", 4="bar"})'); + $annot = $result[0]; + $this->assertTrue(is_array($annot->value)); + $this->assertEquals('foo', $annot->value[2]); + $this->assertEquals('bar', $annot->value[4]); + $this->assertFalse(isset($annot->value[0])); + $this->assertFalse(isset($annot->value[1])); + $this->assertFalse(isset($annot->value[3])); + + // Multiple values + $result = $parser->parse('@Name(@Name, @Name)'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertTrue(is_array($annot->value)); + $this->assertTrue($annot->value[0] instanceof Name); + $this->assertTrue($annot->value[1] instanceof Name); + + // Multiple types as values + $result = $parser->parse('@Name(foo="Bar", @Name, {"key1"="value1", "key2"="value2"})'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertTrue(is_array($annot->value)); + $this->assertTrue($annot->value[0] instanceof Name); + $this->assertTrue(is_array($annot->value[1])); + $this->assertEquals('value1', $annot->value[1]['key1']); + $this->assertEquals('value2', $annot->value[1]['key2']); + + // Complete docblock + $docblock = <<parse($docblock); + $this->assertEquals(1, count($result)); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + $this->assertNull($annot->value); + } + + public function testNamespacedAnnotations() + { + $parser = new DocParser; + $parser->setIgnoreNotImportedAnnotations(true); + + $docblock = << + * @Doctrine\Tests\Common\Annotations\Name(foo="bar") + * @ignore + */ +DOCBLOCK; + + $result = $parser->parse($docblock); + $this->assertEquals(1, count($result)); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + } + + /** + * @group debug + */ + public function testTypicalMethodDocBlock() + { + $parser = $this->createTestParser(); + + $docblock = <<parse($docblock); + $this->assertEquals(2, count($result)); + $this->assertTrue(isset($result[0])); + $this->assertTrue(isset($result[1])); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + $marker = $result[1]; + $this->assertTrue($marker instanceof Marker); + } + + + public function testAnnotationWithoutConstructor() + { + $parser = $this->createTestParser(); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertNotNull($annot); + $this->assertTrue($annot instanceof SomeAnnotationClassNameWithoutConstructor); + + $this->assertNull($annot->name); + $this->assertNotNull($annot->data); + $this->assertEquals($annot->data, "Some data"); + + + + +$docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertNotNull($annot); + $this->assertTrue($annot instanceof SomeAnnotationClassNameWithoutConstructor); + + $this->assertEquals($annot->name, "Some Name"); + $this->assertEquals($annot->data, "Some data"); + + + + +$docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->data, "Some data"); + $this->assertNull($annot->name); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertNull($annot->data); + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->data, "Some data"); + $this->assertNull($annot->name); + + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertEquals($annot->data, "Some data"); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertEquals($annot->data, "Some data"); + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $this->assertTrue($result[0] instanceof SomeAnnotationClassNameWithoutConstructorAndProperties); + } + + public function testAnnotationTarget() + { + + $parser = new DocParser; + $parser->setImports(array( + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations\Fixtures', + )); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithValidAnnotationTarget'); + + + $context = 'class ' . $class->getName(); + $docComment = $class->getDocComment(); + + $parser->setTarget(Target::TARGET_CLASS); + $this->assertNotNull($parser->parse($docComment,$context)); + + + $property = $class->getProperty('foo'); + $docComment = $property->getDocComment(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + + $parser->setTarget(Target::TARGET_PROPERTY); + $this->assertNotNull($parser->parse($docComment,$context)); + + + + $method = $class->getMethod('someFunction'); + $docComment = $property->getDocComment(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + + $parser->setTarget(Target::TARGET_METHOD); + $this->assertNotNull($parser->parse($docComment,$context)); + + + try { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass'); + $context = 'class ' . $class->getName(); + $docComment = $class->getDocComment(); + + $parser->setTarget(Target::TARGET_CLASS); + $parser->parse($class->getDocComment(),$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + + try { + + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod'); + $method = $class->getMethod('functionName'); + $docComment = $method->getDocComment(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + + $parser->setTarget(Target::TARGET_METHOD); + $parser->parse($docComment,$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + + try { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty'); + $property = $class->getProperty('foo'); + $docComment = $property->getDocComment(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + + $parser->setTarget(Target::TARGET_PROPERTY); + $parser->parse($docComment,$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + } + + public function getAnnotationVarTypeProviderValid() + { + //({attribute name}, {attribute value}) + return array( + // mixed type + array('mixed', '"String Value"'), + array('mixed', 'true'), + array('mixed', 'false'), + array('mixed', '1'), + array('mixed', '1.2'), + array('mixed', '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll'), + + // boolean type + array('boolean', 'true'), + array('boolean', 'false'), + + // alias for internal type boolean + array('bool', 'true'), + array('bool', 'false'), + + // integer type + array('integer', '0'), + array('integer', '1'), + array('integer', '123456789'), + array('integer', '9223372036854775807'), + + // alias for internal type double + array('float', '0.1'), + array('float', '1.2'), + array('float', '123.456'), + + // string type + array('string', '"String Value"'), + array('string', '"true"'), + array('string', '"123"'), + + // array type + array('array', '{@AnnotationExtendsAnnotationTargetAll}'), + array('array', '{@AnnotationExtendsAnnotationTargetAll,@AnnotationExtendsAnnotationTargetAll}'), + + array('arrayOfIntegers', '1'), + array('arrayOfIntegers', '{1}'), + array('arrayOfIntegers', '{1,2,3,4}'), + array('arrayOfAnnotations', '@AnnotationExtendsAnnotationTargetAll'), + array('arrayOfAnnotations', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll}'), + array('arrayOfAnnotations', '{@AnnotationExtendsAnnotationTargetAll, @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll}'), + + // annotation instance + array('annotation', '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll'), + array('annotation', '@AnnotationExtendsAnnotationTargetAll'), + ); + } + + public function getAnnotationVarTypeProviderInvalid() + { + //({attribute name}, {type declared type}, {attribute value} , {given type or class}) + return array( + // boolean type + array('boolean','boolean','1','integer'), + array('boolean','boolean','1.2','double'), + array('boolean','boolean','"str"','string'), + array('boolean','boolean','{1,2,3}','array'), + array('boolean','boolean','@Name', 'an instance of Doctrine\Tests\Common\Annotations\Name'), + + // alias for internal type boolean + array('bool','bool', '1','integer'), + array('bool','bool', '1.2','double'), + array('bool','bool', '"str"','string'), + array('bool','bool', '{"str"}','array'), + + // integer type + array('integer','integer', 'true','boolean'), + array('integer','integer', 'false','boolean'), + array('integer','integer', '1.2','double'), + array('integer','integer', '"str"','string'), + array('integer','integer', '{"str"}','array'), + array('integer','integer', '{1,2,3,4}','array'), + + // alias for internal type double + array('float','float', 'true','boolean'), + array('float','float', 'false','boolean'), + array('float','float', '123','integer'), + array('float','float', '"str"','string'), + array('float','float', '{"str"}','array'), + array('float','float', '{12.34}','array'), + array('float','float', '{1,2,3}','array'), + + // string type + array('string','string', 'true','boolean'), + array('string','string', 'false','boolean'), + array('string','string', '12','integer'), + array('string','string', '1.2','double'), + array('string','string', '{"str"}','array'), + array('string','string', '{1,2,3,4}','array'), + + // annotation instance + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'true','boolean'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'false','boolean'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '12','integer'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '1.2','double'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{"str"}','array'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{1,2,3,4}','array'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '@Name','an instance of Doctrine\Tests\Common\Annotations\Name'), + ); + } + + public function getAnnotationVarTypeArrayProviderInvalid() + { + //({attribute name}, {type declared type}, {attribute value} , {given type or class}) + return array( + array('arrayOfIntegers','integer', 'true','boolean'), + array('arrayOfIntegers','integer', 'false','boolean'), + array('arrayOfIntegers','integer', '{true,true}','boolean'), + array('arrayOfIntegers','integer', '{1,true}','boolean'), + array('arrayOfIntegers','integer', '{1,2,1.2}','double'), + array('arrayOfIntegers','integer', '{1,2,"str"}','string'), + + + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'true','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'false','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,true}','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,true}','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,1.2}','double'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,@AnnotationExtendsAnnotationTargetAll,"str"}','string'), + ); + } + + /** + * @dataProvider getAnnotationVarTypeProviderValid + */ + public function testAnnotationWithVarType($attribute, $value) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::$invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + $result = $parser->parse($docblock, $context); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType', $result[0]); + $this->assertNotNull($result[0]->$attribute); + } + + /** + * @dataProvider getAnnotationVarTypeProviderInvalid + */ + public function testAnnotationWithVarTypeError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType declared on property SomeClassName::invalidProperty. expects a(n) $type, but got $given.", $exc->getMessage()); + } + } + + + /** + * @dataProvider getAnnotationVarTypeArrayProviderInvalid + */ + public function testAnnotationWithVarTypeArrayError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType declared on property SomeClassName::invalidProperty. expects either a(n) $type, or an array of {$type}s, but got $given.", $exc->getMessage()); + } + } + + /** + * @dataProvider getAnnotationVarTypeProviderValid + */ + public function testAnnotationWithAttributes($attribute, $value) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::$invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + $result = $parser->parse($docblock, $context); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes', $result[0]); + $getter = "get".ucfirst($attribute); + $this->assertNotNull($result[0]->$getter()); + } + + /** + * @dataProvider getAnnotationVarTypeProviderInvalid + */ + public function testAnnotationWithAttributesError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes declared on property SomeClassName::invalidProperty. expects a(n) $type, but got $given.", $exc->getMessage()); + } + } + + + /** + * @dataProvider getAnnotationVarTypeArrayProviderInvalid + */ + public function testAnnotationWithAttributesWithVarTypeArrayError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes declared on property SomeClassName::invalidProperty. expects either a(n) $type, or an array of {$type}s, but got $given.", $exc->getMessage()); + } + } + + public function testAnnotationWithRequiredAttributes() + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $parser->setTarget(Target::TARGET_PROPERTY); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes("Some Value", annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + $result = $parser->parse($docblock); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes', $result[0]); + $this->assertEquals("Some Value",$result[0]->getValue()); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation', $result[0]->getAnnot()); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes("Some Value")'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "annot" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes declared on property SomeClassName::invalidProperty. expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. This value should not be null.', $exc->getMessage()); + } + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes(annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "value" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes declared on property SomeClassName::invalidProperty. expects a(n) string. This value should not be null.', $exc->getMessage()); + } + + } + + public function testAnnotationWithRequiredAttributesWithoutContructor() + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $parser->setTarget(Target::TARGET_PROPERTY); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor("Some Value", annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + $result = $parser->parse($docblock); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor', $result[0]); + $this->assertEquals("Some Value", $result[0]->value); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation', $result[0]->annot); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor("Some Value")'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "annot" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor declared on property SomeClassName::invalidProperty. expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. This value should not be null.', $exc->getMessage()); + } + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor(annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "value" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor declared on property SomeClassName::invalidProperty. expects a(n) string. This value should not be null.', $exc->getMessage()); + } + + } + + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation @SomeAnnotationClassNameWithoutConstructorAndProperties declared on does not accept any values, but got {"value":"Foo"}. + */ + public function testWithoutConstructorWhenIsNotDefaultValue() + { + $parser = $this->createTestParser(); + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation @SomeAnnotationClassNameWithoutConstructorAndProperties declared on does not accept any values, but got {"value":"Foo"}. + */ + public function testWithoutConstructorWhenHasNoProperties() + { + $parser = $this->createTestParser(); + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testAnnotationTargetSyntaxError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Invalid Target "Foo". Available targets: [ALL, CLASS, METHOD, PROPERTY, ANNOTATION] + */ + public function testAnnotationWithInvalidTargetDeclarationError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage @Target expects either a string value, or an array of strings, "NULL" given. + */ + public function testAnnotationWithTargetEmptyError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @group DDC-575 + */ + public function testRegressionDDC575() + { + $parser = $this->createTestParser(); + + $docblock = <<parse($docblock); + + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Name", $result[0]); + + $docblock = <<parse($docblock); + + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Name", $result[0]); + } + + /** + * @group DDC-77 + */ + public function testAnnotationWithoutClassIsIgnoredWithoutWarning() + { + $parser = new DocParser(); + $parser->setIgnoreNotImportedAnnotations(true); + $result = $parser->parse("@param"); + + $this->assertEquals(0, count($result)); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected PlainValue, got ''' at position 10. + */ + public function testAnnotationDontAcceptSingleQuotes() + { + $parser = $this->createTestParser(); + $parser->parse("@Name(foo='bar')"); + } + + /** + * @group DCOM-41 + */ + public function testAnnotationDoesntThrowExceptionWhenAtSignIsNotFollowedByIdentifier() + { + $parser = new DocParser(); + $result = $parser->parse("'@'"); + + $this->assertEquals(0, count($result)); + } + + /** + * @group DCOM-41 + * @expectedException Doctrine\Common\Annotations\AnnotationException + */ + public function testAnnotationThrowsExceptionWhenAtSignIsNotFollowedByIdentifierInNestedAnnotation() + { + $parser = new DocParser(); + $result = $parser->parse("@Doctrine\Tests\Common\Annotations\Name(@')"); + } + + /** + * @group DCOM-56 + */ + public function testAutoloadAnnotation() + { + $this->assertFalse(class_exists('Doctrine\Tests\Common\Annotations\Fixture\Annotation\Autoload', false), 'Pre-condition: Doctrine\Tests\Common\Annotations\Fixture\Annotation\Autoload not allowed to be loaded.'); + + $parser = new DocParser(); + + AnnotationRegistry::registerAutoloadNamespace('Doctrine\Tests\Common\Annotations\Fixtures\Annotation', __DIR__ . '/../../../../'); + + $parser->setImports(array( + 'autoload' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Autoload', + )); + $annotations = $parser->parse('@Autoload'); + + $this->assertEquals(1, count($annotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Autoload', $annotations[0]); + } + + public function createTestParser() + { + $parser = new DocParser(); + $parser->setIgnoreNotImportedAnnotations(true); + $parser->setImports(array( + 'name' => 'Doctrine\Tests\Common\Annotations\Name', + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations', + )); + + return $parser; + } + + /** + * @group DDC-78 + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected PlainValue, got ''' at position 10 in class \Doctrine\Tests\Common\Annotations\Name + */ + public function testSyntaxErrorWithContextDescription() + { + $parser = $this->createTestParser(); + $parser->parse("@Name(foo='bar')", "class \Doctrine\Tests\Common\Annotations\Name"); + } + + /** + * @group DDC-183 + */ + public function testSyntaxErrorWithUnknownCharacters() + { + $docblock = <<setInput(trim($docblock, '/ *')); + //var_dump($lexer); + + try { + $parser = $this->createTestParser(); + $result = $parser->parse($docblock); + } catch (Exception $e) { + $this->fail($e->getMessage()); + } + } + + /** + * @group DCOM-14 + */ + public function testIgnorePHPDocThrowTag() + { + $docblock = <<createTestParser(); + $result = $parser->parse($docblock); + } catch (Exception $e) { + $this->fail($e->getMessage()); + } + } + + /** + * @group DCOM-38 + */ + public function testCastInt() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=1234)"); + $annot = $result[0]; + $this->assertInternalType('int', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastNegativeInt() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=-1234)"); + $annot = $result[0]; + $this->assertInternalType('int', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastFloat() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastNegativeFloat() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=-1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->foo); + + $result = $parser->parse("@Marker(-1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->value); + } + + public function testReservedKeywordsInAnnotations() + { + $parser = $this->createTestParser(); + + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\True'); + $this->assertTrue($result[0] instanceof True); + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\False'); + $this->assertTrue($result[0] instanceof False); + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\Null'); + $this->assertTrue($result[0] instanceof Null); + + $result = $parser->parse('@True'); + $this->assertTrue($result[0] instanceof True); + $result = $parser->parse('@False'); + $this->assertTrue($result[0] instanceof False); + $result = $parser->parse('@Null'); + $this->assertTrue($result[0] instanceof Null); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Creation Error] The annotation @SomeAnnotationClassNameWithoutConstructor declared on some class does not have a property named "invalidaProperty". Available properties: data, name + */ + public function testSetValuesExeption() + { + $docblock = <<createTestParser()->parse($docblock, 'some class'); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Syntax Error] Expected Doctrine\Common\Annotations\DocLexer::T_IDENTIFIER or Doctrine\Common\Annotations\DocLexer::T_TRUE or Doctrine\Common\Annotations\DocLexer::T_FALSE or Doctrine\Common\Annotations\DocLexer::T_NULL, got '3.42' at position 5. + */ + public function testInvalidIdentifierInAnnotation() + { + $parser = $this->createTestParser(); + $parser->parse('@Foo\3.42'); + } + + public function testTrailingCommaIsAllowed() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Name({ + "Foo", + "Bar", + })'); + $this->assertEquals(1, count($annots)); + $this->assertEquals(array('Foo', 'Bar'), $annots[0]->value); + } + + public function testDefaultAnnotationValueIsNotOverwritten() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Doctrine\Tests\Common\Annotations\Fixtures\Annotation\AnnotWithDefaultValue'); + $this->assertEquals(1, count($annots)); + $this->assertEquals('bar', $annots[0]->foo); + } + + public function testArrayWithColon() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Name({"foo": "bar"})'); + $this->assertEquals(1, count($annots)); + $this->assertEquals(array('foo' => 'bar'), $annots[0]->value); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Syntax Error] Expected PlainValue, got 'foo:' at position 6. + */ + public function testColonNotAllowedOnTopLevel() + { + $parser = $this->createTestParser(); + $parser->parse('@Name(foo: "bar")'); + } +} + +/** @Annotation */ +class SomeAnnotationClassNameWithoutConstructor +{ + public $data; + public $name; +} + +/** @Annotation */ +class SomeAnnotationWithConstructorWithoutParams +{ + function __construct() + { + $this->data = "Some data"; + } + public $data; + public $name; +} + +/** @Annotation */ +class SomeAnnotationClassNameWithoutConstructorAndProperties{} + +/** + * @Annotation + * @Target("Foo") + */ +class AnnotationWithInvalidTargetDeclaration{} + +/** + * @Annotation + * @Target + */ +class AnnotationWithTargetEmpty{} + +/** @Annotation */ +class AnnotationExtendsAnnotationTargetAll extends \Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll +{ +} + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation { + public $foo; +} + +/** @Annotation */ +class Marker { + public $value; +} + +/** @Annotation */ +class True {} + +/** @Annotation */ +class False {} + +/** @Annotation */ +class Null {} + +namespace Doctrine\Tests\Common\Annotations\FooBar; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation { +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php new file mode 100644 index 00000000..c84344d8 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php @@ -0,0 +1,40 @@ +cacheDir = sys_get_temp_dir() . "/annotations_". uniqid(); + @mkdir($this->cacheDir); + return new FileCacheReader(new AnnotationReader(), $this->cacheDir); + } + + public function tearDown() + { + foreach (glob($this->cacheDir.'/*.php') AS $file) { + unlink($file); + } + rmdir($this->cacheDir); + } + + /** + * @group DCOM-81 + */ + public function testAttemptToCreateAnnotationCacheDir() + { + $this->cacheDir = sys_get_temp_dir() . "/not_existed_dir_". uniqid(); + + $this->assertFalse(is_dir($this->cacheDir)); + + $cache = new FileCacheReader(new AnnotationReader(), $this->cacheDir); + + $this->assertTrue(is_dir($this->cacheDir)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php new file mode 100644 index 00000000..44108e19 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php @@ -0,0 +1,10 @@ +roles = $values['value']; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php new file mode 100644 index 00000000..b507e602 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php @@ -0,0 +1,14 @@ +name = isset($values['value']) ? $values['value'] : null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php new file mode 100644 index 00000000..09ef0317 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php @@ -0,0 +1,11 @@ +"), + @Attribute("annotation", type = "Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll"), + @Attribute("arrayOfAnnotations", type = "array"), + }) + */ +final class AnnotationWithAttributes +{ + + public final function __construct(array $data) + { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + private $mixed; + private $boolean; + private $bool; + private $float; + private $string; + private $integer; + private $array; + private $annotation; + private $arrayOfIntegers; + private $arrayOfAnnotations; + + /** + * @return mixed + */ + public function getMixed() + { + return $this->mixed; + } + + /** + * @return boolean + */ + public function getBoolean() + { + return $this->boolean; + } + + /** + * @return bool + */ + public function getBool() + { + return $this->bool; + } + + /** + * @return float + */ + public function getFloat() + { + return $this->float; + } + + /** + * @return string + */ + public function getString() + { + return $this->string; + } + + public function getInteger() + { + return $this->integer; + } + + /** + * @return array + */ + public function getArray() + { + return $this->array; + } + + /** + * @return Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll + */ + public function getAnnotation() + { + return $this->annotation; + } + + /** + * @return array + */ + public function getArrayOfIntegers() + { + return $this->arrayOfIntegers; + } + + /** + * @return array + */ + public function getArrayOfAnnotations() + { + return $this->arrayOfAnnotations; + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php new file mode 100644 index 00000000..6eb1bc5a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php @@ -0,0 +1,50 @@ + $value) { + $this->$key = $value; + } + } + + /** + * @var string + */ + private $value; + + /** + * + * @var Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation + */ + private $annot; + + /** + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * @return Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation + */ + public function getAnnot() + { + return $this->annot; + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php new file mode 100644 index 00000000..bf458ee7 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php @@ -0,0 +1,24 @@ + + */ + public $arrayOfIntegers; + + /** + * @var array + */ + public $arrayOfAnnotations; + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php new file mode 100644 index 00000000..4e652e13 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php @@ -0,0 +1,30 @@ + + */ +class Controller +{ + /** + * @Route("/", name="_demo") + * @Template() + */ + public function indexAction() + { + return array(); + } + + /** + * @Route("/hello/{name}", name="_demo_hello") + * @Template() + */ + public function helloAction($name) + { + return array('name' => $name); + } + + /** + * @Route("/contact", name="_demo_contact") + * @Template() + */ + public function contactAction() + { + $form = ContactForm::create($this->get('form.context'), 'contact'); + + $form->bind($this->container->get('request'), $form); + if ($form->isValid()) { + $form->send($this->get('mailer')); + + $this->get('session')->setFlash('notice', 'Message sent!'); + + return new RedirectResponse($this->generateUrl('_demo')); + } + + return array('form' => $form); + } + + /** + * Creates the ACL for the passed object identity + * + * @param ObjectIdentityInterface $oid + * @return void + */ + private function createObjectIdentity(ObjectIdentityInterface $oid) + { + $classId = $this->createOrRetrieveClassId($oid->getType()); + + $this->connection->executeQuery($this->getInsertObjectIdentitySql($oid->getIdentifier(), $classId, true)); + } + + /** + * Returns the primary key for the passed class type. + * + * If the type does not yet exist in the database, it will be created. + * + * @param string $classType + * @return integer + */ + private function createOrRetrieveClassId($classType) + { + if (false !== $id = $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn()) { + return $id; + } + + $this->connection->executeQuery($this->getInsertClassSql($classType)); + + return $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn(); + } + + /** + * Returns the primary key for the passed security identity. + * + * If the security identity does not yet exist in the database, it will be + * created. + * + * @param SecurityIdentityInterface $sid + * @return integer + */ + private function createOrRetrieveSecurityIdentityId(SecurityIdentityInterface $sid) + { + if (false !== $id = $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn()) { + return $id; + } + + $this->connection->executeQuery($this->getInsertSecurityIdentitySql($sid)); + + return $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn(); + } + + /** + * Deletes all ACEs for the given object identity primary key. + * + * @param integer $oidPK + * @return void + */ + private function deleteAccessControlEntries($oidPK) + { + $this->connection->executeQuery($this->getDeleteAccessControlEntriesSql($oidPK)); + } + + /** + * Deletes the object identity from the database. + * + * @param integer $pk + * @return void + */ + private function deleteObjectIdentity($pk) + { + $this->connection->executeQuery($this->getDeleteObjectIdentitySql($pk)); + } + + /** + * Deletes all entries from the relations table from the database. + * + * @param integer $pk + * @return void + */ + private function deleteObjectIdentityRelations($pk) + { + $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk)); + } + + /** + * This regenerates the ancestor table which is used for fast read access. + * + * @param AclInterface $acl + * @return void + */ + private function regenerateAncestorRelations(AclInterface $acl) + { + $pk = $acl->getId(); + $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk)); + $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $pk)); + + $parentAcl = $acl->getParentAcl(); + while (null !== $parentAcl) { + $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $parentAcl->getId())); + + $parentAcl = $parentAcl->getParentAcl(); + } + } + + /** + * This processes changes on an ACE related property (classFieldAces, or objectFieldAces). + * + * @param string $name + * @param array $changes + * @return void + */ + private function updateFieldAceProperty($name, array $changes) + { + $sids = new \SplObjectStorage(); + $classIds = new \SplObjectStorage(); + $currentIds = array(); + foreach ($changes[1] as $field => $new) { + for ($i=0,$c=count($new); $i<$c; $i++) { + $ace = $new[$i]; + + if (null === $ace->getId()) { + if ($sids->contains($ace->getSecurityIdentity())) { + $sid = $sids->offsetGet($ace->getSecurityIdentity()); + } else { + $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity()); + } + + $oid = $ace->getAcl()->getObjectIdentity(); + if ($classIds->contains($oid)) { + $classId = $classIds->offsetGet($oid); + } else { + $classId = $this->createOrRetrieveClassId($oid->getType()); + } + + $objectIdentityId = $name === 'classFieldAces' ? null : $ace->getAcl()->getId(); + + $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, $field, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure())); + $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, $field, $i))->fetchColumn(); + $this->loadedAces[$aceId] = $ace; + + $aceIdProperty = new \ReflectionProperty('Symfony\Component\Security\Acl\Domain\Entry', 'id'); + $aceIdProperty->setAccessible(true); + $aceIdProperty->setValue($ace, intval($aceId)); + } else { + $currentIds[$ace->getId()] = true; + } + } + } + + foreach ($changes[0] as $old) { + for ($i=0,$c=count($old); $i<$c; $i++) { + $ace = $old[$i]; + + if (!isset($currentIds[$ace->getId()])) { + $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId())); + unset($this->loadedAces[$ace->getId()]); + } + } + } + } + + /** + * This processes changes on an ACE related property (classAces, or objectAces). + * + * @param string $name + * @param array $changes + * @return void + */ + private function updateAceProperty($name, array $changes) + { + list($old, $new) = $changes; + + $sids = new \SplObjectStorage(); + $classIds = new \SplObjectStorage(); + $currentIds = array(); + for ($i=0,$c=count($new); $i<$c; $i++) { + $ace = $new[$i]; + + if (null === $ace->getId()) { + if ($sids->contains($ace->getSecurityIdentity())) { + $sid = $sids->offsetGet($ace->getSecurityIdentity()); + } else { + $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity()); + } + + $oid = $ace->getAcl()->getObjectIdentity(); + if ($classIds->contains($oid)) { + $classId = $classIds->offsetGet($oid); + } else { + $classId = $this->createOrRetrieveClassId($oid->getType()); + } + + $objectIdentityId = $name === 'classAces' ? null : $ace->getAcl()->getId(); + + $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, null, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure())); + $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, null, $i))->fetchColumn(); + $this->loadedAces[$aceId] = $ace; + + $aceIdProperty = new \ReflectionProperty($ace, 'id'); + $aceIdProperty->setAccessible(true); + $aceIdProperty->setValue($ace, intval($aceId)); + } else { + $currentIds[$ace->getId()] = true; + } + } + + for ($i=0,$c=count($old); $i<$c; $i++) { + $ace = $old[$i]; + + if (!isset($currentIds[$ace->getId()])) { + $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId())); + unset($this->loadedAces[$ace->getId()]); + } + } + } + + /** + * Persists the changes which were made to ACEs to the database. + * + * @param \SplObjectStorage $aces + * @return void + */ + private function updateAces(\SplObjectStorage $aces) + { + foreach ($aces as $ace) { + $propertyChanges = $aces->offsetGet($ace); + $sets = array(); + + if (isset($propertyChanges['mask'])) { + $sets[] = sprintf('mask = %d', $propertyChanges['mask'][1]); + } + if (isset($propertyChanges['strategy'])) { + $sets[] = sprintf('granting_strategy = %s', $this->connection->quote($propertyChanges['strategy'])); + } + if (isset($propertyChanges['aceOrder'])) { + $sets[] = sprintf('ace_order = %d', $propertyChanges['aceOrder'][1]); + } + if (isset($propertyChanges['auditSuccess'])) { + $sets[] = sprintf('audit_success = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditSuccess'][1])); + } + if (isset($propertyChanges['auditFailure'])) { + $sets[] = sprintf('audit_failure = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditFailure'][1])); + } + + $this->connection->executeQuery($this->getUpdateAccessControlEntrySql($ace->getId(), $sets)); + } + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php new file mode 100644 index 00000000..bda2cc21 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php @@ -0,0 +1,15 @@ +test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test2() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test3() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test4() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test5() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test6() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test7() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test8() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test9() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test10() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test11() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test12() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test13() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test14() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test15() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test16() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test17() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test18() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test19() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test20() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test21() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test22() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test23() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test24() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test25() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test26() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test27() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test28() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test29() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test30() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test31() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test32() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test33() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test34() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test35() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test36() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test37() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test38() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test39() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php new file mode 100644 index 00000000..1dae104a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php @@ -0,0 +1,5 @@ +test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test2() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test3() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test4() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test5() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test6() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test7() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test8() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test9() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test10() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test11() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test12() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test13() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test14() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test15() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test16() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test17() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test18() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test19() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test20() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test21() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test22() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test23() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test24() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test25() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test26() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test27() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test28() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test29() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test30() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test31() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test32() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test33() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test34() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test35() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test36() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test37() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test38() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test39() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php new file mode 100644 index 00000000..58c5e6af --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php @@ -0,0 +1,13 @@ +getMethod(); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $reader->getMethodAnnotations($method); + } + $time = microtime(true) - $time; + + $this->printResults('cached reader (in-memory)', $time, $c); + } + + /** + * @group performance + */ + public function testCachedReadPerformanceWithFileCache() + { + $method = $this->getMethod(); + + // prime cache + $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir()); + $reader->getMethodAnnotations($method); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir()); + $reader->getMethodAnnotations($method); + clearstatcache(); + } + $time = microtime(true) - $time; + + $this->printResults('cached reader (file)', $time, $c); + } + + /** + * @group performance + */ + public function testReadPerformance() + { + $method = $this->getMethod(); + + $time = microtime(true); + for ($i=0,$c=150; $i<$c; $i++) { + $reader = new AnnotationReader(); + $reader->getMethodAnnotations($method); + } + $time = microtime(true) - $time; + + $this->printResults('reader', $time, $c); + } + + /** + * @group performance + */ + public function testDocParsePerformance() + { + $imports = array( + 'ignorephpdoc' => 'Annotations\Annotation\IgnorePhpDoc', + 'ignoreannotation' => 'Annotations\Annotation\IgnoreAnnotation', + 'route' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Route', + 'template' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Template', + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations\Fixtures', + ); + $ignored = array( + 'access', 'author', 'copyright', 'deprecated', 'example', 'ignore', + 'internal', 'link', 'see', 'since', 'tutorial', 'version', 'package', + 'subpackage', 'name', 'global', 'param', 'return', 'staticvar', + 'static', 'var', 'throws', 'inheritdoc', + ); + + $method = $this->getMethod(); + $methodComment = $method->getDocComment(); + $classComment = $method->getDeclaringClass()->getDocComment(); + + $time = microtime(true); + for ($i=0,$c=200; $i<$c; $i++) { + $parser = new DocParser(); + $parser->setImports($imports); + $parser->setIgnoredAnnotationNames($ignored); + $parser->setIgnoreNotImportedAnnotations(true); + + $parser->parse($methodComment); + $parser->parse($classComment); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser', $time, $c); + } + + /** + * @group performance + */ + public function testDocLexerPerformance() + { + $method = $this->getMethod(); + $methodComment = $method->getDocComment(); + $classComment = $method->getDeclaringClass()->getDocComment(); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $lexer = new DocLexer(); + $lexer->setInput($methodComment); + $lexer->setInput($classComment); + } + $time = microtime(true) - $time; + + $this->printResults('doc-lexer', $time, $c); + } + + /** + * @group performance + */ + public function testPhpParserPerformanceWithShortCut() + { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\NamespacedSingleClassLOC1000'); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $parser = new PhpParser(); + $parser->parseClass($class); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser-with-short-cut', $time, $c); + } + + /** + * @group performance + */ + public function testPhpParserPerformanceWithoutShortCut() + { + $class = new \ReflectionClass('SingleClassLOC1000'); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $parser = new PhpParser(); + $parser->parseClass($class); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser-without-short-cut', $time, $c); + } + + private function getMethod() + { + return new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\Controller', 'helloAction'); + } + + private function printResults($test, $time, $iterations) + { + if (0 == $iterations) { + throw new \InvalidArgumentException('$iterations cannot be zero.'); + } + + $title = $test." results:\n"; + $iterationsText = sprintf("Iterations: %d\n", $iterations); + $totalTime = sprintf("Total Time: %.3f s\n", $time); + $iterationTime = sprintf("Time per iteration: %.3f ms\n", $time/$iterations * 1000); + + $max = max(strlen($title), strlen($iterationTime)) - 1; + + echo "\n".str_repeat('-', $max)."\n"; + echo $title; + echo str_repeat('=', $max)."\n"; + echo $iterationsText; + echo $totalTime; + echo $iterationTime; + echo str_repeat('-', $max)."\n"; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php new file mode 100644 index 00000000..8de4aabf --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php @@ -0,0 +1,179 @@ +assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testParseClassWithMultipleImportsInUseStatement() + { + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\MultipleImportsInUseStatement'); + $parser = new PhpParser(); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testParseClassWhenNotUserDefined() + { + $parser = new PhpParser(); + $this->assertEquals(array(), $parser->parseClass(new \ReflectionClass('\stdClass'))); + } + + public function testParseClassWhenClassIsNotNamespaced() + { + $parser = new PhpParser(); + $class = new ReflectionClass('\AnnotationsTestsFixturesNonNamespacedClass'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testParseClassWhenClassIsInterface() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\TestInterface'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testClassWithFullyQualifiedUseStatements() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\ClassWithFullyQualifiedUseStatements'); + + $this->assertEquals(array( + 'secure' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testNamespaceAndClassCommentedOut() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceAndClassCommentedOut'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testEqualNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\EqualNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + ), $parser->parseClass($class)); + } + + public function testEqualNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\EqualNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testDifferentNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\DifferentNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testDifferentNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\DifferentNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testGlobalNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new \ReflectionClass('\GlobalNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + ), $parser->parseClass($class)); + } + + public function testGlobalNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass('\GlobalNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testNamespaceWithClosureDeclaration() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceWithClosureDeclaration'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testIfPointerResetsOnMultipleParsingTries() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceWithClosureDeclaration'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php new file mode 100644 index 00000000..376539ff --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php @@ -0,0 +1,97 @@ +getReader(); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassDDC1660'); + + $this->assertTrue(class_exists('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Version')); + $this->assertCount(1, $reader->getClassAnnotations($class)); + $this->assertCount(1, $reader->getMethodAnnotations($class->getMethod('bar'))); + $this->assertCount(1, $reader->getPropertyAnnotations($class->getProperty('foo'))); + } + + protected function getReader() + { + $reader = new SimpleAnnotationReader(); + $reader->addNamespace(__NAMESPACE__); + $reader->addNamespace(__NAMESPACE__ . '\Fixtures'); + $reader->addNamespace(__NAMESPACE__ . '\Fixtures\Annotation'); + + return $reader; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php new file mode 100644 index 00000000..a7b9e2f2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php @@ -0,0 +1,65 @@ +getClassAnnotations($class); + } + + public function testAnnotation() + { + $class = new \ReflectionClass(__NAMESPACE__ . '\\DCOM55Consumer'); + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $annots = $reader->getClassAnnotations($class); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf(__NAMESPACE__.'\\DCOM55Annotation', $annots[0]); + } + + public function testParseAnnotationDocblocks() + { + $class = new \ReflectionClass(__NAMESPACE__ . '\\DCOM55Annotation'); + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $annots = $reader->getClassAnnotations($class); + + $this->assertEquals(0, count($annots)); + } +} + +/** + * @Controller + */ +class Dummy +{ + +} + +/** + * @Annotation + */ +class DCOM55Annotation +{ + +} + +/** + * @DCOM55Annotation + */ +class DCOM55Consumer +{ + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php new file mode 100644 index 00000000..708bcc99 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php @@ -0,0 +1,8 @@ +getClassAnnotations(new \ReflectionClass(__NAMESPACE__."\MappedClass")); + + foreach ($result as $annot) { + $classAnnotations[get_class($annot)] = $annot; + } + + $this->assertTrue(!isset($classAnnotations['']), 'Class "xxx" is not a valid entity or mapped super class.'); + } + + public function testIssueGlobalNamespace() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->setImports(array( + "__NAMESPACE__" =>"Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping" + )); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + + public function testIssueNamespaces() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM"); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Entity", $annots[0]); + } + + public function testIssueMultipleNamespaces() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping"); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM"); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + + public function testIssueWithNamespacesOrImports() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Entity", $annots[0]); + $this->assertEquals(1, count($annots)); + } + + + public function testIssueSimpleAnnotationReader() + { + $reader = new \Doctrine\Common\Annotations\SimpleAnnotationReader(); + $reader->addNamespace('Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping'); + $annots = $reader->getClassAnnotations(new \ReflectionClass(__NAMESPACE__."\MappedClass")); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + +} + +/** + * @Entity + */ +class MappedClass +{ + +} + + +namespace Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping; +/** +* @Annotation +*/ +class Entity +{ + +} + +namespace Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM; +/** +* @Annotation +*/ +class Entity +{ + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php new file mode 100644 index 00000000..ff3ca376 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php @@ -0,0 +1,8 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of APC'); + } + } + + protected function _getCacheDriver() + { + return new ApcCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php new file mode 100644 index 00000000..71927174 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php @@ -0,0 +1,13 @@ +_getCacheDriver(); + + // Test save + $cache->save('test_key', 'testing this out'); + + // Test contains to test that save() worked + $this->assertTrue($cache->contains('test_key')); + + // Test fetch + $this->assertEquals('testing this out', $cache->fetch('test_key')); + + // Test delete + $cache->save('test_key2', 'test2'); + $cache->delete('test_key2'); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testDeleteAll() + { + $cache = $this->_getCacheDriver(); + $cache->save('test_key1', '1'); + $cache->save('test_key2', '2'); + $cache->deleteAll(); + + $this->assertFalse($cache->contains('test_key1')); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testFlushAll() + { + $cache = $this->_getCacheDriver(); + $cache->save('test_key1', '1'); + $cache->save('test_key2', '2'); + $cache->flushAll(); + + $this->assertFalse($cache->contains('test_key1')); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testNamespace() + { + $cache = $this->_getCacheDriver(); + $cache->setNamespace('test_'); + $cache->save('key1', 'test'); + + $this->assertTrue($cache->contains('key1')); + + $cache->setNamespace('test2_'); + + $this->assertFalse($cache->contains('key1')); + } + + /** + * @group DCOM-43 + */ + public function testGetStats() + { + if ($this instanceof ArrayCacheTest || $this instanceof ZendDataCacheTest ) { + $this->markTestSkipped("Statistics are not available for this driver"); + } + + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + + $this->assertArrayHasKey(Cache::STATS_HITS, $stats); + $this->assertArrayHasKey(Cache::STATS_MISSES, $stats); + $this->assertArrayHasKey(Cache::STATS_UPTIME, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_USAGE, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_AVAILIABLE, $stats); + } + + /** + * @return \Doctrine\Common\Cache\CacheProvider + */ + abstract protected function _getCacheDriver(); +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php new file mode 100644 index 00000000..362ff69a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php @@ -0,0 +1,38 @@ +_memcache = new \Memcache; + $ok = @$this->_memcache->connect('localhost', 11211); + if (!$ok) { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } else { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } + + public function testNoExpire() { + $cache = $this->_getCacheDriver(); + $cache->save('noexpire', 'value', 0); + sleep(1); + $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire'); + } + + protected function _getCacheDriver() + { + $driver = new MemcacheCache(); + $driver->setMemcache($this->_memcache); + return $driver; + } + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php new file mode 100644 index 00000000..947ba752 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php @@ -0,0 +1,40 @@ +memcached = new \Memcached(); + $this->memcached->setOption(\Memcached::OPT_COMPRESSION, false); + $this->memcached->addServer('127.0.0.1', 11211); + + $fh = @fsockopen('127.0.0.1', 11211); + if (!$fh) { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } else { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } + + public function testNoExpire() { + $cache = $this->_getCacheDriver(); + $cache->save('noexpire', 'value', 0); + sleep(1); + $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire'); + } + + protected function _getCacheDriver() + { + $driver = new MemcachedCache(); + $driver->setMemcached($this->memcached); + return $driver; + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php new file mode 100644 index 00000000..cb363df9 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of Wincache'); + } + } + + protected function _getCacheDriver() + { + return new WincacheCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php new file mode 100644 index 00000000..62598487 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of xcache'); + } + } + + protected function _getCacheDriver() + { + return new XcacheCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php new file mode 100644 index 00000000..27dcf359 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of Zend Data Cache which only works in apache2handler SAPI'); + } + } + + protected function _getCacheDriver() + { + return new ZendDataCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php new file mode 100644 index 00000000..567cf918 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php @@ -0,0 +1,45 @@ +setIncludePath(__DIR__); + $classLoader->setFileExtension('.class.php'); + $classLoader->setNamespaceSeparator('_'); + + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassA')); + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassB')); + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassC')); + $this->assertFalse($classLoader->canLoadClass('OtherClass')); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassA'), true); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassB'), true); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassC'), true); + } + + public function testClassExists() + { + $this->assertFalse(ClassLoader::classExists('ClassLoaderTest\ClassD')); + $badLoader = function($className) { + require __DIR__ . '/ClassLoaderTest/ClassD.php'; + return true; + }; + spl_autoload_register($badLoader); + $this->assertTrue(ClassLoader::classExists('ClassLoaderTest\ClassD')); + spl_autoload_unregister($badLoader); + } + + public function testGetClassLoader() + { + $cl = new ClassLoader('ClassLoaderTest', __DIR__); + $cl->register(); + $this->assertTrue(ClassLoader::getClassLoader('ClassLoaderTest\ClassD') instanceof \Doctrine\Common\ClassLoader); + $this->assertNull(ClassLoader::getClassLoader('This\Class\Does\Not\Exist')); + $cl->unregister(); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php new file mode 100644 index 00000000..85546547 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php @@ -0,0 +1,6 @@ +_coll = new \Doctrine\Common\Collections\ArrayCollection; + } + + public function testIssetAndUnset() + { + $this->assertFalse(isset($this->_coll[0])); + $this->_coll->add('testing'); + $this->assertTrue(isset($this->_coll[0])); + unset($this->_coll[0]); + $this->assertFalse(isset($this->_coll[0])); + } + + public function testToString() + { + $this->_coll->add('testing'); + $this->assertTrue(is_string((string) $this->_coll)); + } + + public function testRemovingNonExistentEntryReturnsNull() + { + $this->assertEquals(null, $this->_coll->remove('testing_does_not_exist')); + } + + public function testExists() + { + $this->_coll->add("one"); + $this->_coll->add("two"); + $exists = $this->_coll->exists(function($k, $e) { return $e == "one"; }); + $this->assertTrue($exists); + $exists = $this->_coll->exists(function($k, $e) { return $e == "other"; }); + $this->assertFalse($exists); + } + + public function testMap() + { + $this->_coll->add(1); + $this->_coll->add(2); + $res = $this->_coll->map(function($e) { return $e * 2; }); + $this->assertEquals(array(2, 4), $res->toArray()); + } + + public function testFilter() + { + $this->_coll->add(1); + $this->_coll->add("foo"); + $this->_coll->add(3); + $res = $this->_coll->filter(function($e) { return is_numeric($e); }); + $this->assertEquals(array(0 => 1, 2 => 3), $res->toArray()); + } + + public function testFirstAndLast() + { + $this->_coll->add('one'); + $this->_coll->add('two'); + + $this->assertEquals($this->_coll->first(), 'one'); + $this->assertEquals($this->_coll->last(), 'two'); + } + + public function testArrayAccess() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + + $this->assertEquals($this->_coll[0], 'one'); + $this->assertEquals($this->_coll[1], 'two'); + + unset($this->_coll[0]); + $this->assertEquals($this->_coll->count(), 1); + } + + public function testContainsKey() + { + $this->_coll[5] = 'five'; + $this->assertTrue($this->_coll->containsKey(5)); + } + + public function testContains() + { + $this->_coll[0] = 'test'; + $this->assertTrue($this->_coll->contains('test')); + } + + public function testSearch() + { + $this->_coll[0] = 'test'; + $this->assertEquals(0, $this->_coll->indexOf('test')); + } + + public function testGet() + { + $this->_coll[0] = 'test'; + $this->assertEquals('test', $this->_coll->get(0)); + } + + public function testGetKeys() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals(array(0, 1), $this->_coll->getKeys()); + } + + public function testGetValues() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals(array('one', 'two'), $this->_coll->getValues()); + } + + public function testCount() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals($this->_coll->count(), 2); + $this->assertEquals(count($this->_coll), 2); + } + + public function testForAll() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_string($e); }), true); + $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_array($e); }), false); + } + + public function testPartition() + { + $this->_coll[] = true; + $this->_coll[] = false; + $partition = $this->_coll->partition(function($k, $e) { return $e == true; }); + $this->assertEquals($partition[0][0], true); + $this->assertEquals($partition[1][0], false); + } + + public function testClear() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->_coll->clear(); + $this->assertEquals($this->_coll->isEmpty(), true); + } + + public function testRemove() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $el = $this->_coll->remove(0); + + $this->assertEquals('one', $el); + $this->assertEquals($this->_coll->contains('one'), false); + $this->assertNull($this->_coll->remove(0)); + } + + public function testRemoveElement() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + + $this->assertTrue($this->_coll->removeElement('two')); + $this->assertFalse($this->_coll->contains('two')); + $this->assertFalse($this->_coll->removeElement('two')); + } + + public function testSlice() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->_coll[] = 'three'; + + $slice = $this->_coll->slice(0, 1); + $this->assertInternalType('array', $slice); + $this->assertEquals(array('one'), $slice); + + $slice = $this->_coll->slice(1); + $this->assertEquals(array(1 => 'two', 2 => 'three'), $slice); + + $slice = $this->_coll->slice(1, 1); + $this->assertEquals(array(1 => 'two'), $slice); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php new file mode 100644 index 00000000..e69de29b diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php new file mode 100644 index 00000000..2b11b20e --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php @@ -0,0 +1,88 @@ +_eventManager = new EventManager; + $this->_preFooInvoked = false; + $this->_postFooInvoked = false; + } + + public function testInitialState() + { + $this->assertEquals(array(), $this->_eventManager->getListeners()); + $this->assertFalse($this->_eventManager->hasListeners(self::preFoo)); + $this->assertFalse($this->_eventManager->hasListeners(self::postFoo)); + } + + public function testAddEventListener() + { + $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); + $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); + $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); + $this->assertEquals(1, count($this->_eventManager->getListeners(self::preFoo))); + $this->assertEquals(1, count($this->_eventManager->getListeners(self::postFoo))); + $this->assertEquals(2, count($this->_eventManager->getListeners())); + } + + public function testDispatchEvent() + { + $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); + $this->_eventManager->dispatchEvent(self::preFoo); + $this->assertTrue($this->_preFooInvoked); + $this->assertFalse($this->_postFooInvoked); + } + + public function testRemoveEventListener() + { + $this->_eventManager->addEventListener(array('preBar'), $this); + $this->assertTrue($this->_eventManager->hasListeners(self::preBar)); + $this->_eventManager->removeEventListener(array('preBar'), $this); + $this->assertFalse($this->_eventManager->hasListeners(self::preBar)); + } + + public function testAddEventSubscriber() + { + $eventSubscriber = new TestEventSubscriber(); + $this->_eventManager->addEventSubscriber($eventSubscriber); + $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); + $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); + } + + /* Listener methods */ + + public function preFoo(EventArgs $e) + { + $this->_preFooInvoked = true; + } + + public function postFoo(EventArgs $e) + { + $this->_postFooInvoked = true; + } +} + +class TestEventSubscriber implements \Doctrine\Common\EventSubscriber +{ + public function getSubscribedEvents() + { + return array('preFoo', 'postFoo'); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php new file mode 100644 index 00000000..e1825ae2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php @@ -0,0 +1,94 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver1->expects($this->never()) + ->method('loadMetadataForClass'); + $driver1->expectS($this->never()) + ->method('isTransient'); + + $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver2->expects($this->at(0)) + ->method('loadMetadataForClass') + ->with($this->equalTo($className), $this->equalTo($classMetadata)); + $driver2->expects($this->at(1)) + ->method('isTransient') + ->with($this->equalTo($className)) + ->will($this->returnValue( true )); + + $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); + $chain->addDriver($driver2, 'Doctrine\Tests\Common\Persistence\Mapping'); + + $chain->loadMetadataForClass($className, $classMetadata); + + $this->assertTrue( $chain->isTransient($className) ); + } + + public function testLoadMetadata_NoDelegatorFound_ThrowsMappingException() + { + $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; + $classMetadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $this->setExpectedException('Doctrine\Common\Persistence\Mapping\MappingException'); + $chain->loadMetadataForClass($className, $classMetadata); + } + + public function testGatherAllClassNames() + { + $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; + $classMetadata = $this->getMock('Doctrine\Common\Peristence\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver1->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Doctrine\Tests\Models\Company\Foo'))); + + $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver2->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Doctrine\Tests\ORM\Mapping\Bar', 'Doctrine\Tests\ORM\Mapping\Baz', 'FooBarBaz'))); + + $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); + $chain->addDriver($driver2, 'Doctrine\Tests\ORM\Mapping'); + + $this->assertEquals(array( + 'Doctrine\Tests\Models\Company\Foo', + 'Doctrine\Tests\ORM\Mapping\Bar', + 'Doctrine\Tests\ORM\Mapping\Baz' + ), $chain->getAllClassNames()); + } + + /** + * @group DDC-706 + */ + public function testIsTransient() + { + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $chain = new MappingDriverChain(); + $chain->addDriver($driver1, 'Doctrine\Tests\Models\CMS'); + + $this->assertTrue($chain->isTransient('stdClass'), "stdClass isTransient"); + } +} + +class DriverChainEntity +{ + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php new file mode 100644 index 00000000..9fe32994 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php @@ -0,0 +1,134 @@ +getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $this->cmf = new TestClassMetadataFactory($driver, $metadata); + } + + public function testGetCacheDriver() + { + $this->assertNull($this->cmf->getCacheDriver()); + $cache = new ArrayCache(); + $this->cmf->setCacheDriver($cache); + $this->assertSame($cache, $this->cmf->getCacheDriver()); + } + + public function testGetMetadataFor() + { + $metadata = $this->cmf->getMetadataFor('stdClass'); + + $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); + $this->assertTrue($this->cmf->hasMetadataFor('stdClass')); + } + + public function testGetParentMetadata() + { + $metadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + + $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\RootEntity')); + } + + public function testGetCachedMetadata() + { + $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $cache = new ArrayCache(); + $cache->save(__NAMESPACE__. '\ChildEntity$CLASSMETADATA', $metadata); + + $this->cmf->setCacheDriver($cache); + + $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + $this->assertSame($loadedMetadata, $metadata); + } + + public function testCacheGetMetadataFor() + { + $cache = new ArrayCache(); + $this->cmf->setCacheDriver($cache); + + $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + + $this->assertSame($loadedMetadata, $cache->fetch(__NAMESPACE__. '\ChildEntity$CLASSMETADATA')); + } + + public function testGetAliasedMetadata() + { + $loadedMetadata = $this->cmf->getMetadataFor('prefix:ChildEntity'); + + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); + $this->assertTrue($this->cmf->hasMetadataFor('prefix:ChildEntity')); + } +} + +class TestClassMetadataFactory extends AbstractClassMetadataFactory +{ + public $driver; + public $metadata; + + public function __construct($driver, $metadata) + { + $this->driver = $driver; + $this->metadata = $metadata; + } + + protected function doLoadMetadata($class, $parent, $rootEntityFound) + { + + } + + protected function getFqcnFromAlias($namespaceAlias, $simpleClassName) + { + return __NAMESPACE__ . '\\' . $simpleClassName; + } + + protected function initialize() + { + + } + + protected function newClassMetadataInstance($className) + { + return $this->metadata; + } + + protected function getDriver() + { + return $this->driver; + } + protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService) + { + } + + protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService) + { + } +} + +class RootEntity +{ + +} + +class ChildEntity extends RootEntity +{ + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php new file mode 100644 index 00000000..3c600c40 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php @@ -0,0 +1,90 @@ +assertEquals(array($path), $locator->getPaths()); + + $locator = new DefaultFileLocator($path); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testGetFileExtension() + { + $locator = new DefaultFileLocator(array(), ".yml"); + $this->assertEquals(".yml", $locator->getFileExtension()); + $locator->setFileExtension(".xml"); + $this->assertEquals(".xml", $locator->getFileExtension()); + } + + public function testUniquePaths() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path, $path)); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testFindMappingFile() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->assertEquals(__DIR__ . '/_files/stdClass.yml', $locator->findMappingFile('stdClass')); + } + + public function testFindMappingFileNotFound() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->setExpectedException( + 'Doctrine\Common\Persistence\Mapping\MappingException', + "No mapping file found named 'stdClass2.yml' for class 'stdClass2'" + ); + $locator->findMappingFile('stdClass2'); + } + + public function testGetAllClassNames() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + $classes = $locator->getAllClassNames(null); + sort($classes); + + $this->assertEquals(array('global', 'stdClass'), $classes); + $this->assertEquals(array('stdClass'), $locator->getAllClassNames("global")); + } + + public function testGetAllClassNamesNonMatchingFileExtension() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".xml"); + $this->assertEquals(array(), $locator->getAllClassNames("global")); + } + + public function testFileExists() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->assertTrue($locator->fileExists("stdClass")); + $this->assertFalse($locator->fileExists("stdClass2")); + $this->assertTrue($locator->fileExists("global")); + $this->assertFalse($locator->fileExists("global2")); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php new file mode 100644 index 00000000..020c2424 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php @@ -0,0 +1,142 @@ +assertNull($driver->getGlobalBasename()); + + $driver->setGlobalBasename("global"); + $this->assertEquals("global", $driver->getGlobalBasename()); + } + + public function testGetElementFromGlobalFile() + { + $driver = new TestFileDriver($this->newLocator()); + $driver->setGlobalBasename("global"); + + $element = $driver->getElement('stdGlobal'); + + $this->assertEquals('stdGlobal', $element); + } + + public function testGetElementFromFile() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('findMappingFile') + ->with($this->equalTo('stdClass')) + ->will($this->returnValue(__DIR__ . '/_files/stdClass.yml')); + + $driver = new TestFileDriver($locator); + + $this->assertEquals('stdClass', $driver->getElement('stdClass')); + } + + public function testGetAllClassNamesGlobalBasename() + { + $driver = new TestFileDriver($this->newLocator()); + $driver->setGlobalBasename("global"); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdGlobal', 'stdGlobal2'), $classNames); + } + + public function testGetAllClassNamesFromMappingFile() + { + $locator = $this->newLocator(); + $locator->expects($this->any()) + ->method('getAllClassNames') + ->with($this->equalTo(null)) + ->will($this->returnValue(array('stdClass'))); + $driver = new TestFileDriver($locator); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdClass'), $classNames); + } + + public function testGetAllClassNamesBothSources() + { + $locator = $this->newLocator(); + $locator->expects($this->any()) + ->method('getAllClassNames') + ->with($this->equalTo('global')) + ->will($this->returnValue(array('stdClass'))); + $driver = new TestFileDriver($locator); + $driver->setGlobalBasename("global"); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdGlobal', 'stdGlobal2', 'stdClass'), $classNames); + } + + public function testIsNotTransient() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('fileExists') + ->with($this->equalTo('stdClass')) + ->will($this->returnValue( true )); + + $driver = new TestFileDriver($locator); + $driver->setGlobalBasename("global"); + + $this->assertFalse($driver->isTransient('stdClass')); + $this->assertFalse($driver->isTransient('stdGlobal')); + $this->assertFalse($driver->isTransient('stdGlobal2')); + } + + public function testIsTransient() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('fileExists') + ->with($this->equalTo('stdClass2')) + ->will($this->returnValue( false )); + + $driver = new TestFileDriver($locator); + + $this->assertTrue($driver->isTransient('stdClass2')); + } + + public function testNonLocatorFallback() + { + $driver = new TestFileDriver(__DIR__ . '/_files', '.yml'); + $this->assertTrue($driver->isTransient('stdClass2')); + $this->assertFalse($driver->isTransient('stdClass')); + } + + private function newLocator() + { + $locator = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\FileLocator'); + $locator->expects($this->any())->method('getFileExtension')->will($this->returnValue('.yml')); + $locator->expects($this->any())->method('getPaths')->will($this->returnValue(array(__DIR__ . "/_files"))); + return $locator; + } +} + +class TestFileDriver extends FileDriver +{ + protected function loadMappingFile($file) + { + if (strpos($file, "global.yml") !== false) { + return array('stdGlobal' => 'stdGlobal', 'stdGlobal2' => 'stdGlobal2'); + } + return array('stdClass' => 'stdClass'); + } + + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php new file mode 100644 index 00000000..8fc4d807 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php @@ -0,0 +1,18 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $metadata->expects($this->once())->method('getFieldNames'); + + $driver = new PHPDriver(array(__DIR__ . "/_files")); + $driver->loadMetadataForClass('TestEntity', $metadata); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php new file mode 100644 index 00000000..5f06cad9 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Tests\Common\Persistence\Mapping; + +use Doctrine\Common\Persistence\Mapping\RuntimeReflectionService; + +/** + * @group DCOM-93 + */ +class RuntimeReflectionServiceTest extends \PHPUnit_Framework_TestCase +{ + private $reflectionService; + + public function setUp() + { + $this->reflectionService = new RuntimeReflectionService(); + } + + public function testShortname() + { + $this->assertEquals("RuntimeReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); + } + + public function testClassNamespaceName() + { + $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); + } + + public function testGetParentClasses() + { + $classes = $this->reflectionService->getParentClasses(__CLASS__); + $this->assertTrue(count($classes) >= 1, "The test class ".__CLASS__." should have at least one parent."); + } + + public function testGetReflectionClass() + { + $class = $this->reflectionService->getClass(__CLASS__); + $this->assertInstanceOf("ReflectionClass", $class); + } + + public function testGetMethods() + { + $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); + $this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); + } + + public function testGetAccessibleProperty() + { + $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); + $this->assertInstanceOf("ReflectionProperty", $reflProp); + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php new file mode 100644 index 00000000..9f1c5684 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php @@ -0,0 +1,35 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $metadata->expects($this->once())->method('getFieldNames'); + + $driver = new StaticPHPDriver(array(__DIR__)); + $driver->loadMetadataForClass(__NAMESPACE__ . '\\TestEntity', $metadata); + } + + public function testGetAllClassNames() + { + $driver = new StaticPHPDriver(array(__DIR__)); + $classNames = $driver->getAllClassNames(); + + $this->assertContains( + 'Doctrine\Tests\Common\Persistence\Mapping\TestEntity', $classNames); + } +} + +class TestEntity +{ + static public function loadMetadata($metadata) + { + $metadata->getFieldNames(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php new file mode 100644 index 00000000..ffce6d40 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Tests\Common\Persistence\Mapping; + +use Doctrine\Common\Persistence\Mapping\StaticReflectionService; + +/** + * @group DCOM-93 + */ +class StaticReflectionServiceTest extends \PHPUnit_Framework_TestCase +{ + private $reflectionService; + + public function setUp() + { + $this->reflectionService = new StaticReflectionService(); + } + + public function testShortname() + { + $this->assertEquals("StaticReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); + } + + public function testClassNamespaceName() + { + $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); + } + + public function testGetParentClasses() + { + $classes = $this->reflectionService->getParentClasses(__CLASS__); + $this->assertTrue(count($classes) == 0, "The test class ".__CLASS__." should have no parents according to static reflection."); + } + + public function testGetReflectionClass() + { + $class = $this->reflectionService->getClass(__CLASS__); + $this->assertNull($class); + } + + public function testGetMethods() + { + $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); + $this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); + } + + public function testGetAccessibleProperty() + { + $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); + $this->assertNull($reflProp); + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php new file mode 100644 index 00000000..b51162e6 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php @@ -0,0 +1,88 @@ + $prefix)); + $this->assertEquals(array($path), $locator->getPaths()); + + $locator = new SymfonyFileLocator(array($path => $prefix)); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testGetPrefixes() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix)); + $this->assertEquals(array($path => $prefix), $locator->getNamespacePrefixes()); + } + + public function testGetFileExtension() + { + $locator = new SymfonyFileLocator(array(), ".yml"); + $this->assertEquals(".yml", $locator->getFileExtension()); + $locator->setFileExtension(".xml"); + $this->assertEquals(".xml", $locator->getFileExtension()); + } + + public function testFileExists() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->assertTrue($locator->fileExists("Foo\stdClass")); + $this->assertTrue($locator->fileExists("Foo\global")); + $this->assertFalse($locator->fileExists("Foo\stdClass2")); + $this->assertFalse($locator->fileExists("Foo\global2")); + } + + public function testGetAllClassNames() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + $classes = $locator->getAllClassNames(null); + sort($classes); + + $this->assertEquals(array("Foo\\global", "Foo\\stdClass"), $classes); + $this->assertEquals(array("Foo\\stdClass"), $locator->getAllClassNames("global")); + } + + public function testFindMappingFile() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->assertEquals(__DIR__ . "/_files/stdClass.yml", $locator->findMappingFile("Foo\\stdClass")); + } + + public function testFindMappingFileNotFound() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->setExpectedException( + "Doctrine\Common\Persistence\Mapping\MappingException", + "No mapping file found named '".__DIR__."/_files/stdClass2.yml' for class 'Foo\stdClass2'." + ); + $locator->findMappingFile("Foo\\stdClass2"); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php new file mode 100644 index 00000000..d0e9976a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php @@ -0,0 +1,3 @@ +getFieldNames(); \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php new file mode 100644 index 00000000..a0f77b50 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php @@ -0,0 +1,247 @@ +cm = new TestObjectMetadata; + $this->om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); + $this->om->expects($this->any())->method('getClassMetadata') + ->will($this->returnValue($this->cm)); + $this->object = new TestObject; + PersistentObject::setObjectManager($this->om); + $this->object->injectObjectManager($this->om, $this->cm); + } + + public function testGetObjectManager() + { + $this->assertSame($this->om, PersistentObject::getObjectManager()); + } + + public function testNonMatchingObjectManager() + { + $this->setExpectedException('RuntimeException'); + $om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); + $this->object->injectObjectManager($om, $this->cm); + } + + public function testGetField() + { + $this->assertEquals('beberlei', $this->object->getName()); + } + + public function testSetField() + { + $this->object->setName("test"); + $this->assertEquals("test", $this->object->getName()); + } + + public function testGetIdentifier() + { + $this->assertEquals(1, $this->object->getId()); + } + + public function testSetIdentifier() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->setId(2); + } + + public function testSetUnknownField() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->setUnknown("test"); + } + + public function testGetUnknownField() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->getUnknown(); + } + + public function testGetToOneAssociation() + { + $this->assertNull($this->object->getParent()); + } + + public function testSetToOneAssociation() + { + $parent = new TestObject(); + $this->object->setParent($parent); + $this->assertSame($parent, $this->object->getParent($parent)); + } + + public function testSetInvalidToOneAssocation() + { + $parent = new \stdClass(); + + $this->setExpectedException('InvalidArgumentException'); + $this->object->setParent($parent); + } + + public function testSetToOneAssociationNull() + { + $parent = new TestObject(); + $this->object->setParent($parent); + $this->object->setParent(null); + $this->assertNull($this->object->getParent()); + } + + public function testAddToManyAssocation() + { + $child = new TestObject(); + $this->object->addChildren($child); + + $this->assertSame($this->object, $child->getParent()); + $this->assertEquals(1, count($this->object->getChildren())); + + $child = new TestObject(); + $this->object->addChildren($child); + + $this->assertEquals(2, count($this->object->getChildren())); + } + + public function testAddInvalidToManyAssocation() + { + $this->setExpectedException('InvalidArgumentException'); + $this->object->addChildren(new \stdClass()); + } + + public function testNoObjectManagerSet() + { + PersistentObject::setObjectManager(null); + $child = new TestObject(); + + $this->setExpectedException('RuntimeException'); + $child->setName("test"); + } + + public function testInvalidMethod() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->asdf(); + } + + public function testAddInvalidCollection() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->addAsdf(new \stdClass()); + } +} + +class TestObject extends PersistentObject +{ + protected $id = 1; + protected $name = 'beberlei'; + protected $parent; + protected $children; +} + +class TestObjectMetadata implements ClassMetadata +{ + + public function getAssociationMappedByTargetField($assocName) + { + $assoc = array('children' => 'parent'); + return $assoc[$assocName]; + } + + public function getAssociationNames() + { + return array('parent', 'children'); + } + + public function getAssociationTargetClass($assocName) + { + return __NAMESPACE__ . '\TestObject'; + } + + public function getFieldNames() + { + return array('id', 'name'); + } + + public function getIdentifier() + { + return array('id'); + } + + public function getName() + { + return __NAMESPACE__ . '\TestObject'; + } + + public function getReflectionClass() + { + return new \ReflectionClass($this->getName()); + } + + public function getTypeOfField($fieldName) + { + $types = array('id' => 'integer', 'name' => 'string'); + return $types[$fieldName]; + } + + public function hasAssociation($fieldName) + { + return in_array($fieldName, array('parent', 'children')); + } + + public function hasField($fieldName) + { + return in_array($fieldName, array('id', 'name')); + } + + public function isAssociationInverseSide($assocName) + { + return ($assocName === 'children'); + } + + public function isCollectionValuedAssociation($fieldName) + { + return ($fieldName === 'children'); + } + + public function isIdentifier($fieldName) + { + return $fieldName === 'id'; + } + + public function isSingleValuedAssociation($fieldName) + { + return $fieldName === 'parent'; + } + + public function getIdentifierValues($entity) + { + + } + + public function getIdentifierFieldNames() + { + + } + + public function initializeReflection(ReflectionService $reflService) + { + + } + + public function wakeupReflection(ReflectionService $reflService) + { + + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php new file mode 100644 index 00000000..a2814500 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php @@ -0,0 +1,100 @@ +assertEquals($expectedClassName, ClassUtils::getRealClass($className)); + } + + /** + * @dataProvider dataGetClass + */ + public function testGetClass( $className, $expectedClassName ) + { + $object = new $className(); + $this->assertEquals($expectedClassName, ClassUtils::getClass($object)); + } + + public function testGetParentClass() + { + $parentClass = ClassUtils::getParentClass( 'MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject' ); + $this->assertEquals('stdClass', $parentClass); + } + + public function testGenerateProxyClassName() + { + $this->assertEquals( 'Proxies\__CG__\stdClass', ClassUtils::generateProxyClassName( 'stdClass', 'Proxies' ) ); + } + + /** + * @dataProvider dataGetClass + */ + public function testNewReflectionClass( $className, $expectedClassName ) + { + $reflClass = ClassUtils::newReflectionClass( $className ); + $this->assertEquals( $expectedClassName, $reflClass->getName() ); + } + + /** + * @dataProvider dataGetClass + */ + public function testNewReflectionObject( $className, $expectedClassName ) + { + $object = new $className; + $reflClass = ClassUtils::newReflectionObject( $object ); + $this->assertEquals( $expectedClassName, $reflClass->getName() ); + } + } + + class ChildObject extends \stdClass + { + } +} + +namespace MyProject\Proxies\__CG__ +{ + class stdClass extends \stdClass + { + } +} + +namespace MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util +{ + class ChildObject extends \Doctrine\Tests\Common\Util\ChildObject + { + } +} + +namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__ +{ + class stdClass extends \MyProject\Proxies\__CG__\stdClass + { + } +} + +namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util +{ + class ChildObject extends \MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject + { + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php new file mode 100644 index 00000000..b4e9eed2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php @@ -0,0 +1,27 @@ +foo = "bar"; + $obj->bar = 1234; + + $var = Debug::export($obj, 2); + $this->assertEquals( "stdClass", $var->__CLASS__ ); + } + + public function testExportDateTime() + { + $obj = new \DateTime( "2010-10-10 10:10:10" ); + + $var = Debug::export( $obj, 2 ); + $this->assertEquals( "DateTime", $var->__CLASS__ ); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php b/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php new file mode 100644 index 00000000..e8323d29 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php @@ -0,0 +1,10 @@ + + */ +class NativePhpunitTask extends Task +{ + private $test; + private $testfile; + private $testdirectory; + private $configuration = null; + private $coverageClover = null; + private $junitlogfile = null; + private $haltonfailure = true; + private $haltonerror = true; + + public function setTestdirectory($directory) { + $this->testdirectory = $directory; + } + + public function setTest($test) { + $this->test = $test; + } + + public function setTestfile($testfile) { + $this->testfile = $testfile; + } + + public function setJunitlogfile($junitlogfile) { + if (strlen($junitlogfile) == 0) { + $junitlogfile = NULL; + } + + $this->junitlogfile = $junitlogfile; + } + + public function setConfiguration($configuration) { + if (strlen($configuration) == 0) { + $configuration = NULL; + } + + $this->configuration = $configuration; + } + + public function setCoverageClover($coverageClover) { + if (strlen($coverageClover) == 0) { + $coverageClover = NULL; + } + + $this->coverageClover = $coverageClover; + } + + public function setHaltonfailure($haltonfailures) { + $this->haltonfailure = $haltonfailures; + } + + public function setHaltonerror($haltonerrors) { + $this->haltonerror = $haltonerrors; + } + + public function init() + { + require_once "PHPUnit/Runner/Version.php"; + $version = PHPUnit_Runner_Version::id(); + + if (version_compare($version, '3.4.0') < 0) { + throw new BuildException("NativePHPUnitTask requires PHPUnit version >= 3.2.0", $this->getLocation()); + } + + require_once 'PHPUnit/Util/Filter.php'; + + // point PHPUnit_MAIN_METHOD define to non-existing method + if (!defined('PHPUnit_MAIN_METHOD')) { + define('PHPUnit_MAIN_METHOD', 'PHPUnitTask::undefined'); + } + } + + public function main() + { + if (!is_dir(realpath($this->testdirectory))) { + throw new BuildException("NativePHPUnitTask requires a Test Directory path given, '".$this->testdirectory."' given."); + } + set_include_path(realpath($this->testdirectory) . PATH_SEPARATOR . get_include_path()); + + $printer = new NativePhpunitPrinter(); + + $arguments = array( + 'configuration' => $this->configuration, + 'coverageClover' => $this->coverageClover, + 'junitLogfile' => $this->junitlogfile, + 'printer' => $printer, + ); + + $runner = new PHPUnit_TextUI_TestRunner(); + $suite = $runner->getTest($this->test, $this->testfile, true); + + try { + $result = $runner->doRun($suite, $arguments); + /* @var $result PHPUnit_Framework_TestResult */ + + if ( ($this->haltonfailure && $result->failureCount() > 0) || ($this->haltonerror && $result->errorCount() > 0) ) { + throw new BuildException("PHPUnit: ".$result->failureCount()." Failures and ".$result->errorCount()." Errors, ". + "last failure message: ".$printer->getMessages()); + } + + $this->log("PHPUnit Success: ".count($result->passed())." tests passed, no ". + "failures (".$result->skippedCount()." skipped, ".$result->notImplementedCount()." not implemented)"); + + // Hudson for example doesn't like the backslash in class names + if (file_exists($this->coverageClover)) { + $this->log("Generated Clover Coverage XML to: ".$this->coverageClover); + $content = file_get_contents($this->coverageClover); + $content = str_replace("\\", ".", $content); + file_put_contents($this->coverageClover, $content); + unset($content); + } + + } catch(\Exception $e) { + throw new BuildException("NativePhpunitTask failed: ".$e->getMessage()); + } + } +} + +class NativePhpunitPrinter extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener +{ + private $_messages = array(); + + public function write($buffer) + { + // do nothing + } + + public function getMessages() + { + return $this->_messages; + } + + /** + * An error occurred. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + */ + public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) + { + $this->_messages[] = "Test ERROR: ".$test->getName().": ".$e->getMessage(); + } + + /** + * A failure occurred. + * + * @param PHPUnit_Framework_Test $test + * @param PHPUnit_Framework_AssertionFailedError $e + * @param float $time + */ + public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) + { + $this->_messages[] = "Test FAILED: ".$test->getName().": ".$e->getMessage(); + } + + /** + * Incomplete test. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + */ + public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) + { + + } + + /** + * Skipped test. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + * @since Method available since Release 3.0.0 + */ + public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) + { + + } + + /** + * A test suite started. + * + * @param PHPUnit_Framework_TestSuite $suite + * @since Method available since Release 2.2.0 + */ + public function startTestSuite(PHPUnit_Framework_TestSuite $suite) + { + + } + + /** + * A test suite ended. + * + * @param PHPUnit_Framework_TestSuite $suite + * @since Method available since Release 2.2.0 + */ + public function endTestSuite(PHPUnit_Framework_TestSuite $suite) + { + + } + + /** + * A test started. + * + * @param PHPUnit_Framework_Test $test + */ + public function startTest(PHPUnit_Framework_Test $test) + { + + } + + /** + * A test ended. + * + * @param PHPUnit_Framework_Test $test + * @param float $time + */ + public function endTest(PHPUnit_Framework_Test $test, $time) + { + + } +} diff --git a/vendor/doctrine/common/tests/README.markdown b/vendor/doctrine/common/tests/README.markdown new file mode 100644 index 00000000..e6f1703d --- /dev/null +++ b/vendor/doctrine/common/tests/README.markdown @@ -0,0 +1,27 @@ +# Running the Doctrine 2 Testsuite + +## Running tests + +Execute PHPUnit in the root folder of your doctrine-common clone. + + phpunit + +## Testing Lock-Support + +The Lock support in Doctrine 2 is tested using Gearman, which allows to run concurrent tasks in parallel. +Install Gearman with PHP as follows: + +1. Go to http://www.gearman.org and download the latest Gearman Server +2. Compile it and then call ldconfig +3. Start it up "gearmand -vvvv" +4. Install pecl/gearman by calling "gearman-beta" + +You can then go into tests/ and start up two workers: + + php Doctrine/Tests/ORM/Functional/Locking/LockAgentWorker.php + +Then run the locking test-suite: + + phpunit --configuration Doctrine/Tests/ORM/Functional/Locking/GearmanLockTest.php + +This can run considerable time, because it is using sleep() to test for the timing ranges of locks. \ No newline at end of file From 18719916f154921f62559ba3ca31bc7b0d1021a8 Mon Sep 17 00:00:00 2001 From: wingman Date: Fri, 1 Feb 2013 09:23:02 +0000 Subject: [PATCH 042/180] Initial commit --- .gitignore | 9 + LICENSE.txt | 27 + README.md | 33 + composer.json | 22 + composer.phar | Bin 0 -> 570295 bytes config/application.config.php | 15 + config/autoload/.gitignore | 2 + config/autoload/README.md | 8 + config/autoload/global.php | 16 + config/autoload/local.php.dist | 16 + data/cache/.gitignore | 2 + init_autoloader.php | 49 + module/Application/Module.php | 39 + module/Application/config/module.config.php | 91 ++ module/Application/language/ar_SY.mo | Bin 0 -> 5526 bytes module/Application/language/ar_SY.po | 184 +++ module/Application/language/cs_CZ.mo | Bin 0 -> 5005 bytes module/Application/language/cs_CZ.po | 153 +++ module/Application/language/de_DE.mo | Bin 0 -> 5126 bytes module/Application/language/de_DE.po | 153 +++ module/Application/language/en_US.mo | Bin 0 -> 545 bytes module/Application/language/en_US.po | 153 +++ module/Application/language/es_ES.mo | Bin 0 -> 5063 bytes module/Application/language/es_ES.po | 111 ++ module/Application/language/fr_CA.mo | Bin 0 -> 5074 bytes module/Application/language/fr_CA.po | 153 +++ module/Application/language/fr_FR.mo | Bin 0 -> 5077 bytes module/Application/language/fr_FR.po | 153 +++ module/Application/language/it_IT.mo | Bin 0 -> 4922 bytes module/Application/language/it_IT.po | 154 +++ module/Application/language/ja_JP.mo | Bin 0 -> 5185 bytes module/Application/language/ja_JP.po | 140 +++ module/Application/language/nl_NL.mo | Bin 0 -> 4815 bytes module/Application/language/nl_NL.po | 153 +++ module/Application/language/pl_PL.mo | Bin 0 -> 4934 bytes module/Application/language/pl_PL.po | 153 +++ module/Application/language/tr_TR.mo | Bin 0 -> 4785 bytes module/Application/language/tr_TR.po | 153 +++ .../Controller/IndexController.php | 21 + .../view/application/index/index.phtml | 26 + module/Application/view/error/404.phtml | 61 + module/Application/view/error/index.phtml | 62 + module/Application/view/layout/layout.phtml | 57 + public/.htaccess | 7 + public/css/bootstrap-responsive.min.css | 3 + public/css/bootstrap.min.css | 610 +++++++++ public/css/style.css | 37 + public/images/favicon.ico | Bin 0 -> 1406 bytes public/images/zf2-logo.png | Bin 0 -> 738 bytes public/index.php | 12 + public/js/html5.js | 4 + public/js/jquery-1.7.2.min.js | 4 + vendor/.gitignore | 5 + vendor/README.md | 1 + vendor/doctrine/common/.gitignore | 4 + vendor/doctrine/common/.gitmodules | 3 + vendor/doctrine/common/.travis.yml | 5 + vendor/doctrine/common/LICENSE | 504 ++++++++ vendor/doctrine/common/README.md | 12 + vendor/doctrine/common/UPGRADE_TO_2_1 | 39 + vendor/doctrine/common/UPGRADE_TO_2_2 | 61 + vendor/doctrine/common/build.properties | 6 + vendor/doctrine/common/build.xml | 59 + vendor/doctrine/common/composer.json | 21 + .../Common/Annotations/Annotation.php | 75 ++ .../Annotations/Annotation/Attribute.php | 47 + .../Annotations/Annotation/Attributes.php | 37 + .../Annotation/IgnoreAnnotation.php | 44 + .../Annotations/Annotation/Required.php | 33 + .../Common/Annotations/Annotation/Target.php | 105 ++ .../Annotations/AnnotationException.php | 111 ++ .../Common/Annotations/AnnotationReader.php | 303 +++++ .../Common/Annotations/AnnotationRegistry.php | 129 ++ .../Common/Annotations/CachedReader.php | 179 +++ .../Doctrine/Common/Annotations/DocLexer.php | 140 +++ .../Doctrine/Common/Annotations/DocParser.php | 891 +++++++++++++ .../Common/Annotations/FileCacheReader.php | 209 +++ .../Common/Annotations/IndexedReader.php | 94 ++ .../Doctrine/Common/Annotations/PhpParser.php | 203 +++ .../Doctrine/Common/Annotations/Reader.php | 35 + .../Annotations/SimpleAnnotationReader.php | 152 +++ .../lib/Doctrine/Common/Cache/ApcCache.php | 97 ++ .../lib/Doctrine/Common/Cache/ArrayCache.php | 96 ++ .../lib/Doctrine/Common/Cache/Cache.php | 102 ++ .../Doctrine/Common/Cache/CacheProvider.php | 188 +++ .../Doctrine/Common/Cache/MemcacheCache.php | 121 ++ .../Doctrine/Common/Cache/MemcachedCache.php | 124 ++ .../Doctrine/Common/Cache/WinCacheCache.php | 92 ++ .../lib/Doctrine/Common/Cache/XcacheCache.php | 110 ++ .../Doctrine/Common/Cache/ZendDataCache.php | 84 ++ .../lib/Doctrine/Common/ClassLoader.php | 262 ++++ .../Common/Collections/ArrayCollection.php | 447 +++++++ .../Common/Collections/Collection.php | 243 ++++ .../lib/Doctrine/Common/CommonException.php | 28 + .../common/lib/Doctrine/Common/Comparable.php | 47 + .../common/lib/Doctrine/Common/EventArgs.php | 69 + .../lib/Doctrine/Common/EventManager.php | 136 ++ .../lib/Doctrine/Common/EventSubscriber.php | 45 + .../common/lib/Doctrine/Common/Lexer.php | 266 ++++ .../Doctrine/Common/NotifyPropertyChanged.php | 45 + .../Persistence/AbstractManagerRegistry.php | 224 ++++ .../Common/Persistence/ConnectionRegistry.php | 63 + .../Persistence/Event/LifecycleEventArgs.php | 77 ++ .../Event/LoadClassMetadataEventArgs.php | 76 ++ .../Persistence/Event/ManagerEventArgs.php | 59 + .../Persistence/Event/OnClearEventArgs.php | 84 ++ .../Persistence/Event/PreUpdateEventArgs.php | 129 ++ .../Common/Persistence/ManagerRegistry.php | 112 ++ .../Mapping/AbstractClassMetadataFactory.php | 359 ++++++ .../Persistence/Mapping/ClassMetadata.php | 165 +++ .../Mapping/ClassMetadataFactory.php | 74 ++ .../Mapping/Driver/AnnotationDriver.php | 214 ++++ .../Mapping/Driver/DefaultFileLocator.php | 169 +++ .../Persistence/Mapping/Driver/FileDriver.php | 178 +++ .../Mapping/Driver/FileLocator.php | 69 + .../Mapping/Driver/MappingDriver.php | 56 + .../Mapping/Driver/MappingDriverChain.php | 125 ++ .../Persistence/Mapping/Driver/PHPDriver.php | 70 ++ .../Mapping/Driver/StaticPHPDriver.php | 131 ++ .../Mapping/Driver/SymfonyFileLocator.php | 198 +++ .../Persistence/Mapping/MappingException.php | 57 + .../Persistence/Mapping/ReflectionService.php | 80 ++ .../Mapping/RuntimeReflectionService.php | 102 ++ .../Mapping/StaticReflectionService.php | 107 ++ .../Common/Persistence/ObjectManager.php | 143 +++ .../Common/Persistence/ObjectManagerAware.php | 49 + .../Common/Persistence/ObjectRepository.php | 78 ++ .../Common/Persistence/PersistentObject.php | 233 ++++ .../lib/Doctrine/Common/Persistence/Proxy.php | 60 + .../Common/PropertyChangedListener.php | 48 + .../lib/Doctrine/Common/Util/ClassUtils.php | 103 ++ .../common/lib/Doctrine/Common/Util/Debug.php | 123 ++ .../lib/Doctrine/Common/Util/Inflector.php | 72 ++ .../common/lib/Doctrine/Common/Version.php | 55 + vendor/doctrine/common/phpunit.xml.dist | 31 + vendor/doctrine/common/tests/.gitignore | 3 + .../Common/Annotations/AbstractReaderTest.php | 538 ++++++++ .../Annotations/AnnotationReaderTest.php | 13 + .../Common/Annotations/CachedReaderTest.php | 56 + .../Tests/Common/Annotations/DocLexerTest.php | 27 + .../Common/Annotations/DocParserTest.php | 1118 +++++++++++++++++ .../Annotations/FileCacheReaderTest.php | 40 + .../Annotation/AnnotWithDefaultValue.php | 10 + .../Fixtures/Annotation/Autoload.php | 10 + .../Annotations/Fixtures/Annotation/Route.php | 11 + .../Fixtures/Annotation/Secure.php | 18 + .../Fixtures/Annotation/Template.php | 14 + .../Fixtures/Annotation/Version.php | 11 + .../Fixtures/AnnotationTargetAll.php | 14 + .../Fixtures/AnnotationTargetAnnotation.php | 14 + .../Fixtures/AnnotationTargetClass.php | 15 + .../Fixtures/AnnotationTargetMethod.php | 15 + .../AnnotationTargetPropertyMethod.php | 14 + .../Fixtures/AnnotationWithAttributes.php | 119 ++ .../AnnotationWithRequiredAttributes.php | 50 + ...ithRequiredAttributesWithoutContructor.php | 24 + .../AnnotationWithTargetSyntaxError.php | 11 + .../Fixtures/AnnotationWithVarType.php | 62 + .../Annotations/Fixtures/ClassDDC1660.php | 30 + ...assWithAnnotationWithTargetSyntaxError.php | 21 + .../ClassWithAnnotationWithVarType.php | 31 + .../ClassWithFullyQualifiedUseStatements.php | 11 + ...lassWithInvalidAnnotationTargetAtClass.php | 17 + ...assWithInvalidAnnotationTargetAtMethod.php | 20 + ...sWithInvalidAnnotationTargetAtProperty.php | 24 + .../ClassWithValidAnnotationTarget.php | 41 + .../Annotations/Fixtures/Controller.php | 300 +++++ ...erentNamespacesPerFileWithClassAsFirst.php | 15 + ...ferentNamespacesPerFileWithClassAsLast.php | 15 + ...EqualNamespacesPerFileWithClassAsFirst.php | 13 + .../EqualNamespacesPerFileWithClassAsLast.php | 12 + ...lobalNamespacesPerFileWithClassAsFirst.php | 12 + ...GlobalNamespacesPerFileWithClassAsLast.php | 12 + .../InvalidAnnotationUsageButIgnoredClass.php | 14 + .../Fixtures/InvalidAnnotationUsageClass.php | 10 + .../Fixtures/MultipleClassesInFile.php | 9 + .../MultipleImportsInUseStatement.php | 10 + .../NamespaceAndClassCommentedOut.php | 20 + .../NamespaceWithClosureDeclaration.php | 15 + .../Fixtures/NamespacedSingleClassLOC1000.php | 1009 +++++++++++++++ .../Annotations/Fixtures/NoAnnotation.php | 5 + .../Fixtures/NonNamespacedClass.php | 10 + .../Fixtures/SingleClassLOC1000.php | 1006 +++++++++++++++ .../Annotations/Fixtures/TestInterface.php | 13 + .../Common/Annotations/PerformanceTest.php | 194 +++ .../Common/Annotations/PhpParserTest.php | 179 +++ .../SimpleAnnotationReaderTest.php | 97 ++ .../Common/Annotations/Ticket/DCOM55Test.php | 65 + .../Annotations/Ticket/DCOM58Entity.php | 8 + .../Common/Annotations/Ticket/DCOM58Test.php | 112 ++ .../Common/Annotations/TopLevelAnnotation.php | 8 + .../Tests/Common/Cache/ApcCacheTest.php | 20 + .../Tests/Common/Cache/ArrayCacheTest.php | 13 + .../Doctrine/Tests/Common/Cache/CacheTest.php | 87 ++ .../Tests/Common/Cache/MemcacheCacheTest.php | 38 + .../Tests/Common/Cache/MemcachedCacheTest.php | 40 + .../Tests/Common/Cache/WinCacheCacheTest.php | 20 + .../Tests/Common/Cache/XcacheCacheTest.php | 20 + .../Tests/Common/Cache/ZendDataCacheTest.php | 20 + .../Doctrine/Tests/Common/ClassLoaderTest.php | 45 + .../Common/ClassLoaderTest/ClassA.class.php | 6 + .../Common/ClassLoaderTest/ClassB.class.php | 6 + .../Common/ClassLoaderTest/ClassC.class.php | 6 + .../Tests/Common/ClassLoaderTest/ClassD.php | 5 + .../Common/Collections/CollectionTest.php | 195 +++ .../Tests/Common/DoctrineExceptionTest.php | 0 .../Tests/Common/EventManagerTest.php | 88 ++ .../Persistence/Mapping/ChainDriverTest.php | 94 ++ .../Mapping/ClassMetadataFactoryTest.php | 134 ++ .../Mapping/DefaultFileLocatorTest.php | 90 ++ .../Persistence/Mapping/FileDriverTest.php | 142 +++ .../Persistence/Mapping/PHPDriverTest.php | 18 + .../Mapping/RuntimeReflectionServiceTest.php | 70 ++ .../Mapping/StaticPHPDriverTest.php | 35 + .../Mapping/StaticReflectionServiceTest.php | 70 ++ .../Mapping/SymfonyFileLocatorTest.php | 88 ++ .../Persistence/Mapping/_files/TestEntity.php | 3 + .../Persistence/Mapping/_files/global.yml | 1 + .../Persistence/Mapping/_files/stdClass.yml | 1 + .../Persistence/PersistentObjectTest.php | 247 ++++ .../Tests/Common/Util/ClassUtilsTest.php | 100 ++ .../Doctrine/Tests/Common/Util/DebugTest.php | 27 + .../tests/Doctrine/Tests/DoctrineTestCase.php | 10 + .../common/tests/Doctrine/Tests/TestInit.php | 31 + .../common/tests/NativePhpunitTask.php | 246 ++++ vendor/doctrine/common/tests/README.markdown | 27 + 226 files changed, 20736 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 composer.json create mode 100644 composer.phar create mode 100644 config/application.config.php create mode 100644 config/autoload/.gitignore create mode 100644 config/autoload/README.md create mode 100644 config/autoload/global.php create mode 100644 config/autoload/local.php.dist create mode 100644 data/cache/.gitignore create mode 100644 init_autoloader.php create mode 100644 module/Application/Module.php create mode 100644 module/Application/config/module.config.php create mode 100644 module/Application/language/ar_SY.mo create mode 100644 module/Application/language/ar_SY.po create mode 100644 module/Application/language/cs_CZ.mo create mode 100644 module/Application/language/cs_CZ.po create mode 100644 module/Application/language/de_DE.mo create mode 100644 module/Application/language/de_DE.po create mode 100644 module/Application/language/en_US.mo create mode 100644 module/Application/language/en_US.po create mode 100644 module/Application/language/es_ES.mo create mode 100644 module/Application/language/es_ES.po create mode 100644 module/Application/language/fr_CA.mo create mode 100644 module/Application/language/fr_CA.po create mode 100644 module/Application/language/fr_FR.mo create mode 100644 module/Application/language/fr_FR.po create mode 100644 module/Application/language/it_IT.mo create mode 100644 module/Application/language/it_IT.po create mode 100644 module/Application/language/ja_JP.mo create mode 100644 module/Application/language/ja_JP.po create mode 100644 module/Application/language/nl_NL.mo create mode 100644 module/Application/language/nl_NL.po create mode 100644 module/Application/language/pl_PL.mo create mode 100644 module/Application/language/pl_PL.po create mode 100644 module/Application/language/tr_TR.mo create mode 100644 module/Application/language/tr_TR.po create mode 100644 module/Application/src/Application/Controller/IndexController.php create mode 100644 module/Application/view/application/index/index.phtml create mode 100644 module/Application/view/error/404.phtml create mode 100644 module/Application/view/error/index.phtml create mode 100644 module/Application/view/layout/layout.phtml create mode 100644 public/.htaccess create mode 100644 public/css/bootstrap-responsive.min.css create mode 100644 public/css/bootstrap.min.css create mode 100644 public/css/style.css create mode 100644 public/images/favicon.ico create mode 100644 public/images/zf2-logo.png create mode 100644 public/index.php create mode 100644 public/js/html5.js create mode 100644 public/js/jquery-1.7.2.min.js create mode 100644 vendor/.gitignore create mode 100644 vendor/README.md create mode 100644 vendor/doctrine/common/.gitignore create mode 100644 vendor/doctrine/common/.gitmodules create mode 100644 vendor/doctrine/common/.travis.yml create mode 100644 vendor/doctrine/common/LICENSE create mode 100644 vendor/doctrine/common/README.md create mode 100644 vendor/doctrine/common/UPGRADE_TO_2_1 create mode 100644 vendor/doctrine/common/UPGRADE_TO_2_2 create mode 100644 vendor/doctrine/common/build.properties create mode 100644 vendor/doctrine/common/build.xml create mode 100644 vendor/doctrine/common/composer.json create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/CommonException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Comparable.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventManager.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Lexer.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Version.php create mode 100644 vendor/doctrine/common/phpunit.xml.dist create mode 100644 vendor/doctrine/common/tests/.gitignore create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/CachedReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Autoload.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Route.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Secure.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetAll.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetPropertyMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithAttributes.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithTargetSyntaxError.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithVarType.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithAnnotationWithTargetSyntaxError.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithAnnotationWithVarType.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithFullyQualifiedUseStatements.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtProperty.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithValidAnnotationTarget.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Controller.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/EqualNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/EqualNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/GlobalNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/GlobalNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/InvalidAnnotationUsageButIgnoredClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/InvalidAnnotationUsageClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/MultipleClassesInFile.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/MultipleImportsInUseStatement.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespaceAndClassCommentedOut.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespaceWithClosureDeclaration.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespacedSingleClassLOC1000.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NonNamespacedClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/SingleClassLOC1000.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PerformanceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Test.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/CacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassB.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassC.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassD.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/CollectionTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/TestInit.php create mode 100644 vendor/doctrine/common/tests/NativePhpunitTask.php create mode 100644 vendor/doctrine/common/tests/README.markdown diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..ad907fa5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +nbproject +._* +.~lock.* +.buildpath +.DS_Store +.idea +.project +.settings +composer.lock diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..36e97601 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,27 @@ +Copyright (c) 2005-2012, Zend Technologies USA, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Zend Technologies USA, Inc. nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..4e7d164a --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +ZendSkeletonApplication +======================= + +Introduction +------------ +This is a simple, skeleton application using the ZF2 MVC layer and module +systems. This application is meant to be used as a starting place for those +looking to get their feet wet with ZF2. + + +Installation +------------ + +Using Composer (recommended) +---------------------------- +The recommended way to get a working copy of this project is to clone the repository +and use composer to install dependencies: + + cd my/project/dir + git clone git://github.com/zendframework/ZendSkeletonApplication.git + cd ZendSkeletonApplication + php composer.phar install + +Using Git submodules +-------------------- +Alternatively, you can install using native git submodules: + + git clone git://github.com/zendframework/ZendSkeletonApplication.git --recursive + +Virtual Host +------------ +Afterwards, set up a virtual host to point to the public/ directory of the +project and you should be ready to go! diff --git a/composer.json b/composer.json new file mode 100644 index 00000000..b70734ed --- /dev/null +++ b/composer.json @@ -0,0 +1,22 @@ +{ + "name": "zendframework/skeleton-application", + "description": "Skeleton Application for ZF2", + "license": "BSD-3-Clause", + "keywords": [ + "framework", + "zf2" + ], + "homepage": "http://framework.zend.com/", + "repositories": [ + { + "type": "composer", + "url": "http://packages.zendframework.com/" + } + ], + "require": { + "php": ">=5.3.3", + "zendframework/zendframework": "2.*", + "zendframework/zendservice-recaptcha": "2.*", + "doctrine/common": ">=2.1" + } +} diff --git a/composer.phar b/composer.phar new file mode 100644 index 0000000000000000000000000000000000000000..48edaa6149f3581df05a06f283f27ad50ff879de GIT binary patch literal 570295 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 literal 0 HcmV?d00001 diff --git a/config/application.config.php b/config/application.config.php new file mode 100644 index 00000000..6504dea7 --- /dev/null +++ b/config/application.config.php @@ -0,0 +1,15 @@ + array( + 'Application', + ), + 'module_listener_options' => array( + 'config_glob_paths' => array( + 'config/autoload/{,*.}{global,local}.php', + ), + 'module_paths' => array( + './module', + './vendor', + ), + ), +); diff --git a/config/autoload/.gitignore b/config/autoload/.gitignore new file mode 100644 index 00000000..1a83fda6 --- /dev/null +++ b/config/autoload/.gitignore @@ -0,0 +1,2 @@ +local.php +*.local.php diff --git a/config/autoload/README.md b/config/autoload/README.md new file mode 100644 index 00000000..4e504db0 --- /dev/null +++ b/config/autoload/README.md @@ -0,0 +1,8 @@ +About this directory: +===================== + +By default, this application is configured to load all configs in +`./config/autoload/{,*.}{global,local}.php`. Doing this provides a +location for a developer to drop in configuration override files provided by +modules, as well as cleanly provide individual, application-wide config files +for things like database connections, etc. diff --git a/config/autoload/global.php b/config/autoload/global.php new file mode 100644 index 00000000..1473720f --- /dev/null +++ b/config/autoload/global.php @@ -0,0 +1,16 @@ +add('Zend', $zf2Path . '/Zend'); + } else { + include $zf2Path . '/Zend/Loader/AutoloaderFactory.php'; + Zend\Loader\AutoloaderFactory::factory(array( + 'Zend\Loader\StandardAutoloader' => array( + 'autoregister_zf' => true + ) + )); + } +} + +if (!class_exists('Zend\Loader\AutoloaderFactory')) { + throw new RuntimeException('Unable to load ZF2. Run `php composer.phar install` or define a ZF2_PATH environment variable.'); +} diff --git a/module/Application/Module.php b/module/Application/Module.php new file mode 100644 index 00000000..86d9d4e2 --- /dev/null +++ b/module/Application/Module.php @@ -0,0 +1,39 @@ +getApplication()->getServiceManager()->get('translator'); + $eventManager = $e->getApplication()->getEventManager(); + $moduleRouteListener = new ModuleRouteListener(); + $moduleRouteListener->attach($eventManager); + } + + public function getConfig() + { + return include __DIR__ . '/config/module.config.php'; + } + + public function getAutoloaderConfig() + { + return array( + 'Zend\Loader\StandardAutoloader' => array( + 'namespaces' => array( + __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, + ), + ), + ); + } +} diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php new file mode 100644 index 00000000..a6dd62b8 --- /dev/null +++ b/module/Application/config/module.config.php @@ -0,0 +1,91 @@ + array( + 'routes' => array( + 'home' => array( + 'type' => 'Zend\Mvc\Router\Http\Literal', + 'options' => array( + 'route' => '/', + 'defaults' => array( + 'controller' => 'Application\Controller\Index', + 'action' => 'index', + ), + ), + ), + // The following is a route to simplify getting started creating + // new controllers and actions without needing to create a new + // module. Simply drop new controllers in, and you can access them + // using the path /application/:controller/:action + 'application' => array( + 'type' => 'Literal', + 'options' => array( + 'route' => '/application', + 'defaults' => array( + '__NAMESPACE__' => 'Application\Controller', + 'controller' => 'Index', + 'action' => 'index', + ), + ), + 'may_terminate' => true, + 'child_routes' => array( + 'default' => array( + 'type' => 'Segment', + 'options' => array( + 'route' => '/[:controller[/:action]]', + 'constraints' => array( + 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', + 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', + ), + 'defaults' => array( + ), + ), + ), + ), + ), + ), + ), + 'service_manager' => array( + 'factories' => array( + 'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory', + ), + ), + 'translator' => array( + 'locale' => 'en_US', + 'translation_file_patterns' => array( + array( + 'type' => 'gettext', + 'base_dir' => __DIR__ . '/../language', + 'pattern' => '%s.mo', + ), + ), + ), + 'controllers' => array( + 'invokables' => array( + 'Application\Controller\Index' => 'Application\Controller\IndexController' + ), + ), + 'view_manager' => array( + 'display_not_found_reason' => true, + 'display_exceptions' => true, + 'doctype' => 'HTML5', + 'not_found_template' => 'error/404', + 'exception_template' => 'error/index', + 'template_map' => array( + 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', + 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', + 'error/404' => __DIR__ . '/../view/error/404.phtml', + 'error/index' => __DIR__ . '/../view/error/index.phtml', + ), + 'template_path_stack' => array( + __DIR__ . '/../view', + ), + ), +); diff --git a/module/Application/language/ar_SY.mo b/module/Application/language/ar_SY.mo new file mode 100644 index 0000000000000000000000000000000000000000..fa7ae166939da5c016a79122da666e4ff85e3cf8 GIT binary patch literal 5526 zcmb7|%X1u86~-?l1dzik51s+80fkWU46^K$!#F0$mJ}Q8pt8mZ32b_1u4X#w>7MjM ziYSUIzhp%eVFQ0aFp9=1+p@47$0-)D;jw{Y0oA?9jtx~TS+D_q=XTFS!XYrFo-^I| z+;hHj&Ueo3(p&f4{S(DUb3G*2yOerVhL))ZdT~ zAxGr?Zlykqd=UA5PLLt4~8Ej-^+dXJ-Od& z$PaS=8>HC#Gg5H<6}b!fFQj7Mu6vXk=jXj_K7o7^Sw{X4`2_M8$gd#(ffWDy-j~~- zMV?~+3rO+vOThn=`#&J}bN_psXyje@D)l+!7m$MEDY-}Q+sF@b|NRf-daocQKbuI& z>#vYNQ*RaPe?dx~@4=bi7)O2@c@p_2>~)a*scDiaeoi69j*Aq%Wu(OaGvvpRw~>e0 z_ebQD+&@5)Uqn`slgM8qzmD96vFDJ_ARj?qLrT6fT){cp$t{6MFyHer>`q2z5}eCt+wBYNF9_V>j>}PrLqH5Vjq;Qxl%2L$}$A zBORK^gbSuoRulft-A4ky89H&|*je`= zK*d~HS6gnRqn^dO<7U3SGY*siIQqImZ0L$sT)-#hI-I$C%zlQ>PQO_ z#V$sNlI;vBMQ&`9HpIu!5R)4R;gSuoDV@P@A*67ooij>EZFDCLUNH4oeDy=2P<@8v zNq!=v6}p$5HzM4D~q7J-nr(9WHmj*N!@$dm+hlGb5u&xt6qIe#{`8%j5z9@;$-X@!d!hBghOR*i_8Z{8L?fN7%Mu$AdE_qvQkt91* z#e38EhFK_s@>%0S6Kk4bw|#7lk48$$JTwOM42|u0YNw_YH1Qiu8K*8y(&LznjMp}yAjy2;C*+ci!Q7miFKrKC z(bO#4m@y0x2)f`lOa!C+dGeCCr&t?}7TtMwG}^;2KO3&mcNX1UzUh@wfMwUm?B&OSu`v`&CmAzxOzqS=p!e>pJofmbWBbrM?nH5^8ajSN1VLEQ zRcCR|%Hp$B0@sk+nwd2C*azufVd3kNlA6GkRJbgDXCdVHWKz~)R?n)2&`%<_tU zyynIu-zv=nhPQ{(H_Q@)un`>xD+Y@=%s`=sv!bW`CZne{SUM6UOoXM1KK1mm>eQs3 ztxi;@W(VtsIVx!ARz;Tw4`(@n>a7_bm&RBqkIZ;U=y)ZL({@zRe#hQMhsF=;{O6%Z z{N0E4e(B(dO0T3hvvWGVn%+t;+TPux)Aj5ePfxRUNvCgStLc``&Sxv>Wv4rk{JPNmSQ&+MxteinRy^@{A#v9n!?pXF|m2PAgaK48#?W>z6`L{vwuK8yE%CCQ*_46>AD4*RgP0*i@|d`6kL+>1(9!Iu}G)vsI9k zOGP(`L#Sts3VBzAzPZDmlhZ;Wsn3eu<|!`#rDT(kS||kFyJSQtAmA<+0e3~{u-t=Z$+1ifbOtE;rn%qIJEZtJ@d`tV-n(d%{OTZEEUwcqZ}3eDieQBa zIG{dIMzXe%US=aK<$-uCQr)i))+Hr(ig!(_DPD!cd5x&9FbHQwCRbop(a{6Mc}fM! z8I)fmx&n;wjXGH{qtSo7om#+K!U73gNr1ExBSuPVDGLYtMUW&C>w4Zo^1f>K2{&)y z_SHOop;Q+fm+t)LS_H)WkdVZ0;YZNZhOA4i>`K2|Gyy=|A&w2`!(+ypY_Xk7VzUb} z26`hwI@C@S#;0W>otnOmM!K`@w#^zg-5_}@Id6)o+pGGvcirtXst*UqS8c7pBCP1q zT_VFcgOKkW(<-bY&C)G7tA@(hr_eUIMdFG{)y=1deJF#Wo8Gbs#KA3`t)$(-0a6Sq zAZ=zZ7g}gs&Mw&UlW9EK!3v27c6y_(K;Jjph0LqNJSS2+6oEmL*jTN3duC|@l}D?5 z{~&us71rL)cyZ_nr#EH%4O)(5T(*H0gNsQ2Pa^{Z0z&eXcDHAMVL?G;5!1GZI0U71 z>-m9HoY|s~Pj~r8hV8^`aAa9-ZZKUhW*1Q89P3JR%NZo6=k}Lac?)M, 2012. +# Tawfek Daghistani , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-07 13:58+0300\n" +"Last-Translator: Tawfek Daghistani \n" +"Language-Team: Arabic <>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: English\n" +"X-Poedit-Country: UNITED STATES\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +#: ../view/layout/layout.phtml:6 ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "الصفحة الرئيسية" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "جميع الحقوق محفوظة" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "أهلا بك في %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "" +"Congratulations! You have successfully installed the %sZF2 Skeleton " +"Application%s. You are currently running Zend Framework version %s. This " +"skeleton can serve as a simple starting point for you to begin building your " +"application on ZF2." +msgstr "" +"تهانينا! لقد قمت بتنصيب %sZF2 Skeleton Application%s . أنت الآن تستخدم مكتبة " +"زيند الإصدار %s . هذا التطبيق يمكن أن يكون لك نقطة بداية سهلة في بناء " +"برامجك الخاصة على مكتبة زيند " + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "اشتق مكتبة زيند على GitHub " + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "تابع أخر التطورات" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "" +"Zend Framework 2 is under active development. If you are interested in " +"following the development of ZF2, there is a special ZF2 portal on the " +"official Zend Framework website which provides links to the ZF2 %swiki%s, " +"%sdev blog%s, %sissue tracker%s, and much more. This is a great resource for " +"staying up to date with the latest developments!" +msgstr "" +"مكتبة زيند تخضع للتطوير المستمر , إذا كان لديك الرغبة في متابعة التطورات , " +"بإمكانك تصفح الموقع الرسمي للمكتبة الذي يحتوي على روابط إلى %swiki%s, %sdev " +"blog%s, %sissue tracker%s, ,و المزيد . هذه مصادر رائعة لمتابعة أخر التطورات" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "بوابة التطوير الخاصة ب زيند" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "تعرف على الإضافات" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "" +"The community is working on developing a community site to serve as a " +"repository and gallery for ZF2 modules. The project is available %son GitHub" +"%s. The site is currently live and currently contains a list of some of the " +"modules already available for ZF2." +msgstr "" +"المجتمع البرمجي يعمل على تطوير موقع خاص به ليكون كمصدر و معرض لإضافات ZF2 . " +"هذا المشروع موجود على %son GitHub%s . هذا الموقع يخضع للتطوير المستمر و " +"يحتوي على قائمة من الإضافات الخاصة ب ZF2 " + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "إكتشف إضافات ZF2 " + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "الدعم و المساعدة " + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "" +"If you need any help or support while developing with ZF2, you may reach us " +"via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or " +"feedback you may have regarding the beta releases. Alternatively, you may " +"subscribe and post questions to the %smailing lists%s." +msgstr "" +"إذا كنت تريد الحصول على دعم فني أو مساعدة في تطوير ZF2 , بإمكانك التواصل عبر " +"IRC: %s#zftalk.2 on Freenode%s. نحن نريد أن نسمع منك المزيد من الأسئلة , " +"الأراء و الملاحظات على النسخة التجربية من المكتبة , أو بإمكانك الإشتراك و " +"التفاعل أو وضع الأسئلة في القائمة البريدية %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "تواصل معنا في IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "حصل خطأ ما " + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "مزيد من المعلومات" + +#: ../view/error/index.phtml:11 ../view/error/index.phtml:35 +msgid "File" +msgstr "ملف" + +#: ../view/error/index.phtml:15 ../view/error/index.phtml:39 +msgid "Message" +msgstr "الرسالة" + +#: ../view/error/index.phtml:19 ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "تفاصيل الخطأ" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "الأخطاء السابقة" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "لايوجد خطأ" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "حصل خطأ 404 , الصفحة غير موجودة" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "المتحكم المطلوب غير قادر على إجابة الطلب" + +#: ../view/error/404.phtml:13 +msgid "" +"The requested controller could not be mapped to an existing controller class." +msgstr "لا يمكن ربط المتحكم المطلوب بأي من المتحكمات الموجودة حالياًَ" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "المتحكم المطلوب غير قادر على الإجابة " + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "الرابط المطلوب غير معرف لدى الموجه" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "لا يمكنني التحديد لماذا حصل الخطأ 404 في هذا الوقت " + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "المتحكم " + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "يوصل إلى %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "خطأ برمجي" diff --git a/module/Application/language/cs_CZ.mo b/module/Application/language/cs_CZ.mo new file mode 100644 index 0000000000000000000000000000000000000000..46f2c0f637a83e5aea25000e19c7016663ff5d98 GIT binary patch literal 5005 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 QV;@(@2=$5oVl3(S4+(UTng9R* literal 0 HcmV?d00001 diff --git a/module/Application/language/cs_CZ.po b/module/Application/language/cs_CZ.po new file mode 100644 index 00000000..2485e2d6 --- /dev/null +++ b/module/Application/language/cs_CZ.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-06 13:05+0100\n" +"Last-Translator: David Lukas \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Czech\n" +"X-Poedit-Country: CZECH REPUBLIC\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton aplikace" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Úvod" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Všechna práva vyhrazena." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Vítejte v %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Blahopřejeme! Úspěšně jste nainstalovali %sZF2 Skeleton Application%s. Právě používáte Zend Framework verze %s. Tato kostra aplikace vám poslouží jako jednoduchý výchozí bod, ze kterého můžete vyjít při tvorbě vlastní aplikace nad ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 na GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Sledujte vývoj" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 je aktivně vyvíjen. Chcete-li sledovat vývoj ZF2, máte na oficiálních webových stránkách Zend Framework k dispozici zvláštní portál ZF2, na kterém najdete odkazy na ZF2 %swiki%s, %svývojářský blog%s, %sissue tracker%s a mnoho dalšího. Tento portál je skvělý zdroj aktuálních informací o nejnovějším vývoji!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Vývojářský portál ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Objevte Moduly" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Komunita pracuje na vývoji komunitního webu, který bude sloužit jako archiv a galerie modulů ZF2. Tento projekt je dostupný %sna GitHub%s. Web je aktuálně v provozu a obsahuje seznam některých již dostupných modulů ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Prozkoumejte Moduly ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Pomoc & Podpora" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Budete-li při vývoji se ZF2 potřebovat jakoukoli pomoc nebo podporu, můžete nás zastihnout přes IRC: %s#zftalk.2 na Freenode%s. Budeme rádi za jakékoli vaše otázky nebo připomínky týkající se beta verzí. Případně se také můžete přihlásit k odběru a posílat otázky na naše %se-mailové distribuční seznamy%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Ozvěte se nám na IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Vyskytla se chyba" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Další informace" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Soubor" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Zpráva" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Trasování zásobníku (Stack trace)" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Předchozí výjimky" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Žádná výjimka není k dispozici" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Vyskytla se chyba 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Požadovaný controller nemohl vyřídit požadavek." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Požadovaný controller se nepodařilo namapovat na žádnou existující třídu controlleru." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Požadovaný controller nepodporuje vyřízení (controller not dispatchable)." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "S požadovaným URL nebyla při směrování (routing) nalezena shoda." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Momentálně nedokážeme určit, proč byla vygenerována chyba 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "je mapován na %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Výjimka" + diff --git a/module/Application/language/de_DE.mo b/module/Application/language/de_DE.mo new file mode 100644 index 0000000000000000000000000000000000000000..fcea0366faf48b28a5e7b083f717dc36c6dda9c4 GIT binary patch literal 5126 zcma)3*uf4mr6|b{+*LLC)HQhBcmFejo zs;XzatB4a42M!=15C;Sj%00lr;$U$Zi4zClP7rsH5H}7;{9bj>&UlFvTD$Y6yQ|*c z?|t>=?Gwj-oNztQ|7ZDs`h7|ACFJq<^TG8i@|R5bIEfE$AV0+Y4?kGj{VDP( z?%zU+zTY7~g8VZwVg1|4Rlff9i6q%Zo?vqu`7PuHzG6B0r7%0#aOD zLw*u@38|2GkP^oPDf_>Vd;@(yLE>U^@?-V7=aA2Fe*r0Zd$o}Rl$yDeYb=u$CT2;FPlbcW$YJD`yZ5kDv_U))a zJENk1MPRq9iozB>bs!{ zvUxu>qnNtQ`=h)h010yTcFX1_*|M3tTGdIenS7+q z=;7!kwOfrwr3=Zma%ht4-ROH^NU1LNRbSQ-kgpf1NgsnMt1U@P6C3*C(Q@23)MVA@ zw67|!##XEAx2~*_$S)prsnehxUD$HQ6lG>4zjw_GnaT-R($zPb{9yIlmGKg?7t>vQ z>F9KDXduGCnVxnrt5W%n2^zz>(cYkSJrBkeRGx(F&pq>1$EVJA3`R1l<->v{?AI6? zYMV=Bx%I*0W3mn0bk8I=OLbTbrN=DO9kRb8iwT$H5^b{M%-ELPn_1y}vKz$z;B;z| zJ={&p;jk)f0Ki@e=0pYi7xJnX7I_Q|TQ`Wb$}?4zfjTO9BJJ~{1Cq*0`s(NwaiQ*(qdP|f6a(imi*N)PTvMEl6l! z4S5chyiNKfDe|XS@0r3td%}r#O%6<=YIyBYhFU%C6DjjT$EzKBSm(*nl~T~E$RHG* zNnbgAb;*wAaUjdhF zEW2G>zj`!)iRnbNK__qp03F-Rco0<#$V=UcqV2Sw*nvImm-&Vhs*{(!`p$Y^ksMlT zV4OUXmL67U8^VzdaYyfZATh{c1N){X;t-}8YvpULl^50OSJuwG$oG{M7PfA|C~_hlUH4VBa(?aX`FhB191 z>DJWdm^QdV(EIAb&|EUy(r9kK4XnPgbVC=t3RY|F89l`NEtb+&wo|d$s|yF+76}i$ zymUbA9^Hih+t;@@=fR(CuPn)a0Mgpq9}!G2_rsS*IaKkIqLZ9A;o|MRt=9SZI`Oq@ zTx%1*gvr;``Hl@sueNqd!|c#{+3drOnZH3Nqp%6h%okjS?P=8hnrhD<&H`IgSLruh z%-@g;BHZW2=B@4Zo3G8^>~ip={T)=bR#4VnN;WAqji?O0Aj8d;=|iweSKZ`Z<)?3k z14awba{bZK#;98+?E|NA={lybIfsgNvWb#Lflww&dL}sdpx_*KwI)vHeEKjQOsc}C z{Zne!8s?pj;ZWe)yG=HXPIN0MmsV;9B5PcbwuexQDo{X}#p#SrMp*+{l!9`9WJ=)l z+^`I0UeY&xh`R&$OI`05DABoB1Ou^}o*z}kAS|oy^r7Q5Tre>lAjr)kOl&&HtD?88 zI@;rmbU$HZZ+OI>VsgMKv_CQip(8W2b`cX%Pdmwa;VxRPBMk%~osuEnLVn_dKgQ|n~AW9(6zYG{Q> z{x@VP%k)98(EYL+$cZ{2rDQ2;2LUQ8DJJ0S$}BZ~*ddsV^Wi7GfLp9+q0m^)ZOl_bd_9;xjFHCpF3YIZK&a6%eSp%% zsY?x}4+;T{pg3x*L40Ji!eYq;9s?J!Mzf7?8KlW%ZJ297#P<}*zjQ~kiH zBBvjWDzgRF-NK?>S+WfNbD;!jlB*iFKv8UtIY1-QId+>4i^s@72D3mj&Y?(S&O?f; znUgyahH)+4V$rKt3Jy#Y`yAi;(>L=-SVjqBGD(3xxP+q^ZPN!`3LONng5tViIOnB% z1zAVuhIXWC*z z{JHapDoN?#WcPB;tY&~{&tSTs0{@RX$z&lR3fs7<3nbp%{)Ar~^#(Xvn&1YV5m|D* z=t`GJlaRg!2SjtPlGi?VwGEL3V^LsCX}Mb2aQdL`7j2Xdu=5|GoCSZz1id-QZ3S325l6x zfl%lh9D(^r)QgLxl=\n" +"Language-Team: ZF Contributors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Startseite" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Alle Rechte vorbehalten." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Willkommen zu dem %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Herzlichen Glückwunsch! Sie haben die %sZF2 Skeleton Application%s erfolgreich installiert und benutzen gerade die Version %s des Zend Frameworks. Dieses Gerüst kann Ihnen als Einstiegspunkt, für Ihre weitere Entwicklung, basierend auf dem Zend Framework 2, dienen." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 auf GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Folge der Entwicklung" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Das Zend Framework 2 wird z.Z. aktiv weiterentwickelt. Sollten Sie daran interessiert sein, die Entwicklung von ZF2 zu verfolgen, so bietet Ihnen die offizielle Webseite einen eigens für das Zend Framework 2 eingerichteten Bereich, auf der Sie Verlinkungen zum ZF2 %sWiki%s, %sEntwickler Blog%s, einem %sFehlerverfolgungssystem%s und noch vielem mehr finden. Dieser Bereich ist eine hervorragende Quelle um stets aktuell zu bleiben." + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Entwickler Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Entdecken Sie Module" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Die Community arbeitet momentan an einer Community Seite, welche als Galerie für ZF2 Module dient. Dieses Projekt ist %sauf GitHub%s verfügbar. Die Webseite ist bereits Online und enthält eine Liste mit schon veröffentlichten Modulen für das Zend Framework 2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Erkunden Sie ZF2 Module" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Hilfe & Support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Sollten Sie Hilfe jeglicher Art bei der Entwicklung mit dem Zend Framework 2 benötigen, kontaktieren Sie uns doch einfach über das IRC: %s#zftalk.2 on Freenode%s. Wir freuen uns darauf, Ihnen bei Ihren Fragen zu helfen oder aber auch Ihre Meinung bezüglich der Beta Versionen zu hören. Alternativ können Sie auch die %smailing lists%s abonnieren und Ihre Fragen dort stellen." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Schreiben Sie uns im IRC an" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Ein Fehler ist aufgetreten" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Zusätzliche Information" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Datei" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Meldung" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stapelüberwachung" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Vorherige Ausnahme" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Es ist keine Ausnahme verfügbar" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Es trat ein 404 Fehler auf" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Der angeforderte Controller war nicht in der Lage die Anfrage zu verarbeiten." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Der angeforderte Controller konnte keiner Controller Klasse zugeordnet werden." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Der angeforderte Controller ist nicht aufrufbar." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Für die angeforderte URL konnte keine Übereinstimmung gefunden werden." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Zu diesem Zeitpunkt ist es uns nicht möglich zu bestimmen, warum ein 404 Fehler aufgetreten ist." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "wird aufgelöst in %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Ausnahme" + diff --git a/module/Application/language/en_US.mo b/module/Application/language/en_US.mo new file mode 100644 index 0000000000000000000000000000000000000000..972a28ab34c2f0d90cabf56f0d021c5f205bbc09 GIT binary patch literal 545 zcmaJ+O;5r=5XI=JN6#Mi;L*WCV!(=quaXc!i4ehb)vOfK!O`$uD#=6e|OmacsLHr?6s=z73-+k!ZznDgs*g(XHw}45ig~6 zNSCu{0L@ZYSY4onkZmPOr-5kB6?qRZF_\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: English\n" +"X-Poedit-Country: UNITED STATES\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "" + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "" + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "" + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "" + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "" + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "" + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "" + diff --git a/module/Application/language/es_ES.mo b/module/Application/language/es_ES.mo new file mode 100644 index 0000000000000000000000000000000000000000..3728554767333faa67772174898cf3de1d245970 GIT binary patch literal 5063 zcmai&&5s;M8OAG+@UaO55=@*)yz{h}at&GPZZ|3a_*Bt}$2$siwPjro25} z?XK=w&x!+QB*X>&fJh*bgQZB303jq0djJjyP8@TMgv5~pT;TUs_k8SPk&$QLsp+cs z`+e#ezx~vsKT*6i@8{(Gh*D=nzK1`&{)qe-@=wT*Bj0Y<|3rS2_0oHl`Umnk6?8-$U|G{fIwLCLWcjV*9{~#6T9)F)wt9*Qd!&}I&A-l*QA}=C;gS>$J7gFqh`2&sq9po*} z-$ja@-{Jf_tp9@i1nXa7MB@J|^3%w7kYfL_CzSd(@>!(Bf9gX`UNlnHt4PV~B_t-* z9i*J=BhMlakP^>Nk+`mYg?tUWzeURaC!bVm8TkzI6!H>M{Mc#NcahJt{yy?W&ixE2 zasHVi>>!sY(i!A;k>`;=Kwd%~AwP$Fgkp$)&m$|&_mEP*U*Hr=MVX@?h?p;t518Et&aZX6{pKO&s{#ycWj>Ojna(lfiL&<*p>lTQPBEzG~l$Gcyyvr+1ta^gCmDhbcaJlZ+E=%P(-CI_^vV9VY$jZiOSEdc zv}5O4+iBr~dRR-Uol1hLN|RW%OALu0jq2Q0bal|uh@uyz3&}PMn}Vxi(iZx$w8Z2p zUru6x1DOmyOG8S}jGB&;rnb5${au?>Vrv!(g_?Cp)BH5Im|@d=YBI7K_0PXb=wHJu zG82+D?e}z`n?y=ZTf^F9^hSzv)7(v6>&66>HrAcayLIzAk=9wNb6-(h4R|C&9`tE1 zU(2waJR&YMBXsg)Q3yPET&5&=Cuv>WotZ$9B`0$S7M>q4>f%M}LLpvA&EI8voy#V% zIXx89(5mmM+Z5a6QK_X-M=mF!6?@2Y<;dH?kR(M=73%|=Td+`o^0v)rlc*Z7I}Tf` z%Rxz*7hphdGuS3mCwEFg>pTTzOd>-v?JbEaM(($piRx^ooo_Zb$XZ0;>F_UHM@u)E)UxVq zg@H>um+L|3?D{pmwEfy{=Zbg+_I0jeb4{AWeb-H>I=iLG0}=RgP4`lt?RnkfW*X>=Ca#PuUL6STb?L6JE?qbIpa$_e zyVi^dVnbh%>2m!V9YJ3_-0P6{iifWrQo`oY*5=mwJn(bfl_fbub98nm1%Xude)Xjy z114V4Oi>wZb?MgbM(6x|pZK|F%g%b9c!BmceZKFinL8xtTb*rh;T4^4*a;AshU*M8 zy4wite8XjK0_JtNrn~bmr-7~Mox2YB{YS*WpF6Pa^*<{FvhWU{F@K9~)_pfhQ zsEgxJfRSIUxg0>cO+d4S-3?IF0+PE@~@aN9ttMOqmncLkSeVEfT03 z?BkH(0xpjpkPl0674)NkAyF7?W2iRSz1s0)My60UV}07oO?Ncm zHPPt;N~gboXH#PKMRh%LE_hjL(x!@nHhpt9R5{gSN9G0Rmnq4cw`NxZSS<{-v`(%P zS|iL*a=v?N<7~s3rAekN&W4uRE!4jq!Fk{Lmf}4GUU6RVC=xun&*p#*^=N_N_Ke!G zkICkKdopwAcf0Seg)yR`Y-=!Naz3n literal 0 HcmV?d00001 diff --git a/module/Application/language/es_ES.po b/module/Application/language/es_ES.po new file mode 100644 index 00000000..5170d3ce --- /dev/null +++ b/module/Application/language/es_ES.po @@ -0,0 +1,111 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-06 19:07+0100\n" +"PO-Revision-Date: 2012-07-06 19:09+0100\n" +"Last-Translator: Adolfo Abegg \n" +"Language-Team: ZF Contributors \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: Spanish\n" +"X-Poedit-Country: SPAIN\n" +"X-Poedit-SearchPath-0: ..\n" + +msgid "Skeleton Application" +msgstr "Aplicación Esqueleto" + +msgid "Home" +msgstr "Inicio" + +msgid "All rights reserved." +msgstr "Todos los derechos reservados" + +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenido al %sZend Framework 2%s" + +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "¡Felicitaciones! Haz instalado correctamente el %sla aplicación esqueleto del ZF2%s. Estás corriendo la versión %s del Zend Framework. Este esqueleto te servirá como un punto de inicio sencillo para empezar a construir tu aplicación con el ZF2." + +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Hacer un Fork del Zend Framework 2 en GitHub" + +msgid "Follow Development" +msgstr "Seguir el Desarrollo" + +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "El Zend Framework 2 está en pleno desarrollo. Si estás interesado en seguir el desarrollo del ZF2, existe un portal especial para el ZF2 en el sitio web oficial del Zend Framework el cual provee enlaces %sa la Wiki%s, %sal Blog de desarrollo%s, %sal issue tracker%s y mucho más. Este es un gran recurso para mantenerte al día con los últimos avances en el desarrollo!" + +msgid "ZF2 Development Portal" +msgstr "Portal de Desarrollo del ZF2" + +msgid "Discover Modules" +msgstr "Descubre Módulos" + +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La comunidad está trabajando en el desarrollo de una web comunitaria que servirá de repositorio y galería de los módulos del ZF2. El proyecto está disponible %sen GitHub%s. El sitio web está en línea y actualmente posee una lista de algunos módulos que ya están disponibles para el ZF2." + +msgid "Explore ZF2 Modules" +msgstr "Explora los módulos del ZF2" + +msgid "Help & Support" +msgstr "Ayuda & Soporte" + +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si necesitas alguna ayuda o soporte mientras estás desarrollando con el ZF2, puedes encontrarnos via IRC: %s#zftalk.2 en Freenode%s. Nos encantaría leer tus preguntas o cualquier feedback que puedas tener en relación a los lanzamientos de las versiones beta. También puedes subscribirte y enviar preguntas %sa la lista de correos%s" + +msgid "Ping us on IRC" +msgstr "Escríbenos en el IRC" + +msgid "An error occurred" +msgstr "Ha ocurrido un error" + +msgid "Additional information" +msgstr "Información adicional" + +msgid "File" +msgstr "Archivo" + +msgid "Message" +msgstr "Mensaje" + +msgid "Stack trace" +msgstr "Seguimiento de la pila (stack trace)" + +msgid "Previous exceptions" +msgstr "Excepciones anteriores" + +msgid "No Exception available" +msgstr "No hay ninguna Excepción disponible." + +msgid "A 404 error occurred" +msgstr "Ha ocurrido un error 404" + +msgid "The requested controller was unable to dispatch the request." +msgstr "El controlador solicitado no pudo ejecutar la petición." + +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "El controlador solicitado no se pudo mapear con una clase de controlador existente." + +msgid "The requested controller was not dispatchable." +msgstr "El controlador solicitado no es ejecutable." + +msgid "The requested URL could not be matched by routing." +msgstr "El ruteador no ha encontrado la ruta para la URL solicitada." + +msgid "We cannot determine at this time why a 404 was generated." +msgstr "No pudimos determinar por qué un error 404 ha sido generado." + +msgid "Controller" +msgstr "Controller" + +msgid "resolves to %s" +msgstr "se resuelve a %s" + +msgid "Exception" +msgstr "Excepción" + diff --git a/module/Application/language/fr_CA.mo b/module/Application/language/fr_CA.mo new file mode 100644 index 0000000000000000000000000000000000000000..956a0d9d90577e1c8366e18ddc2efc7397c014ef GIT binary patch literal 5074 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\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: CANADA\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Une erreur 404 est survenue" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Le contrôleur demandé n'a pas pu acheminer la requête." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Le contrôleur demandé ne correspond pas à une classe contrôleur existante." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Le contrôleur demandé ne peut être acheminé." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "L'URL demandée n'a pas pu trouver de route correspondante." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nous ne pouvons pas déterminer pour le moment pourquoi une 404 a été générée." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Contrôleur" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "résout en %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exception" + +#: ../view/error/404.phtml:55 +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +msgid "Stack trace" +msgstr "Pile d'exécution" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Une erreur est survenue" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informations complémentaires" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Fichier" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Message" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Exceptions précédentes" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Aucune exception disponible" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenue dans %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Félicitations ! Vous avez installé %sZF2 Skeleton Application%s avec succès. Vous utilisez actuellement Zend Framework version %s. Cette structure peut vous servir comme point de départ simple pour démarrer la construction de votre application avec ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Faites un Fork de Zend Framework 2 sur GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Suivre le développement" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 est en cours de développement. Si vous êtes intéressé pour suivre l'évolution de ZF2, il existe un portail dédié à ZF2 sur le site officiel Zend Framework qui propose des liens vers le %swiki%s ZF2, le %sblogue de dev%s, le %ssuivi des problèmes%s, et bien plus encore. Il s'agit d'une excellente ressource pour rester à jour sur les dernières évolutions !" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portail sur le développement de ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Découvrez les modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La communauté travaille sur le développement d'un site communautaire avec l'objectif de servir de dépôt et de galerie pour les modules ZF2. Le projet est disponible %ssur GitHub%s. Le site est déjà en ligne, et contient une liste non exhaustive des modules déjà disponibles pour ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Explorer les modules ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aide & support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si vous avez besoin d'aide ou de soutient en développant avec ZF2, vous pouvez nous joindre sur IRC : %s#zftalk.2 sur Freenode%s. Nous aimerions connaître vos questions ou les commentaires que vous pourriez avoir au sujet des versions beta. Sinon, vous pouvez vous abonner, et poser des questions sur la %sliste de diffusion%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Rejoignez-nous sur IRC" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Accueil" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tous droits réservés." + diff --git a/module/Application/language/fr_FR.mo b/module/Application/language/fr_FR.mo new file mode 100644 index 0000000000000000000000000000000000000000..28f1932ad37233a88a93cdd0dc86a9c817716d66 GIT binary patch literal 5077 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 literal 0 HcmV?d00001 diff --git a/module/Application/language/fr_FR.po b/module/Application/language/fr_FR.po new file mode 100644 index 00000000..49f89d92 --- /dev/null +++ b/module/Application/language/fr_FR.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:32-0700\n" +"PO-Revision-Date: 2012-07-05 23:36-0700\n" +"Last-Translator: Evan Coury \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: FRANCE\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Accueil" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tous droits réservés." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenue dans le %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Félicitations ! Vous avez installé avec succès le %sZF2 Skeleton Application%s. Vous utilisez actuellement Zend Framework version %s. Cette structure peut vous servir comme un point de départ simple pour démarrer la construction de votre application avec ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Faites un Fork de Zend Framework 2 sur GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Suivre le développement" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 est en cours de développement. Si vous êtes intéressé pour suivre l'évolution de ZF2, il existe un portail dédié à ZF2 sur le site officiel Zend Framework qui propose des liens vers le %swiki%s ZF2, %sdev blog%s, %ssuivi des problèmes%s, et bien plus encore. Il s'agit d'une excellente ressource pour rester à jour sur les dernières évolutions !" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portail sur le développement de ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Découvrez les modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La communauté travaille sur le développement d'un site communautaire avec l'objectif de servir de dépôt et de galerie pour les modules ZF2. Le projet est disponible %ssur GitHub%s. Le site est déjà en ligne, et contient une liste non exhaustive des modules déjà disponibles pour ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Explorer les modules ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aide & support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si vous avez besoin d'aide ou de support en développant avec ZF2, vous pouvez nous joindre sur IRC : %s#zftalk.2 sur Freenode%s. Nous aimerions avoir vos questions ou vos commentaires que vous pourriez avoir au sujet des versions bêta. Sinon, vous pouvez vous abonner, et poser des questions sur la %sliste de diffusion%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Rejoignez-nous sur IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Une erreur est survenue" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informations complémentaires" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Fichier" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Message" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Pile d'exécution" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Exceptions précédentes" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Aucune exception disponible" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Une erreur 404 est survenue" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Le contrôleur demandé n'a pas pu dispatcher la requête." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Le contrôleur demandé ne correspond pas à une classe existante de contrôleur." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Le contrôleur demandé n'est pas dispatchable." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "L'URL demandée n'a pas pu trouver de route correspondante." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nous ne pouvons pas déterminer pour le moment pourquoi une 404 a été générée." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Contrôleur" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "résout en %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exception" + diff --git a/module/Application/language/it_IT.mo b/module/Application/language/it_IT.mo new file mode 100644 index 0000000000000000000000000000000000000000..3656ac349512a2f60b0ea2ad8658554c27c13cdf GIT binary patch literal 4922 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\n" +"Language-Team: ZF Contributors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,-1,5,-1,-1,-1\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Pagina iniziale" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tutti i diritti sono riservati." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Benvenuto in %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Congratulazioni! Hai appena installato con successo %sZF2 Skeleton Application%s e stai utilizzando la versione %s di Zend Framework. Questa struttura può servirti come semplice punto di riferimento per iniziare a costruire un'applicazione basata su ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Crea un fork di Zend Framework 2 su GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Segui lo sviluppo" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 è in forte sviluppo. Se sei interessato a seguire lo sviluppo di ZF2, è presente un portale che fornisce link al %swiki%s, al %sdev blog%s, all'%sissue tracker%s e a molto altro riguardo a ZF2. Il Portale è un'ottima risorsa per rimanere aggiornati con gli ultimi sviluppi!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portale sullo sviluppo di ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Scopri i Moduli" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La community sta lavorando allo sviluppo di un sito che deve servire come raccolta e gallery di Moduli per ZF2. Il progetto è disponibile %son Github%s. Il sito è visitabile e al momento contiene una lista di alcuni dei Moduli già disponibili per ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Esplora i Moduli di ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aiuto & Supporto" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Qualora ti servisse aiuto o supporto mentre sviluppi con ZF2, puoi contattarci tramite IRC: %s#zftalk.2 on Freenode%s. Ci piacerebbe moltissimo ricevere le tue domande o qualunque feedback tu possa avere riguardo alle beta release. In alternativa, puoi iscriverti e inviare domande alla %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Contattaci su IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Si è verificato un errore" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informazioni aggiuntive" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "File" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Messaggio" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Eccezioni precedenti" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Non è disponibile alcuna eccezione" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Si è verificato un errore 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Il controller richiesto non è stato in grado di elaborare la richiesta." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Non è stato possibile mappare il controller richiesto ad una classe di tipo controller." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Il controller richiesto non è un oggetto dispatchable." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Non è stato possibile effettuare il match dell'indirizzo richiesto tramite routing." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "In questo momento non siamo in grado di determinare perchè sia stato generato un 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "viene risolto in %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Eccezione" + diff --git a/module/Application/language/ja_JP.mo b/module/Application/language/ja_JP.mo new file mode 100644 index 0000000000000000000000000000000000000000..66b6f3ccb4213eae7758f2b6cd6bfb94f6f23a06 GIT binary patch literal 5185 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 literal 0 HcmV?d00001 diff --git a/module/Application/language/ja_JP.po b/module/Application/language/ja_JP.po new file mode 100644 index 00000000..d6a953ee --- /dev/null +++ b/module/Application/language/ja_JP.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 19:30-0700\n" +"PO-Revision-Date: 2012-07-15 08:20+0900\n" +"Last-Translator: sasezaki \n" +"Language-Team: Japanese\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Japanese\n" +"X-Poedit-Country: Japan\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "%sZend Framework 2%s へようこそ" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "おめでとうございます! %sZF2 Skeleton Application%s のインストールに成功しました。 あなたは Zend Framework version %s を動作させています。このスケルトンはZF2上でのアプリケーション構築を始めるためにシンプルなスタートポイントを提供します。" + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "GitHub で Zend Framework 2 をフォーク" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "開発を追う" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 は鋭意開発中です。ZF2の開発進行にご関心がおありでしょうか、Zend Framework公式ウェブサイト上ではZF2特別ポータルがあり、 %swiki%s、 %sdev blog%s、 %sissue tracker%s、 などのZF2関連のものを提供しています。最新の開発状況に追随するためのすばらしいリソースです。" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 開発ポータル" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "モジュールを見つける" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "コミュニティーはZF2モジュールのためのリポジトリとギャラリーを提供するコミュニティーサイトを開発中です。プロジェクトは %s GitHub%s で利用可能です。サイトは現在運営されており、ZF2ですでに利用可能なモジュールのリストを持っています。" + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "ZF2モジュールを探す" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "ヘルプとサポート" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "ZF2 で開発中に何らかのお手伝いやサポートが必要な場合、IRC を通じて私たちと連絡することができます。: %s#zftalk.2 on Freenode%s ベータ版についてあなたが抱えるかもしれない質問やフィードバックを何でも聞きたいと望みます。あるいは、%smailing lists%s を購読したり質問をポストしたりできます。" + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "IRC で呼び出す" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "エラーが発生しました" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "追加の情報" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "ファイル" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "メッセージ" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "スタックトレース" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "前の例外" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "例外が利用できません" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "404エラーが発生しました" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "要求されたコントローラはリクエストをディスパッチできませんでした。" + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "要求されたコントローラは存在するコントローラクラスにマッピングできませんでした。" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "要求されたコントローラはディスパッチ不可能でした。" + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "要求されたURLはルーティングにマッチしませんでした。" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "404が生成された理由について現時点で判断できません。" + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "コントローラ" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "%s に解決" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "例外" + diff --git a/module/Application/language/nl_NL.mo b/module/Application/language/nl_NL.mo new file mode 100644 index 0000000000000000000000000000000000000000..a03a3328cfb393bb53fab0b04298f56255c8086f GIT binary patch literal 4815 zcma)<%Wot{9mfkucsL1xJP40KY85#=vNL$iqAcDJ@UHFbF6)i8_GU?hKsD1fGv(>& zYO1LK|!FFWQj+VOX)yXyD; zee1VxJ#yc76(7y_N%_7*sb>Y>$say%fRBN{0zU-4HC_J={2=Ru-VlQ{UmwquB5o_#W0jyuZ==WAOc~e+i1b zH$k!M&)@^#zd*&g2i~pJIzJ!e@Gkfzunm42d>;G>_yzFqpy>bHdmH)t;2q8%f}-bV z82?+=zX6|S{e6^(|8IaF1^))Y$z5 zDEiNX^8O|${(l2}2)!97`vby6&oL-*eQk`D zbQ%2m6u$@Vvwjm4{huL;BL4>Xis%J-rGAQ0EEQ=^b^vL=;K%tQUVV(O)PTeV_fq~b zJAEV_V&5nDKF(KkXuk51{E5$Ew|qn&W~X|Q^%L@kkHn9%N*}4s*@qOT9DI2CK;ou0 z^~JS|+J@kR_T6qBg3Z)smbuFL!sOZ&Js(C!R%$cPb#VPb6?L%DhOy1sYO^?f`l>Jb z!BlmgPQ`Qj6<_Ot8CxCeZr8@xtMmK_$+0qdZZlmCtX_?;?yT$mq0MdO3%yyEx$7nY ztFfIVm|%6Xuc$a3>Y{K(U%zULOz#9UvJ)SMdTc|)RK&IQ!N5fwXA--n(8*?PqBc6Z zQJG^=WkMx#O7DtFZg;g3QSlm{4TLq6FL2bF%^;n>H zeOBi-s_lDSTc*%$-z#&E1LEZD?T*W>+Tp05=q)?8xi3eysCa}Ur~FzMeJ{G|THR6C zY+mYT%&5Gq_v^Csp;FiU$g1nTWP4!=sVR>1K=$EKY&Pl10EIehG>K0WR}I9X^Xc5k z5LIis16@Zwc1B;neRYFCK7HIHPs4UHVJBEy_{>Ut@7hmhI>%uN*T5R$gVt}>Hj2wp zRQIr@W4gn+f>Z{<_Dx7pmCSc+Wl)@36D?9V^U8*T%oC8Kg=Mks#BOjMi;|3N#cD|t z`kNXW8JCM^xr~1t~Q% zYAQ;K+Uhd+L))!H*W48nHLsAS_$h8t!=^>oeUp(qkzlL6patiuSl+jJh}s3bSN)hOS7FmA|^B~boyjj z3O#sCCM8%WVO`#xn@Ex+CJO_W-cM+Cu_AM^6e}d>|6_Yy$R^P_JCwpO72j5ONwz7H zP)nhXTtPr9_7LaF5x2>JASF^2?R{HVxKN1luFWZvBpR|iNn7iyQAwJYXh84L*d|w} zcS=I*B7>x5O8Cq|)9B_W*%F?S_(@i$btz{g(TM|iE~gSXmbU94 ze=$k;g`X6c9Q3`OYhImnU}8I|+Ta)ngaRGA%tk7z7!sGJJw@7ToVcM|jpzA=5xSH6 zezS5h)&z%^8rmR_q|Zk+(nb*Hl+BZMeJZh%8wg77+EjuTlmnm}uydgI+nQMqB zEV~@fDLI{wu@Kvc{a({it?OCq<>m(2NDMq{{-x_^UodXhyE7Q~TC0>I>@|7cV`# zc7c62O{`i6!4we>eAv);jZmXLFr$vQf%iqfhTB>P){HQBM_;9nT&HGp)XyLHS_HV_ z-ItHaRh!y-VSWaCcdzemFPy#5UR#ml6h!ObsKofn-m5-a=1{|BP3MGYt1sR;*lAr_ z>=WC1Hng^jt`|Dr(3d){TKQ^g&szqF)>rHiT$sh1bS?s?uGqzfnF||wtEN2{FRuC; zN;ulkx3&+iZQs7Rd24Hb@%9Qg1^qnO(Cx*;eJ-HxV2{VGHD0t=)D}!>xWtVfQoV(< zl~8kL3%YXbX`zDYWjg6_{VYZuE0c~;N_Rj&^w|5*u>)VH6Wc+0gjR>{)%7l`JqOs30Yc>-hpe+LWwi9YM ztWJ*uY0MG1Z7AcI9+=6~9cQyjAKGMLnr=!$sr^Wvi52r1hGs64Z?G4)u&*Z)5GjJ` zIP+3bWp+3pSEl!;RdmP@_eI!jl(|BO(XZ-dpZCRKj?(9hUby(5=9zLn&(vqnGn;u7 zqX+VunZxy)cvkL^Xh#;fHPeGVBi7h-UT54E!@7{OGKO@ZH75q2J=2s-kIOR+`wddb zIev&txrre%+hdK$aiHh8jtYI8Dnc{sn*L(a83uPK8yIVX?e%Cqp<7ulPdPWNn3xjf z{ZN~ZFSsZ;Mo!qh8s9d_T(JRat*A25-pnT=Hg*SY*fAzF!;E-5b(Cx{ty2lp%~73I zfhT5}t>sZ>LY{G7?p{%esA6e`nK6Fm@XyIbV#t^5?AQtBKplqvD6nRh!S=&cYpH7H z!^}0pyEM!!IYR`9L^JR`J{710CtoB9bNtfVbNs5%Il%Y&Ng*=#w{=df`>6^m$`TwlVDP$YkTAGFQ yi%X>qJ^lj#Ke;Sp1M#iPR^?lnOg_Tqbif!9(gI@oj3$%IZ6zsBEs|^_3I7HGp4>hF literal 0 HcmV?d00001 diff --git a/module/Application/language/nl_NL.po b/module/Application/language/nl_NL.po new file mode 100644 index 00000000..fa97eae1 --- /dev/null +++ b/module/Application/language/nl_NL.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-24 12:48+0100\n" +"Last-Translator: Walter Tamboer\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Dutch\n" +"X-Poedit-Country: NETHERLANDS\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Applicatie Fundering" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Home" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Alle rechten voorbehouden." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Welkom bij %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Gefeliciteerd! Je hebt de %sZF2 Applicatie Fundering%s succesvol geinstalleerd. Je gebruikt Zend Framework versie %s. Deze fundering biedt je een startpunt om je ZF2 applicatie op voort te bouwen." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 op GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Volg de Ontwikkeling" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 wordt actief ontwikkeld. Als je interesse hebt in het volgen van deze ontwikkelingen dan kun je de ZF2 portaal bezoeken op de officiële website van Zend Framework. Daar staan links naar de ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s en nog veel meer. Het is het perfecte middel om up-to-date te blijven met de ontwikkelingen." + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Ontwikkelaars Portaal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Ontdek Modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "De community werkt aan een eigen community website die dient als een bewaarplaats en galerij voor ZF2 modules. Het project is beschikbaar %sop GitHub%s. De site staat op dit moment live en bevat een lijst met modules die op dit moment beschikbaar zijn voor ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Verken ZF2 Modules" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Hulp & Support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Als je hulp nodig hebt tijdens het ontwikkelen met ZF2, dan kun je ons bereiken via IRC: %s#zftalk.2 op Freenode%s. We beantwoorde met alle liefde je vragen en zouden graag feedback krijgen betreffende de beta releases. Je kunt je ook abonneren op de %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Ping ons via IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Er is een fout opgetreden" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Additionele informatie" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Bestand" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Bericht" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stack trace" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Vorige excepties" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Geen exceptie beschikbaar" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "De pagina kon niet worden gevonden." + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "De opgevraagde controller kon deze aanvraag niet verwerken." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Er is geen mapping beschikbaar voor de opgevraagde controller." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "De opgevraagde controller is niet bruikbaar (dispatchable)." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Er is geen route gevonden die overeenkomt met de opgevraagde URL." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "We kunnen op dit moment niet achterhalen waarom de pagina niet kon worden gevonden." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "verwijst naar %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exceptie" + diff --git a/module/Application/language/pl_PL.mo b/module/Application/language/pl_PL.mo new file mode 100644 index 0000000000000000000000000000000000000000..0df3fc6d1c60bd28da8262ba9698a293a35d4155 GIT binary patch literal 4934 zcmb7`PmCm09mh)r(EsytZD| z6xHG4#*G(^7d@BiGwHn{9biW&yFO7N_T&|s^0JS zet*C3_x3%v{UYL0d>@qW$D-&l!H@I9^=I%4;9tNmf^X07-vd9-{mLhz=-=Rj;ELSe z7Db-}?*l&#J_6ngu7P}_GyL2Go&&!Qet&-d7RV?189(=8!_UDxxc~L--M+sCKg0c> zK+*RPQ0#gKyc2vMjF7wYlTozJ-@6dL06q)$!JmT9fH%NzgZ~9(|HnVo>E8igMScv* zK7Yjc|8W0T@ILPUz$UWa-$9AfJD~V~$6ZnMH}C;a{CyV``S(CnMYrAE`Fl4g{weUQ z;41hqcp4PFL-4cUTi`DH{sa_#|3cXV;Je`0z}s0Q@%zRcp9IDK7s30HdkuV+`+_8F zgTDdS!1qCk%NjiZ!I4*tK z6~j_jbrz)jL+W)`tC8L}%GYshyx*&{tVOf0be5S!RU@NT{To~BY9}?Bsa&BpCzH&^ zLBXo;2MxM3D%e+4NSAd{*kY*OFh!!aN}Zd=m8se{rN>m%_0{gkdgT`yV_m3Vv(jE^ z*VY9#A$$ajlWGh#!PbUTSpjjcvv z(TO0JYocm&JW{n+`&O%S7f){x$cLwUP;Po?qL-aIOor0?EYky`zb%V#m*C=Uv|XBg>$o?I z#QErhN;2B1#Hp&(v59u^A$ECQ7q+6Ry^=x{y(m2rY<*;rw^az*k$Nl*KH18ZZE$cX zoxy)8NU52;t0*aIqb8*ro4As_4qYKphZWKlKgBKEuxQye8Bq=TmycrVSJR91ghWlb zJ>{t;L5b;nW2G}{Bf+>u>=vf=LjXz>@=oQwdhtA-)>)zoSCL!=dBh`L3@9&GOS2sp z5fi!=Ixabx2t7DVCM8%WVLiG!)1D+tOqK>5dEe0LVnt&8M68gUf5`H>kVUfRLMVh` zuD%~#BH6kKN)3gY+k${rtRc>oC2q}#AO%vD-G``bg4z zga*_$jjglj_)1A=T_muKj-^Q!H73;2S91;!u7uAFG|k@pC0oKX5sX5*;{z z=OPuzabjW%`HM-yFZ`vrM9}T++3wY?4m4&!dc=DRfl#3PHZh)xDpKOowWnxX^^HyK zsz1R$j8KEj4ZAz*eNAv^snnG6Ncudl(UwD;b2bmw4XMORP9P{bHlYro@m74RCn0kL zydyU;nPZ439Cg`06p3`UkA>Jq?6YYn^uXQKLMquDY^B*~mRxZ-1W!1ajhc@Y* zs)xR}>o(NN_A9%+(_$Ii*E_?W8)|*+rb-p zB3=w@sIRwcbdEP$>NIU;2Q|99dS<%UBmNcdo|}?N5nIaO&V_Rq&MsqdvcI+>;?zrT zx1HcyW!|j5Imuv-rxlG=dQ*Mp)!nV$Q_FQ?`kpC!XN%Yg+i$3+2DV!HUT@nO=8N7- zriCgKf1b)g;oMWRT(EFqgI<7}M$0#+T@7Wlym;mO=F4Z6FHUiY(CVWN)n7i`;cSXW z+dS^A@uI&HU21)GaAjg=m(^f)`QS<-4I7 zs%JM^xMX^KCTLVct&S~F1I*8KDbhu^w@Keinh@b z&3?&rH~XDLjy}Zz#=@LrxAC-)$)`-~@o}ftW#4Yld6e_nDZc&~^d4b=Z<>3`I%tRf>9scJQedo z3(kHIMagij6ArF0VoB!mo7aah*c8ikfFZgb3--3Xpq_IO!56e6QbTv~=E zXGPWKs?<{mmGH#Vt{}shCFVnChkOn_+e(jBBTReixbjivt&q}2&ZiXik>t{0k{&6~ z1%1p}jmLd8=Od95nit*=lUNsCTE;Angt1s(x@qIa^$Cf(1Rdh;#xHU)AHL+AAT5sB zYs{Ho#$CB#%`v}N)YTNxS#+%OSKEe>@2sORUslxBU)!2;1KWd!0X?Bel m73B>rjlHx=%QNxL1`-$-PS}moveXqb7miASb}fw+(f\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Polish\n" +"X-Poedit-Country: POLAND\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Szkielet Aplikacji" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Strona startowa" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Wszelkie prawa zastrzeżone." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Witaj w %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Gratulacje! Z powodzeniem zainstalowałeś %sZF2 Skeleton Application%s. Aktualnie używasz Zend Framework w wersji %s. Ten szkielet może służyć jak prosty punkt startowy do budowy Twoich aplikacji na ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Forkuj Zend Framework 2 na GitHub'e" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Śledź prace programistyczne" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 jest w trakcie aktywnych prac programistycznych. Jeśli jesteś zainteresowany śledzeniem jego rozwoju, istnieje specialny portal ZF2 na oficjalnej stronie Zend Framework na którym dostępne są linki do ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, oraz wiele więcej. Jest to świetne miejsce by śledzić najnowsze zmiany!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Development Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Odkryj Moduły" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Społeczność pracuje nad stworzeniem społecznościowego serwisu który posłuży jako repozytorium i galeria dla modułów ZF2. Projekt wkrótce będzie dostępny na %son GitHub%s. Ta strona jest aktualnie online i udostępnia listę niektórych modułów dostępnych dla ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Odkryj Moduły ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Pomoc & Wsparcie" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Jeśli potrzebujesz jakiejkolwiek pomocy lub wsparcia podczas programowania na ZF2, możesz skontaktować się z nami via IRC: %s#zftalk.2 w sieci Freenode%s. Z przyjemnością wysłuchamy wszelkich pytań lub sugestii które możesz mieć odnoście wydań beta. Alternatywnie, możesz zapisać się i wysłać pytanie na %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Wyślij nam wiadomość na IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Wystąpił błąd" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Dodatkowe informacje" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Plik" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Komunikat" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stack trace" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Poprzedni wyjątek" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Brak dostępnego wyjątku" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Wystąpił błąd 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Żądany kontroler nie mógł zmapować żądania." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Żądany kontroler nie mógł być zmapowany na isteniejącą klasę kontrolera." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Żądany kontroler nie mógł zostać zmapowany." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Żądany adres URL nie mógł zostać powiązany z routing'iem." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nie możemy określić tym razem dlaczego wygenerowano błąd 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Kontroler" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "rozwiązuje na %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Wyjątek" + diff --git a/module/Application/language/tr_TR.mo b/module/Application/language/tr_TR.mo new file mode 100644 index 0000000000000000000000000000000000000000..952882142e8f6f0863f0fb0c08efdf31590512d3 GIT binary patch literal 4785 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\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Turkish\n" +"X-Poedit-Country: TURKEY\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Anasayfa" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tüm haklar saklıdır." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "%sZend Framework 2%s'a hoş geldiniz" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Tebrikler! %sZF2 Skeleton Application%s'u başarıyla yüklediniz. Şu anda Zend Framework %s sürüm ile çalışıyorsunuz. Bu iskelet ZF2 üzerinde uygulama oluşturmak için basit bir başlangıç ​​noktası olarak hizmet verebilir." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Zend Framework 2'yi GitHub'da fork edin" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Gelişimi izleyin" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 aktif geliştirilmektedir. Eğer ZF2'nin gelişimi ile ilgileniyorsanız, ZF2 için resmi Zend Framework websitesinde özel portal mevcut, orada ZF2 %swiki%s'ye, %sDEV blog%s'a, %ssorun takibi%s'ne bağlantılarını ve çok daha fazlasını sunar. Bu son gelişmeler ile güncel kalmak için büyük bir kaynaktır!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Development Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Modülleri keşfedin" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Topluluk ZF2 modülleri için bir depo ve galeri olarak hizmet edecek bir topluluk sitesi geliştirme üzerinde çalışıyor. Proje %sGitHub%s'da mevcut. Site şu anda canlı ve ZF2 için bazı mevcut modüllerin listesini içerir." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "ZF2 Modüllerini keşfedin" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Yardım & Destek" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "ZF2 ile geliştirirken herhangi yardım veya desteğe ihtiyacınız varsa, bize IRC: %sFreenode #zftalk.2%s üzerinden ulaşabilirsiniz. Beta sürümleri ile ilgili olabilecek herhangi bir sorunuzu ya da yorumlarınızı duymak isteriz. Alternatif olarak %smailing listelerine%s abone olup sorularınızı sorabilirsiniz." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "IRC bizi pingleyin" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "An error occurred" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Ek bilgiler" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Klasör" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Mesaj" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Denetleyici" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Önceki istisnalar" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "İstisna yok" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Bir 404 hatası oluştu" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Talep edilen denetleyici işlemi işlemesi mümkün değildir." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Talep edilen denetleyiciye uygun denetleyici sınıfı tahsis edilemedi." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Talep edilen denetleyici çağrılabilir değildir." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "İstenen URL yönlendirmede tahsis edilemedi" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Neden 404 hatasının oluştuğunu şu an belirleyemiyoruz." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Denetleyici" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "Buraya çözümlenir: %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "İstisna" + diff --git a/module/Application/src/Application/Controller/IndexController.php b/module/Application/src/Application/Controller/IndexController.php new file mode 100644 index 00000000..a1aafaee --- /dev/null +++ b/module/Application/src/Application/Controller/IndexController.php @@ -0,0 +1,21 @@ + +

translate('Welcome to %sZend Framework 2%s'), '', '') ?>

+
+

translate('Fork Zend Framework 2 on GitHub') ?> »

+

translate('Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2.'), '', '', \Zend\Version\Version::VERSION) ?>

+ +
+ +
+

translate('Follow Development') ?>

+

translate('Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!'), '', '', '', '', '', '') ?>

+

translate('ZF2 Development Portal') ?> »

+
+ +
+

translate('Discover Modules') ?>

+

translate('The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2.'), '', '') ?>

+

translate('Explore ZF2 Modules') ?> »

+
+ +
+

translate('Help & Support') ?>

+

translate('If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We\'d love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s.'), '', '', '', '') ?>

+

translate('Ping us on IRC') ?> »

+
+
diff --git a/module/Application/view/error/404.phtml b/module/Application/view/error/404.phtml new file mode 100644 index 00000000..3edd37a8 --- /dev/null +++ b/module/Application/view/error/404.phtml @@ -0,0 +1,61 @@ +

translate('A 404 error occurred') ?>

+

message ?>

+ +reason) && $this->reason): ?> + +reason) { + case 'error-controller-cannot-dispatch': + $reasonMessage = $this->translate('The requested controller was unable to dispatch the request.'); + break; + case 'error-controller-not-found': + $reasonMessage = $this->translate('The requested controller could not be mapped to an existing controller class.'); + break; + case 'error-controller-invalid': + $reasonMessage = $this->translate('The requested controller was not dispatchable.'); + break; + case 'error-router-no-match': + $reasonMessage = $this->translate('The requested URL could not be matched by routing.'); + break; + default: + $reasonMessage = $this->translate('We cannot determine at this time why a 404 was generated.'); + break; +} +?> + +

+ + + +controller) && $this->controller): ?> + +
+
translate('Controller') ?>:
+
escapeHtml($this->controller) ?> +controller_class) + && $this->controller_class + && $this->controller_class != $this->controller +) { + echo '(' . sprintf($this->translate('resolves to %s'), $this->escapeHtml($this->controller_class)) . ')'; +} +?> +
+
+ + + +exception) && $this->exception): ?> + +

translate('Exception') ?>:

+ +

escapeHtml($this->exception->getMessage()) ?>

+ +

translate('Stack trace') ?>:

+ +
+exception->getTraceAsString() ?>
+
+ + diff --git a/module/Application/view/error/index.phtml b/module/Application/view/error/index.phtml new file mode 100644 index 00000000..5165cd8e --- /dev/null +++ b/module/Application/view/error/index.phtml @@ -0,0 +1,62 @@ +

translate('An error occurred') ?>

+

message ?>

+ +display_exceptions) && $this->display_exceptions): ?> + +exception) && $this->exception instanceof Exception): ?> +
+

translate('Additional information') ?>:

+

exception); ?>

+
+
translate('File') ?>:
+
+
exception->getFile() ?>:exception->getLine() ?>
+
+
translate('Message') ?>:
+
+
exception->getMessage() ?>
+
+
translate('Stack trace') ?>:
+
+
exception->getTraceAsString() ?>
+
+
+exception->getPrevious(); + if ($e) : +?> +
+

translate('Previous exceptions') ?>:

+
    + +
  • +

    +
    +
    translate('File') ?>:
    +
    +
    getFile() ?>:getLine() ?>
    +
    +
    translate('Message') ?>:
    +
    +
    getMessage() ?>
    +
    +
    translate('Stack trace') ?>:
    +
    +
    getTraceAsString() ?>
    +
    +
    +
  • + getPrevious(); + endwhile; + ?> +
+ + + + +

translate('No Exception available') ?>

+ + + + diff --git a/module/Application/view/layout/layout.phtml b/module/Application/view/layout/layout.phtml new file mode 100644 index 00000000..d5af45f6 --- /dev/null +++ b/module/Application/view/layout/layout.phtml @@ -0,0 +1,57 @@ +doctype(); ?> + + + + + headTitle('ZF2 '. $this->translate('Skeleton Application'))->setSeparator(' - ')->setAutoEscape(false) ?> + + headMeta()->appendName('viewport', 'width=device-width, initial-scale=1.0') ?> + + + headLink(array('rel' => 'shortcut icon', 'type' => 'image/vnd.microsoft.icon', 'href' => $this->basePath() . '/images/favicon.ico')) + ->prependStylesheet($this->basePath() . '/css/bootstrap-responsive.min.css') + ->prependStylesheet($this->basePath() . '/css/style.css') + ->prependStylesheet($this->basePath() . '/css/bootstrap.min.css') ?> + + + headScript()->prependFile($this->basePath() . '/js/html5.js', 'text/javascript', array('conditional' => 'lt IE 9',)) + ->prependFile($this->basePath() . '/js/jquery-1.7.2.min.js') ?> + + + + + + + +
+ + content; ?> + +
+ +
+

© 2005 - 2012 by Zend Technologies Ltd. translate('All rights reserved.') ?>

+
+ +
+ + inlineScript() ?> + + diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 00000000..10d71d77 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,7 @@ +RewriteEngine On +RewriteCond %{REQUEST_FILENAME} -s [OR] +RewriteCond %{REQUEST_FILENAME} -l [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteBase /fmi +RewriteRule ^.*$ - [NC,L] +RewriteRule ^.*$ index.php [NC,L] diff --git a/public/css/bootstrap-responsive.min.css b/public/css/bootstrap-responsive.min.css new file mode 100644 index 00000000..bc3f2ab7 --- /dev/null +++ b/public/css/bootstrap-responsive.min.css @@ -0,0 +1,3 @@ + +.hidden{display:none;visibility:hidden;} +@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:768px){.container{width:auto;padding:0 20px;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;}}@media (min-width:768px) and (max-width:980px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .span1{width:42px;} .span2{width:104px;} .span3{width:166px;} .span4{width:228px;} .span5{width:290px;} .span6{width:352px;} .span7{width:414px;} .span8{width:476px;} .span9{width:538px;} .span10{width:600px;} .span11{width:662px;} .span12,.container{width:724px;} .offset1{margin-left:82px;} .offset2{margin-left:144px;} .offset3{margin-left:206px;} .offset4{margin-left:268px;} .offset5{margin-left:330px;} .offset6{margin-left:392px;} .offset7{margin-left:454px;} .offset8{margin-left:516px;} .offset9{margin-left:578px;} .offset10{margin-left:640px;} .offset11{margin-left:702px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.801104972%;} .row-fluid .span2{width:14.364640883%;} .row-fluid .span3{width:22.928176794%;} .row-fluid .span4{width:31.491712705%;} .row-fluid .span5{width:40.055248616%;} .row-fluid .span6{width:48.618784527%;} .row-fluid .span7{width:57.182320438000005%;} .row-fluid .span8{width:65.74585634900001%;} .row-fluid .span9{width:74.30939226%;} .row-fluid .span10{width:82.87292817100001%;} .row-fluid .span11{width:91.436464082%;} .row-fluid .span12{width:99.999999993%;} input.span1,textarea.span1,.uneditable-input.span1{width:32px;} input.span2,textarea.span2,.uneditable-input.span2{width:94px;} input.span3,textarea.span3,.uneditable-input.span3{width:156px;} input.span4,textarea.span4,.uneditable-input.span4{width:218px;} input.span5,textarea.span5,.uneditable-input.span5{width:280px;} input.span6,textarea.span6,.uneditable-input.span6{width:342px;} input.span7,textarea.span7,.uneditable-input.span7{width:404px;} input.span8,textarea.span8,.uneditable-input.span8{width:466px;} input.span9,textarea.span9,.uneditable-input.span9{width:528px;} input.span10,textarea.span10,.uneditable-input.span10{width:590px;} input.span11,textarea.span11,.uneditable-input.span11{width:652px;} input.span12,textarea.span12,.uneditable-input.span12{width:714px;}}@media (max-width:980px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .span1{width:70px;} .span2{width:170px;} .span3{width:270px;} .span4{width:370px;} .span5{width:470px;} .span6{width:570px;} .span7{width:670px;} .span8{width:770px;} .span9{width:870px;} .span10{width:970px;} .span11{width:1070px;} .span12,.container{width:1170px;} .offset1{margin-left:130px;} .offset2{margin-left:230px;} .offset3{margin-left:330px;} .offset4{margin-left:430px;} .offset5{margin-left:530px;} .offset6{margin-left:630px;} .offset7{margin-left:730px;} .offset8{margin-left:830px;} .offset9{margin-left:930px;} .offset10{margin-left:1030px;} .offset11{margin-left:1130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.982905983%;} .row-fluid .span2{width:14.529914530000001%;} .row-fluid .span3{width:23.076923077%;} .row-fluid .span4{width:31.623931624%;} .row-fluid .span5{width:40.170940171000005%;} .row-fluid .span6{width:48.717948718%;} .row-fluid .span7{width:57.264957265%;} .row-fluid .span8{width:65.81196581200001%;} .row-fluid .span9{width:74.358974359%;} .row-fluid .span10{width:82.905982906%;} .row-fluid .span11{width:91.45299145300001%;} .row-fluid .span12{width:100%;} input.span1,textarea.span1,.uneditable-input.span1{width:60px;} input.span2,textarea.span2,.uneditable-input.span2{width:160px;} input.span3,textarea.span3,.uneditable-input.span3{width:260px;} input.span4,textarea.span4,.uneditable-input.span4{width:360px;} input.span5,textarea.span5,.uneditable-input.span5{width:460px;} input.span6,textarea.span6,.uneditable-input.span6{width:560px;} input.span7,textarea.span7,.uneditable-input.span7{width:660px;} input.span8,textarea.span8,.uneditable-input.span8{width:760px;} input.span9,textarea.span9,.uneditable-input.span9{width:860px;} input.span10,textarea.span10,.uneditable-input.span10{width:960px;} input.span11,textarea.span11,.uneditable-input.span11{width:1060px;} input.span12,textarea.span12,.uneditable-input.span12{width:1160px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}} diff --git a/public/css/bootstrap.min.css b/public/css/bootstrap.min.css new file mode 100644 index 00000000..b01f92e6 --- /dev/null +++ b/public/css/bootstrap.min.css @@ -0,0 +1,610 @@ +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} +audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} +audio:not([controls]){display:none;} +html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} +a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +a:hover,a:active{outline:0;} +sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} +sup{top:-0.5em;} +sub{bottom:-0.25em;} +img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;} +button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} +button,input{*overflow:visible;line-height:normal;} +button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} +button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} +input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} +input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} +textarea{overflow:auto;vertical-align:top;} +body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;} +a{color:#0088cc;text-decoration:none;} +a:hover{color:#005580;text-decoration:underline;} +.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} +.row:after{clear:both;} +[class*="span"]{float:left;margin-left:20px;} +.span1{width:60px;} +.span2{width:140px;} +.span3{width:220px;} +.span4{width:300px;} +.span5{width:380px;} +.span6{width:460px;} +.span7{width:540px;} +.span8{width:620px;} +.span9{width:700px;} +.span10{width:780px;} +.span11{width:860px;} +.span12,.container{width:940px;} +.offset1{margin-left:100px;} +.offset2{margin-left:180px;} +.offset3{margin-left:260px;} +.offset4{margin-left:340px;} +.offset5{margin-left:420px;} +.offset6{margin-left:500px;} +.offset7{margin-left:580px;} +.offset8{margin-left:660px;} +.offset9{margin-left:740px;} +.offset10{margin-left:820px;} +.offset11{margin-left:900px;} +.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} +.row-fluid:after{clear:both;} +.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;} +.row-fluid>[class*="span"]:first-child{margin-left:0;} +.row-fluid .span1{width:6.382978723%;} +.row-fluid .span2{width:14.89361702%;} +.row-fluid .span3{width:23.404255317%;} +.row-fluid .span4{width:31.914893614%;} +.row-fluid .span5{width:40.425531911%;} +.row-fluid .span6{width:48.93617020799999%;} +.row-fluid .span7{width:57.446808505%;} +.row-fluid .span8{width:65.95744680199999%;} +.row-fluid .span9{width:74.468085099%;} +.row-fluid .span10{width:82.97872339599999%;} +.row-fluid .span11{width:91.489361693%;} +.row-fluid .span12{width:99.99999998999999%;} +.container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";} +.container:after{clear:both;} +.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";} +.container-fluid:after{clear:both;} +p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;} +.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;} +h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;} +h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;} +h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;} +h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;} +h4,h5,h6{line-height:18px;} +h4{font-size:14px;}h4 small{font-size:12px;} +h5{font-size:12px;} +h6{font-size:11px;color:#999999;text-transform:uppercase;} +.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;} +.page-header h1{line-height:1;} +ul,ol{padding:0;margin:0 0 9px 25px;} +ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} +ul{list-style:disc;} +ol{list-style:decimal;} +li{line-height:18px;} +ul.unstyled{margin-left:0;list-style:none;} +dl{margin-bottom:18px;} +dt,dd{line-height:18px;} +dt{font-weight:bold;} +dd{margin-left:9px;} +hr{margin:18px 0;border:0;border-top:1px solid #e5e5e5;border-bottom:1px solid #ffffff;} +strong{font-weight:bold;} +em{font-style:italic;} +.muted{color:#999999;} +abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;} +blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;} +blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} +blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} +q:before,q:after,blockquote:before,blockquote:after{content:"";} +address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;} +small{font-size:100%;} +cite{font-style:normal;} +code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} +pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;}pre.prettyprint{margin-bottom:18px;} +pre code{padding:0;background-color:transparent;} +form{margin:0 0 18px;} +fieldset{padding:0;margin:0;border:0;} +legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;} +label,input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;} +label{display:block;margin-bottom:5px;color:#333333;} +input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.uneditable-textarea{width:auto;height:auto;} +label input,label textarea,label select{display:block;} +input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:0;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +input[type="file"]{padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;} +select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;} +select{width:220px;background-color:#ffffff;} +select[multiple],select[size]{height:auto;} +input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +textarea{height:auto;} +input[type="hidden"]{display:none;} +.radio,.checkbox{padding-left:18px;} +.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;} +.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} +.radio.inline,.checkbox.inline{display:inline-block;margin-bottom:0;vertical-align:middle;} +.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} +.controls>.radio.inline:first-child,.controls>.checkbox.inline:first-child{padding-top:0;} +input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;} +input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;} +input[type="file"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.input-mini{width:60px;} +.input-small{width:90px;} +.input-medium{width:150px;} +.input-large{width:210px;} +.input-xlarge{width:270px;} +.input-xxlarge{width:530px;} +input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;} +input.span1,textarea.span1,.uneditable-input.span1{width:50px;} +input.span2,textarea.span2,.uneditable-input.span2{width:130px;} +input.span3,textarea.span3,.uneditable-input.span3{width:210px;} +input.span4,textarea.span4,.uneditable-input.span4{width:290px;} +input.span5,textarea.span5,.uneditable-input.span5{width:370px;} +input.span6,textarea.span6,.uneditable-input.span6{width:450px;} +input.span7,textarea.span7,.uneditable-input.span7{width:530px;} +input.span8,textarea.span8,.uneditable-input.span8{width:610px;} +input.span9,textarea.span9,.uneditable-input.span9{width:690px;} +input.span10,textarea.span10,.uneditable-input.span10{width:770px;} +input.span11,textarea.span11,.uneditable-input.span11{width:850px;} +input.span12,textarea.span12,.uneditable-input.span12{width:930px;} +input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;} +.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} +.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;} +.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} +.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} +.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;} +.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} +.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} +.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;} +.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} +input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} +.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;} +.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} +:-moz-placeholder{color:#999999;} +::-webkit-input-placeholder{color:#999999;} +.help-block{margin-top:5px;margin-bottom:0;color:#999999;} +.help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;} +.input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";} +.input-prepend:after,.input-append:after{clear:both;} +.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;} +.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;} +.input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;} +.input-prepend .add-on{*margin-top:1px;} +.input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-append .uneditable-input{border-right-color:#ccc;} +.input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;} +.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;} +.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input{display:inline-block;margin-bottom:0;} +.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;} +.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;} +.control-group{margin-bottom:9px;} +.form-horizontal legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;} +.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";} +.form-horizontal .control-group:after{clear:both;} +.form-horizontal .control-group>label{float:left;width:140px;padding-top:5px;text-align:right;} +.form-horizontal .controls{margin-left:160px;} +.form-horizontal .form-actions{padding-left:160px;} +table{max-width:100%;border-collapse:collapse;border-spacing:0;} +.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;border-top:1px solid #ddd;} +.table th{font-weight:bold;vertical-align:bottom;} +.table td{vertical-align:top;} +.table thead:first-child tr th,.table thead:first-child tr td{border-top:0;} +.table tbody+tbody{border-top:2px solid #ddd;} +.table-condensed th,.table-condensed td{padding:4px 5px;} +.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;} +.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} +.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;} +.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;} +.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;} +.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;} +.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} +table .span1{float:none;width:44px;margin-left:0;} +table .span2{float:none;width:124px;margin-left:0;} +table .span3{float:none;width:204px;margin-left:0;} +table .span4{float:none;width:284px;margin-left:0;} +table .span5{float:none;width:364px;margin-left:0;} +table .span6{float:none;width:444px;margin-left:0;} +table .span7{float:none;width:524px;margin-left:0;} +table .span8{float:none;width:604px;margin-left:0;} +table .span9{float:none;width:684px;margin-left:0;} +table .span10{float:none;width:764px;margin-left:0;} +table .span11{float:none;width:844px;margin-left:0;} +table .span12{float:none;width:924px;margin-left:0;} +[class^="icon-"]{display:inline-block;width:14px;height:14px;vertical-align:text-top;background-image:url(../img/glyphicons-halflings.png);background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child{*margin-left:0;} +.icon-white{background-image:url(../img/glyphicons-halflings-white.png);} +.icon-glass{background-position:0 0;} +.icon-music{background-position:-24px 0;} +.icon-search{background-position:-48px 0;} +.icon-envelope{background-position:-72px 0;} +.icon-heart{background-position:-96px 0;} +.icon-star{background-position:-120px 0;} +.icon-star-empty{background-position:-144px 0;} +.icon-user{background-position:-168px 0;} +.icon-film{background-position:-192px 0;} +.icon-th-large{background-position:-216px 0;} +.icon-th{background-position:-240px 0;} +.icon-th-list{background-position:-264px 0;} +.icon-ok{background-position:-288px 0;} +.icon-remove{background-position:-312px 0;} +.icon-zoom-in{background-position:-336px 0;} +.icon-zoom-out{background-position:-360px 0;} +.icon-off{background-position:-384px 0;} +.icon-signal{background-position:-408px 0;} +.icon-cog{background-position:-432px 0;} +.icon-trash{background-position:-456px 0;} +.icon-home{background-position:0 -24px;} +.icon-file{background-position:-24px -24px;} +.icon-time{background-position:-48px -24px;} +.icon-road{background-position:-72px -24px;} +.icon-download-alt{background-position:-96px -24px;} +.icon-download{background-position:-120px -24px;} +.icon-upload{background-position:-144px -24px;} +.icon-inbox{background-position:-168px -24px;} +.icon-play-circle{background-position:-192px -24px;} +.icon-repeat{background-position:-216px -24px;} +.icon-refresh{background-position:-240px -24px;} +.icon-list-alt{background-position:-264px -24px;} +.icon-lock{background-position:-287px -24px;} +.icon-flag{background-position:-312px -24px;} +.icon-headphones{background-position:-336px -24px;} +.icon-volume-off{background-position:-360px -24px;} +.icon-volume-down{background-position:-384px -24px;} +.icon-volume-up{background-position:-408px -24px;} +.icon-qrcode{background-position:-432px -24px;} +.icon-barcode{background-position:-456px -24px;} +.icon-tag{background-position:0 -48px;} +.icon-tags{background-position:-25px -48px;} +.icon-book{background-position:-48px -48px;} +.icon-bookmark{background-position:-72px -48px;} +.icon-print{background-position:-96px -48px;} +.icon-camera{background-position:-120px -48px;} +.icon-font{background-position:-144px -48px;} +.icon-bold{background-position:-167px -48px;} +.icon-italic{background-position:-192px -48px;} +.icon-text-height{background-position:-216px -48px;} +.icon-text-width{background-position:-240px -48px;} +.icon-align-left{background-position:-264px -48px;} +.icon-align-center{background-position:-288px -48px;} +.icon-align-right{background-position:-312px -48px;} +.icon-align-justify{background-position:-336px -48px;} +.icon-list{background-position:-360px -48px;} +.icon-indent-left{background-position:-384px -48px;} +.icon-indent-right{background-position:-408px -48px;} +.icon-facetime-video{background-position:-432px -48px;} +.icon-picture{background-position:-456px -48px;} +.icon-pencil{background-position:0 -72px;} +.icon-map-marker{background-position:-24px -72px;} +.icon-adjust{background-position:-48px -72px;} +.icon-tint{background-position:-72px -72px;} +.icon-edit{background-position:-96px -72px;} +.icon-share{background-position:-120px -72px;} +.icon-check{background-position:-144px -72px;} +.icon-move{background-position:-168px -72px;} +.icon-step-backward{background-position:-192px -72px;} +.icon-fast-backward{background-position:-216px -72px;} +.icon-backward{background-position:-240px -72px;} +.icon-play{background-position:-264px -72px;} +.icon-pause{background-position:-288px -72px;} +.icon-stop{background-position:-312px -72px;} +.icon-forward{background-position:-336px -72px;} +.icon-fast-forward{background-position:-360px -72px;} +.icon-step-forward{background-position:-384px -72px;} +.icon-eject{background-position:-408px -72px;} +.icon-chevron-left{background-position:-432px -72px;} +.icon-chevron-right{background-position:-456px -72px;} +.icon-plus-sign{background-position:0 -96px;} +.icon-minus-sign{background-position:-24px -96px;} +.icon-remove-sign{background-position:-48px -96px;} +.icon-ok-sign{background-position:-72px -96px;} +.icon-question-sign{background-position:-96px -96px;} +.icon-info-sign{background-position:-120px -96px;} +.icon-screenshot{background-position:-144px -96px;} +.icon-remove-circle{background-position:-168px -96px;} +.icon-ok-circle{background-position:-192px -96px;} +.icon-ban-circle{background-position:-216px -96px;} +.icon-arrow-left{background-position:-240px -96px;} +.icon-arrow-right{background-position:-264px -96px;} +.icon-arrow-up{background-position:-289px -96px;} +.icon-arrow-down{background-position:-312px -96px;} +.icon-share-alt{background-position:-336px -96px;} +.icon-resize-full{background-position:-360px -96px;} +.icon-resize-small{background-position:-384px -96px;} +.icon-plus{background-position:-408px -96px;} +.icon-minus{background-position:-433px -96px;} +.icon-asterisk{background-position:-456px -96px;} +.icon-exclamation-sign{background-position:0 -120px;} +.icon-gift{background-position:-24px -120px;} +.icon-leaf{background-position:-48px -120px;} +.icon-fire{background-position:-72px -120px;} +.icon-eye-open{background-position:-96px -120px;} +.icon-eye-close{background-position:-120px -120px;} +.icon-warning-sign{background-position:-144px -120px;} +.icon-plane{background-position:-168px -120px;} +.icon-calendar{background-position:-192px -120px;} +.icon-random{background-position:-216px -120px;} +.icon-comment{background-position:-240px -120px;} +.icon-magnet{background-position:-264px -120px;} +.icon-chevron-up{background-position:-288px -120px;} +.icon-chevron-down{background-position:-313px -119px;} +.icon-retweet{background-position:-336px -120px;} +.icon-shopping-cart{background-position:-360px -120px;} +.icon-folder-close{background-position:-384px -120px;} +.icon-folder-open{background-position:-408px -120px;} +.icon-resize-vertical{background-position:-432px -119px;} +.icon-resize-horizontal{background-position:-456px -118px;} +.dropdown{position:relative;} +.dropdown-toggle{*margin-bottom:-3px;} +.dropdown-toggle:active,.open .dropdown-toggle{outline:0;} +.caret{display:inline-block;width:0;height:0;text-indent:-99999px;*text-indent:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"\2193";} +.dropdown .caret{margin-top:8px;margin-left:2px;} +.dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);} +.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;max-width:220px;_width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.bottom-up{top:auto;bottom:100%;margin-bottom:2px;} +.dropdown-menu .divider{height:1px;margin:5px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;} +.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#555555;white-space:nowrap;} +.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;} +.dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);} +.dropdown.open .dropdown-menu{display:block;} +.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} +.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;} +.collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;} +.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;} +.btn{display:inline-block;padding:4px 10px 4px;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#fafafa;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;*margin-left:.3em;}.btn:first-child{*margin-left:0;} +.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} +.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;color:rgba(0, 0, 0, 0.5);outline:0;} +.btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.btn-large .icon{margin-top:1px;} +.btn-small{padding:5px 9px;font-size:11px;line-height:16px;} +.btn-small .icon{margin-top:-1px;} +.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;} +.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active{color:rgba(255, 255, 255, 0.75);} +.btn-primary{background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-ms-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(top, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0044cc;} +.btn-primary:active,.btn-primary.active{background-color:#003399 \9;} +.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;} +.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} +.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;} +.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} +.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;} +.btn-success:active,.btn-success.active{background-color:#408140 \9;} +.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;} +.btn-info:active,.btn-info.active{background-color:#24748c \9;} +button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} +button.btn.large,input[type="submit"].btn.large{*padding-top:7px;*padding-bottom:7px;} +button.btn.small,input[type="submit"].btn.small{*padding-top:3px;*padding-bottom:3px;} +.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";} +.btn-group:after{clear:both;} +.btn-group:first-child{*margin-left:0;} +.btn-group+.btn-group{margin-left:5px;} +.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;} +.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} +.btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} +.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} +.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;} +.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} +.btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:5px;*padding-bottom:5px;} +.btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);} +.btn .caret{margin-top:7px;margin-left:0;} +.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);} +.btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret{border-top-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);} +.btn-small .caret{margin-top:4px;} +.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.alert,.alert-heading{color:#c09853;} +.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;} +.alert-success{background-color:#dff0d8;border-color:#d6e9c6;} +.alert-success,.alert-success .alert-heading{color:#468847;} +.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;} +.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading{color:#b94a48;} +.alert-info{background-color:#d9edf7;border-color:#bce8f1;} +.alert-info,.alert-info .alert-heading{color:#3a87ad;} +.alert-block{padding-top:14px;padding-bottom:14px;} +.alert-block>p,.alert-block>ul{margin-bottom:0;} +.alert-block p+p{margin-top:5px;} +.nav{margin-left:0;margin-bottom:18px;list-style:none;} +.nav>li>a{display:block;} +.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} +.nav-list{padding-left:14px;padding-right:14px;margin-bottom:0;} +.nav-list>li>a,.nav-list .nav-header{display:block;padding:3px 15px;margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} +.nav-list .nav-header{font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-transform:uppercase;} +.nav-list>li+.nav-header{margin-top:9px;} +.nav-list .active>a,.nav-list .active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} +.nav-list [class^="icon-"]{margin-right:2px;} +.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";} +.nav-tabs:after,.nav-pills:after{clear:both;} +.nav-tabs>li,.nav-pills>li{float:left;} +.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} +.nav-tabs{border-bottom:1px solid #ddd;} +.nav-tabs>li{margin-bottom:-1px;} +.nav-tabs>li>a{padding-top:9px;padding-bottom:9px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} +.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} +.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.nav-pills .active>a,.nav-pills .active>a:hover{color:#ffffff;background-color:#0088cc;} +.nav-stacked>li{float:none;} +.nav-stacked>li>a{margin-right:0;} +.nav-tabs.nav-stacked{border-bottom:0;} +.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} +.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} +.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} +.nav-pills.nav-stacked>li>a{margin-bottom:3px;} +.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} +.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;} +.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;margin-top:6px;} +.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;} +.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;} +.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;} +.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} +.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;opacity:1;filter:alpha(opacity=100);} +.tabs-stacked .open>a:hover{border-color:#999999;} +.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";} +.tabbable:after{clear:both;} +.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;} +.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} +.tab-content>.active,.pill-content>.active{display:block;} +.tabs-below .nav-tabs{border-top:1px solid #ddd;} +.tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;} +.tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} +.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;} +.tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;} +.tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} +.tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} +.tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} +.tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} +.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} +.tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} +.tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} +.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} +.navbar{overflow:visible;margin-bottom:18px;} +.navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);} +.btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;} +.btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;} +.btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} +.btn-navbar .icon-bar+.icon-bar{margin-top:3px;} +.nav-collapse.collapse{height:auto;} +.navbar .brand:hover{text-decoration:none;} +.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;} +.navbar .navbar-text{margin-bottom:0;line-height:40px;color:#999999;}.navbar .navbar-text a:hover{color:#ffffff;background-color:transparent;} +.navbar .btn,.navbar .btn-group{margin-top:5px;} +.navbar .btn-group .btn{margin-top:0;} +.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";} +.navbar-form:after{clear:both;} +.navbar-form input,.navbar-form select{display:inline-block;margin-top:5px;margin-bottom:0;} +.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} +.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} +.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;color:rgba(255, 255, 255, 0.75);background:#666;background:rgba(255, 255, 255, 0.3);border:1px solid #111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query :-moz-placeholder{color:#eeeeee;} +.navbar-search .search-query::-webkit-input-placeholder{color:#eeeeee;} +.navbar-search .search-query:hover{color:#ffffff;background-color:#999999;background-color:rgba(255, 255, 255, 0.5);} +.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} +.navbar-fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030;} +.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} +.navbar .nav.pull-right{float:right;} +.navbar .nav>li{display:block;float:left;} +.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} +.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;} +.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;background-color:rgba(0, 0, 0, 0.5);} +.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;} +.navbar .nav.pull-right{margin-left:10px;margin-right:0;} +.navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} +.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} +.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;} +.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);} +.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;} +.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;} +.navbar .nav.pull-right .dropdown-menu{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before{left:auto;right:12px;} +.navbar .nav.pull-right .dropdown-menu:after{left:auto;right:13px;} +.breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;} +.breadcrumb .divider{padding:0 5px;color:#999999;} +.breadcrumb .active a{color:#333333;} +.pagination{height:36px;margin:18px 0;} +.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} +.pagination li{display:inline;} +.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;} +.pagination a:hover,.pagination .active a{background-color:#f5f5f5;} +.pagination .active a{color:#999999;cursor:default;} +.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;} +.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.pagination-centered{text-align:center;} +.pagination-right{text-align:right;} +.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";} +.pager:after{clear:both;} +.pager li{display:inline;} +.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} +.pager a:hover{text-decoration:none;background-color:#f5f5f5;} +.pager .next a{float:right;} +.pager .previous a{float:left;} +.modal-open .dropdown-menu{z-index:2050;} +.modal-open .dropdown.open{*z-index:2050;} +.modal-open .popover{z-index:2060;} +.modal-open .tooltip{z-index:2070;} +.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} +.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} +.modal{position:fixed;top:50%;left:50%;z-index:1050;max-height:500px;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} +.modal.fade.in{top:50%;} +.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} +.modal-body{padding:15px;} +.modal-footer{padding:14px 15px 15px;margin-bottom:0;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";} +.modal-footer:after{clear:both;} +.modal-footer .btn{float:right;margin-left:5px;margin-bottom:0;} +.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} +.tooltip.top{margin-top:-2px;} +.tooltip.right{margin-left:2px;} +.tooltip.bottom{margin-top:2px;} +.tooltip.left{margin-left:-2px;} +.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.tooltip-arrow{position:absolute;width:0;height:0;} +.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;} +.popover.right{margin-left:5px;} +.popover.bottom{margin-top:5px;} +.popover.left{margin-left:-5px;} +.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.popover .arrow{position:absolute;width:0;height:0;} +.popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);} +.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;} +.popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;} +.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";} +.thumbnails:after{clear:both;} +.thumbnails>li{float:left;margin:0 0 18px 20px;} +.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);} +a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} +.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} +.thumbnail .caption{padding:9px;} +.label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.label-important{background-color:#b94a48;} +.label-warning{background-color:#f89406;} +.label-success{background-color:#468847;} +.label-info{background-color:#3a87ad;} +@-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} +.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} +.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} +.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);} +.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);} +.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);} +.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.accordion{margin-bottom:18px;} +.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.accordion-heading{border-bottom:0;} +.accordion-heading .accordion-toggle{display:block;padding:8px 15px;} +.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} +.carousel{position:relative;margin-bottom:18px;line-height:1;} +.carousel-inner{overflow:hidden;width:100%;position:relative;} +.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;} +.carousel .item>img{display:block;line-height:1;} +.carousel .active,.carousel .next,.carousel .prev{display:block;} +.carousel .active{left:0;} +.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;} +.carousel .next{left:100%;} +.carousel .prev{left:-100%;} +.carousel .next.left,.carousel .prev.right{left:0;} +.carousel .active.left{left:-100%;} +.carousel .active.right{left:100%;} +.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} +.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} +.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);} +.carousel-caption h4,.carousel-caption p{color:#ffffff;} +.hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;} +.hero-unit p{font-size:18px;font-weight:200;line-height:27px;} +.pull-right{float:right;} +.pull-left{float:left;} +.hide{display:none;} +.show{display:block;} +.invisible{visibility:hidden;} diff --git a/public/css/style.css b/public/css/style.css new file mode 100644 index 00000000..28af8659 --- /dev/null +++ b/public/css/style.css @@ -0,0 +1,37 @@ +body { + padding-top: 60px; + padding-bottom: 40px; +} + +.zf-green { + color: #68b604; +} + +.btn-success { + background-color: #57a900; + background-image: -moz-linear-gradient(top, #70d900, #57a900); + background-image: -ms-linear-gradient(top, #70d900, #57a900); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#70d900), to(#57a900)); + background-image: -webkit-linear-gradient(top, #70d900, #57a900); + background-image: -o-linear-gradient(top, #70d900, #57a900); + background-image: linear-gradient(top, #70d900, #57a900); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#70d900', endColorstr='#57a900', GradientType=0); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #57a900; +} + +.btn-success:active, .btn-success.active { + background-color: #57a900; +} + +div.container a.brand { + background: url("../images/zf2-logo.png") no-repeat scroll 0 10px transparent; + margin-left: 0; + padding: 8px 20px 12px 40px; +} diff --git a/public/images/favicon.ico b/public/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..17f119909ffcba66c8a48cba1050d724ab0a51aa GIT binary patch literal 1406 zcmeH{u@S;B3`L(4!_kq77D~2&f)%m@8>CIi3Rxj5&{O4(F&KaWl5ZuLa4BgmpX9H9 z`YL`QaC$|7#dQTcp`$WT2c=`93TJ2EqV#>w00001b5ch_0Itp) z=>Px#24YJ`L;!yP_W%GgN~tse000SaNLh0L04^f{04^f|c%?sf00007bV*G`2iyV+ z0u~zPmpWDe00Lr3L_t(I%azo>i(FL{2k_6yUMCTM712~SHnN3^LXZ#>#6mD{K>q+S zX(BTq2r-aC&_W?)Kx6SHAYz+Fn|-UGg{D#q@kj43WQ(W}QBZutvDmjev$Joqn*)z` zx!n6b_xnBHb7I_-lIg1mkJx`4z((?5a5tV$o(yi!+&@Tx2+;xVFVZx_aXf%ea3pTw zz=& z*KA7NE5{=1(-GdEtJD{D)gIf$xG8VowH+1R9lzF9d;hp8Cvg#v;TN1QJ&Es)a4EB6 zlK#nXw&z@AdSR|r`@17O)2%PzXt!R)mC_@{hd3M|rRdt~`z5`4L;AAE*sb(4E>DKr zcVERJ{Dg0?5({kJiSSaU?AW|pSMAxQrfkZjWC_xn=92RG&mP?K#vF4 za9gH`@MmYF>p7EgOP%X=)!yiw{*-V5$C87=q2#_v)&Aa-_&C;awXWJ1OP6>h_%s*lEe?=BYch#lx|Y3run(); diff --git a/public/js/html5.js b/public/js/html5.js new file mode 100644 index 00000000..6692336c --- /dev/null +++ b/public/js/html5.js @@ -0,0 +1,4 @@ +// iepp v2.1pre @jon_neal & @aFarkas github.com/aFarkas/iepp +// html5shiv @rem remysharp.com/html5-enabling-script +// Dual licensed under the MIT or GPL Version 2 licenses +/*@cc_on(function(a,b){function r(a){var b=-1;while(++b").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( +a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f +.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); diff --git a/vendor/.gitignore b/vendor/.gitignore new file mode 100644 index 00000000..4578c85a --- /dev/null +++ b/vendor/.gitignore @@ -0,0 +1,5 @@ +!.gitignore +.composer +composer +zendframework +autoload.php diff --git a/vendor/README.md b/vendor/README.md new file mode 100644 index 00000000..52144c94 --- /dev/null +++ b/vendor/README.md @@ -0,0 +1 @@ +This vendor/ directory is where third-party modules should be installed. diff --git a/vendor/doctrine/common/.gitignore b/vendor/doctrine/common/.gitignore new file mode 100644 index 00000000..fb5e79d6 --- /dev/null +++ b/vendor/doctrine/common/.gitignore @@ -0,0 +1,4 @@ +build/ +logs/ +reports/ +dist/ diff --git a/vendor/doctrine/common/.gitmodules b/vendor/doctrine/common/.gitmodules new file mode 100644 index 00000000..51f08435 --- /dev/null +++ b/vendor/doctrine/common/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/vendor/doctrine-build-common"] + path = lib/vendor/doctrine-build-common + url = git://github.com/doctrine/doctrine-build-common.git diff --git a/vendor/doctrine/common/.travis.yml b/vendor/doctrine/common/.travis.yml new file mode 100644 index 00000000..4464d4f7 --- /dev/null +++ b/vendor/doctrine/common/.travis.yml @@ -0,0 +1,5 @@ +language: php + +php: + - 5.3 + - 5.4 diff --git a/vendor/doctrine/common/LICENSE b/vendor/doctrine/common/LICENSE new file mode 100644 index 00000000..1c03f74b --- /dev/null +++ b/vendor/doctrine/common/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/vendor/doctrine/common/README.md b/vendor/doctrine/common/README.md new file mode 100644 index 00000000..c63f7627 --- /dev/null +++ b/vendor/doctrine/common/README.md @@ -0,0 +1,12 @@ +# Doctrine Common + +[![Build Status](https://secure.travis-ci.org/doctrine/common.png)](http://travis-ci.org/doctrine/common) + +The Doctrine Common project is a library that provides extensions to core PHP functionality. + +## More resources: + +* [Website](http://www.doctrine-project.org) +* [Documentation](http://www.doctrine-project.org/projects/common/current/docs/en) +* [Issue Tracker](http://www.doctrine-project.org/jira/browse/DCOM) +* [Downloads](http://github.com/doctrine/common/downloads) diff --git a/vendor/doctrine/common/UPGRADE_TO_2_1 b/vendor/doctrine/common/UPGRADE_TO_2_1 new file mode 100644 index 00000000..891a2e5c --- /dev/null +++ b/vendor/doctrine/common/UPGRADE_TO_2_1 @@ -0,0 +1,39 @@ +This document details all the possible changes that you should investigate when updating +your project from Doctrine Common 2.0.x to 2.1 + +## AnnotationReader changes + +The annotation reader was heavily refactored between 2.0 and 2.1-RC1. In theory the operation of the new reader should be backwards compatible, but it has to be setup differently to work that way: + + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\'); + // new code necessary starting here + $reader->setIgnoreNotImportedAnnotations(true); + $reader->setEnableParsePhpImports(false); + $reader = new \Doctrine\Common\Annotations\CachedReader( + new \Doctrine\Common\Annotations\IndexedReader($reader), new ArrayCache() + ); + +## Annotation Base class or @Annotation + +Beginning after 2.1-RC2 you have to either extend ``Doctrine\Common\Annotations\Annotation`` or add @Annotation to your annotations class-level docblock, otherwise the class will simply be ignored. + +## Removed methods on AnnotationReader + +* AnnotationReader::setAutoloadAnnotations() +* AnnotationReader::getAutoloadAnnotations() +* AnnotationReader::isAutoloadAnnotations() + +## AnnotationRegistry + +Autoloading through the PHP autoloader is removed from the 2.1 AnnotationReader. Instead you have to use the global AnnotationRegistry for loading purposes: + + \Doctrine\Common\Annotations\AnnotationRegistry::registerFile($fileWithAnnotations); + \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespace($namespace, $dirs = null); + \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespaces($namespaces); + \Doctrine\Common\Annotations\AnnotationRegistry::registerLoader($callable); + +The $callable for registering a loader accepts a class as first and only parameter and must try to silently autoload it. On success true has to be returned. +The registerAutoloadNamespace function registers a PSR-0 compatible silent autoloader for all classes with the given namespace in the given directories. +If null is passed as directory the include path will be used. + diff --git a/vendor/doctrine/common/UPGRADE_TO_2_2 b/vendor/doctrine/common/UPGRADE_TO_2_2 new file mode 100644 index 00000000..1d93a131 --- /dev/null +++ b/vendor/doctrine/common/UPGRADE_TO_2_2 @@ -0,0 +1,61 @@ +This document details all the possible changes that you should investigate when +updating your project from Doctrine Common 2.1 to 2.2: + +## Annotation Changes + +- AnnotationReader::setIgnoreNotImportedAnnotations has been removed, you need to + add ignore annotation names which are supposed to be ignored via + AnnotationReader::addGlobalIgnoredName + +- AnnotationReader::setAutoloadAnnotations was deprecated by the AnnotationRegistry + in 2.1 and has been removed in 2.2 + +- AnnotationReader::setEnableParsePhpImports was added to ease transition to the new + annotation mechanism in 2.1 and is removed in 2.2 + +- AnnotationReader::isParsePhpImportsEnabled is removed (see above) + +- AnnotationReader::setDefaultAnnotationNamespace was deprecated in favor of explicit + configuration in 2.1 and will be removed in 2.2 (for isolated projects where you + have full-control over _all_ available annotations, we offer a dedicated reader + class ``SimpleAnnotationReader``) + +- AnnotationReader::setAnnotationCreationFunction was deprecated in 2.1 and will be + removed in 2.2. We only offer two creation mechanisms which cannot be changed + anymore to allow the same reader instance to work with all annotations regardless + of which library they are coming from. + +- AnnotationReader::setAnnotationNamespaceAlias was deprecated in 2.1 and will be + removed in 2.2 (see setDefaultAnnotationNamespace) + +- If you use a class as annotation which has not the @Annotation marker in it's + class block, we will now throw an exception instead of silently ignoring it. You + can however still achieve the previous behavior using the @IgnoreAnnotation, or + AnnotationReader::addGlobalIgnoredName (the exception message will contain detailed + instructions when you run into this problem). + +## Cache Changes + +- Renamed old AbstractCache to CacheProvider + +- Dropped the support to the following functions of all cache providers: + + - CacheProvider::deleteByWildcard + + - CacheProvider::deleteByRegEx + + - CacheProvider::deleteByPrefix + + - CacheProvider::deleteBySuffix + +- CacheProvider::deleteAll will not remove ALL entries, it will only mark them as invalid + +- CacheProvider::flushAll will remove ALL entries, namespaced or not + +- Added support to MemcachedCache + +- Added support to WincacheCache + +## ClassLoader Changes + +- ClassLoader::fileExistsInIncludePath() no longer exists. Use the native stream_resolve_include_path() PHP function \ No newline at end of file diff --git a/vendor/doctrine/common/build.properties b/vendor/doctrine/common/build.properties new file mode 100644 index 00000000..ff311a45 --- /dev/null +++ b/vendor/doctrine/common/build.properties @@ -0,0 +1,6 @@ +# Project Name +project.name=DoctrineCommon + +# Version class and file +project.version_class = Doctrine\Common\Version +project.version_file = lib/Doctrine/Common/Version.php diff --git a/vendor/doctrine/common/build.xml b/vendor/doctrine/common/build.xml new file mode 100644 index 00000000..71a9a500 --- /dev/null +++ b/vendor/doctrine/common/build.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DoctrineCommon + Doctrine Common PHP Extensions + pear.doctrine-project.org + The Doctrine Common package contains shared code between the other packages. + + + + + LGPL + + + - + + + + + + + diff --git a/vendor/doctrine/common/composer.json b/vendor/doctrine/common/composer.json new file mode 100644 index 00000000..f995f6c6 --- /dev/null +++ b/vendor/doctrine/common/composer.json @@ -0,0 +1,21 @@ +{ + "name": "doctrine/common", + "type": "library","version":"2.2.3", + "description": "Common Library for Doctrine projects", + "keywords": ["collections", "spl", "eventmanager", "annotations", "persistence"], + "homepage": "http://www.doctrine-project.org", + "license": "LGPL", + "authors": [ + {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"}, + {"name": "Roman Borschel", "email": "roman@code-factory.org"}, + {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"}, + {"name": "Jonathan Wage", "email": "jonwage@gmail.com"}, + {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"} + ], + "require": { + "php": ">=5.3.2" + }, + "autoload": { + "psr-0": { "Doctrine\\Common": "lib/" } + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php new file mode 100644 index 00000000..62512522 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php @@ -0,0 +1,75 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Annotations class + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class Annotation +{ + /** + * Value property. Common among all derived classes. + * + * @var string + */ + public $value; + + /** + * Constructor + * + * @param array $data Key-value for properties to be defined in this class + */ + public final function __construct(array $data) + { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + /** + * Error handler for unknown property accessor in Annotation class. + * + * @param string $name Unknown property name + */ + public function __get($name) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } + + /** + * Error handler for unknown property mutator in Annotation class. + * + * @param string $name Unkown property name + * @param mixed $value Property value + */ + public function __set($name, $value) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php new file mode 100644 index 00000000..21597b14 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php @@ -0,0 +1,47 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the attribute type during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attribute +{ + /** + * @var string + */ + public $name; + + /** + * @var string + */ + public $type; + + /** + * @var boolean + */ + public $required = false; +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php new file mode 100644 index 00000000..6e314be4 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php @@ -0,0 +1,37 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the types of all declared attributes during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attributes +{ + /** + * @var array + */ + public $value; +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php new file mode 100644 index 00000000..1b2b20ac --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php @@ -0,0 +1,44 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser to ignore specific + * annotations during the parsing process. + * + * @Annotation + * @author Johannes M. Schmitt + */ +final class IgnoreAnnotation +{ + public $names; + + public function __construct(array $values) + { + if (is_string($values['value'])) { + $values['value'] = array($values['value']); + } + if (!is_array($values['value'])) { + throw new \RuntimeException(sprintf('@IgnoreAnnotation expects either a string name, or an array of strings, but got %s.', json_encode($values['value']))); + } + + $this->names = $values['value']; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php new file mode 100644 index 00000000..7b89a022 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php @@ -0,0 +1,33 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check if that attribute is required during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Required +{ +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php new file mode 100644 index 00000000..c41896ad --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php @@ -0,0 +1,105 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the annotation target during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Target +{ + const TARGET_CLASS = 1; + const TARGET_METHOD = 2; + const TARGET_PROPERTY = 4; + const TARGET_ANNOTATION = 8; + const TARGET_ALL = 15; + + /** + * @var array + */ + private static $map = array( + 'ALL' => self::TARGET_ALL, + 'CLASS' => self::TARGET_CLASS, + 'METHOD' => self::TARGET_METHOD, + 'PROPERTY' => self::TARGET_PROPERTY, + 'ANNOTATION' => self::TARGET_ANNOTATION, + ); + + /** + * @var array + */ + public $value; + + /** + * Targets as bitmask. + * + * @var integer + */ + public $targets; + + /** + * Literal target declaration. + * + * @var integer + */ + public $literal; + + /** + * Annotation construct + * + * @param array $values + */ + public function __construct(array $values) + { + if (!isset($values['value'])){ + $values['value'] = null; + } + if (is_string($values['value'])){ + $values['value'] = array($values['value']); + } + if (!is_array($values['value'])){ + throw new \InvalidArgumentException( + sprintf('@Target expects either a string value, or an array of strings, "%s" given.', + is_object($values['value']) ? get_class($values['value']) : gettype($values['value']) + ) + ); + } + + $bitmask = 0; + foreach ($values['value'] as $literal) { + if(!isset(self::$map[$literal])){ + throw new \InvalidArgumentException( + sprintf('Invalid Target "%s". Available targets: [%s]', + $literal, implode(', ', array_keys(self::$map))) + ); + } + $bitmask += self::$map[$literal]; + } + + $this->targets = $bitmask; + $this->value = $values['value']; + $this->literal = implode(', ', $this->value); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php new file mode 100644 index 00000000..fdc1913a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php @@ -0,0 +1,111 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Description of AnnotationException + * + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class AnnotationException extends \Exception +{ + /** + * Creates a new AnnotationException describing a Syntax error. + * + * @param string $message Exception message + * @return AnnotationException + */ + public static function syntaxError($message) + { + return new self('[Syntax Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing a Semantical error. + * + * @param string $message Exception message + * @return AnnotationException + */ + public static function semanticalError($message) + { + return new self('[Semantical Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing an error which occurred during + * the creation of the annotation. + * + * @since 2.2 + * @param string $message + * @return AnnotationException + */ + public static function creationError($message) + { + return new self('[Creation Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing an type error of an attribute. + * + * @since 2.2 + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * @param mixed $actual + * @return AnnotationException + */ + public static function typeError($attributeName, $annotationName, $context, $expected, $actual) + { + return new self(sprintf( + '[Type Error] Attribute "%s" of @%s declared on %s expects %s, but got %s.', + $attributeName, + $annotationName, + $context, + $expected, + is_object($actual) ? 'an instance of '.get_class($actual) : gettype($actual) + )); + } + + /** + * Creates a new AnnotationException describing an required error of an attribute. + * + * @since 2.2 + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * @return AnnotationException + */ + public static function requiredError($attributeName, $annotationName, $context, $expected) + { + return new self(sprintf( + '[Type Error] Attribute "%s" of @%s declared on %s expects %s. This value should not be null.', + $attributeName, + $annotationName, + $context, + $expected + )); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php new file mode 100644 index 00000000..be87728b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php @@ -0,0 +1,303 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\IgnoreAnnotation; +use Doctrine\Common\Annotations\Annotation\Target; +use Closure; +use ReflectionClass; +use ReflectionMethod; +use ReflectionProperty; + +/** + * A reader for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +final class AnnotationReader implements Reader +{ + /** + * Global map for imports. + * + * @var array + */ + private static $globalImports = array( + 'ignoreannotation' => 'Doctrine\Common\Annotations\Annotation\IgnoreAnnotation', + ); + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names are case sensitive. + * + * @var array + */ + private static $globalIgnoredNames = array( + 'access'=> true, 'author'=> true, 'copyright'=> true, 'deprecated'=> true, + 'example'=> true, 'ignore'=> true, 'internal'=> true, 'link'=> true, 'see'=> true, + 'since'=> true, 'tutorial'=> true, 'version'=> true, 'package'=> true, + 'subpackage'=> true, 'name'=> true, 'global'=> true, 'param'=> true, + 'return'=> true, 'staticvar'=> true, 'category'=> true, 'staticVar'=> true, + 'static'=> true, 'var'=> true, 'throws'=> true, 'inheritdoc'=> true, + 'inheritDoc'=> true, 'license'=> true, 'todo'=> true, 'deprecated'=> true, + 'deprec'=> true, 'author'=> true, 'property' => true, 'method' => true, + 'abstract'=> true, 'exception'=> true, 'magic' => true, 'api' => true, + 'final'=> true, 'filesource'=> true, 'throw' => true, 'uses' => true, + 'usedby'=> true, 'private' => true, 'Annotation' => true, 'override' => true, + 'codeCoverageIgnore' => true, 'codeCoverageIgnoreStart' => true, 'codeCoverageIgnoreEnd' => true, + 'Required' => true, 'Attribute' => true, 'Attributes' => true, + 'Target' => true, 'SuppressWarnings' => true, + 'ingroup' => true, 'code' => true, 'endcode' => true, + 'package_version' => true, + ); + + /** + * Add a new annotation to the globally ignored annotation names with regard to exception handling. + * + * @param string $name + */ + static public function addGlobalIgnoredName($name) + { + self::$globalIgnoredNames[$name] = true; + } + + /** + * Annotations Parser + * + * @var Doctrine\Common\Annotations\DocParser + */ + private $parser; + + /** + * Annotations Parser used to collect parsing metadata + * + * @var Doctrine\Common\Annotations\DocParser + */ + private $preParser; + + /** + * PHP Parser used to collect imports. + * + * @var Doctrine\Common\Annotations\PhpParser + */ + private $phpParser; + + /** + * In-memory cache mechanism to store imported annotations per class. + * + * @var array + */ + private $imports = array(); + + /** + * In-memory cache mechanism to store ignored annotations per class. + * + * @var array + */ + private $ignoredAnnotationNames = array(); + + /** + * Constructor. + * + * Initializes a new AnnotationReader. + */ + public function __construct() + { + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/IgnoreAnnotation.php'); + + $this->parser = new DocParser; + + $this->preParser = new DocParser; + $this->preParser->setImports(self::$globalImports); + $this->preParser->setIgnoreNotImportedAnnotations(true); + + $this->phpParser = new PhpParser; + } + + /** + * Gets the annotations applied to a class. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @return array An array of Annotations. + */ + public function getClassAnnotations(ReflectionClass $class) + { + $this->parser->setTarget(Target::TARGET_CLASS); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($class->getDocComment(), 'class ' . $class->getName()); + } + + /** + * Gets a class annotation. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getClassAnnotation(ReflectionClass $class, $annotationName) + { + $annotations = $this->getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets the annotations applied to a property. + * + * @param ReflectionProperty $property The ReflectionProperty of the property + * from which the annotations should be read. + * @return array An array of Annotations. + */ + public function getPropertyAnnotations(ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + $this->parser->setTarget(Target::TARGET_PROPERTY); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($property->getDocComment(), $context); + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets the annotations applied to a method. + * + * @param ReflectionMethod $property The ReflectionMethod of the method from which + * the annotations should be read. + * @return array An array of Annotations. + */ + public function getMethodAnnotations(ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + $this->parser->setTarget(Target::TARGET_METHOD); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($method->getDocComment(), $context); + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Returns the ignored annotations for the given class. + * + * @param ReflectionClass $class + * @return array + */ + private function getIgnoredAnnotationNames(ReflectionClass $class) + { + if (isset($this->ignoredAnnotationNames[$name = $class->getName()])) { + return $this->ignoredAnnotationNames[$name]; + } + $this->collectParsingMetadata($class); + + return $this->ignoredAnnotationNames[$name]; + } + + private function getImports(ReflectionClass $class) + { + if (isset($this->imports[$name = $class->getName()])) { + return $this->imports[$name]; + } + $this->collectParsingMetadata($class); + + return $this->imports[$name]; + } + + /** + * Collects parsing metadata for a given class + * + * @param ReflectionClass $class + */ + private function collectParsingMetadata(ReflectionClass $class) + { + $ignoredAnnotationNames = self::$globalIgnoredNames; + + $annotations = $this->preParser->parse($class->getDocComment(), 'class '.$class->name); + foreach ($annotations as $annotation) { + if ($annotation instanceof IgnoreAnnotation) { + foreach ($annotation->names AS $annot) { + $ignoredAnnotationNames[$annot] = true; + } + } + } + + $name = $class->getName(); + $this->imports[$name] = array_merge( + self::$globalImports, + $this->phpParser->parseClass($class), + array('__NAMESPACE__' => $class->getNamespaceName()) + ); + $this->ignoredAnnotationNames[$name] = $ignoredAnnotationNames; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php new file mode 100644 index 00000000..60b00f51 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php @@ -0,0 +1,129 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +final class AnnotationRegistry +{ + /** + * A map of namespaces to use for autoloading purposes based on a PSR-0 convention. + * + * Contains the namespace as key and an array of directories as value. If the value is NULL + * the include path is used for checking for the corresponding file. + * + * This autoloading mechanism does not utilize the PHP autoloading but implements autoloading on its own. + * + * @var array + */ + static private $autoloadNamespaces = array(); + + /** + * A map of autoloader callables. + * + * @var array + */ + static private $loaders = array(); + + static public function reset() + { + self::$autoloadNamespaces = array(); + self::$loaders = array(); + } + + static public function registerFile($file) + { + require_once $file; + } + + /** + * Add a namespace with one or many directories to look for files or null for the include path. + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param string $namespace + * @param string|array|null $dirs + */ + static public function registerAutoloadNamespace($namespace, $dirs = null) + { + self::$autoloadNamespaces[$namespace] = $dirs; + } + + /** + * Register multiple namespaces + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param array $namespaces + */ + static public function registerAutoloadNamespaces(array $namespaces) + { + self::$autoloadNamespaces = array_merge(self::$autoloadNamespaces, $namespaces); + } + + /** + * Register an autoloading callabale for annotations, much like spl_autoload_register(). + * + * NOTE: These class loaders HAVE to be silent when a class was not found! + * IMPORTANT: Loaders have to return true if they loaded a class that could contain the searched annotation class. + * + * @param callabale $callabale + */ + static public function registerLoader($callabale) + { + if (!is_callable($callabale)) { + throw new \InvalidArgumentException("A callable is expected in AnnotationRegistry::registerLoader()."); + } + self::$loaders[] = $callabale; + } + + /** + * Autoload an annotation class silently. + * + * @param string $class + * @return void + */ + static public function loadAnnotationClass($class) + { + foreach (self::$autoloadNamespaces AS $namespace => $dirs) { + if (strpos($class, $namespace) === 0) { + $file = str_replace("\\", DIRECTORY_SEPARATOR, $class) . ".php"; + if ($dirs === null) { + if ($path = stream_resolve_include_path($file)) { + require $path; + return true; + } + } else { + foreach((array)$dirs AS $dir) { + if (file_exists($dir . DIRECTORY_SEPARATOR . $file)) { + require $dir . DIRECTORY_SEPARATOR . $file; + return true; + } + } + } + } + } + + foreach (self::$loaders AS $loader) { + if (call_user_func($loader, $class) === true) { + return true; + } + } + return false; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php new file mode 100644 index 00000000..6ea47c6a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php @@ -0,0 +1,179 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Cache\Cache; + +/** + * A cache aware annotation reader. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + */ +final class CachedReader implements Reader +{ + private static $CACHE_SALT = '@[Annot]'; + + /** + * @var Reader + */ + private $delegate; + + /** + * @var Cache + */ + private $cache; + + /** + * @var boolean + */ + private $debug; + + /** + * @var array + */ + private $loadedAnnotations; + + /** + * @param Reader $reader + * @param Cache $cache + */ + public function __construct(Reader $reader, Cache $cache, $debug = false) + { + $this->delegate = $reader; + $this->cache = $cache; + $this->debug = $debug; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $cacheKey = $class->getName() . self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getClassAnnotations($class); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $cacheKey = $class->getName().'$'.$property->getName().self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getPropertyAnnotations($property); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $cacheKey = $class->getName().'#'.$method->getName().self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getMethodAnnotations($method); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = array(); + } + + private function isCacheFresh($cacheKey, \ReflectionClass $class) + { + if (false === $filename = $class->getFilename()) { + return true; + } + + return $this->cache->fetch('[C]'.$cacheKey) >= filemtime($filename); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php new file mode 100644 index 00000000..c6223e36 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php @@ -0,0 +1,140 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Lexer; + +/** + * Simple lexer for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +final class DocLexer extends Lexer +{ + const T_NONE = 1; + const T_IDENTIFIER = 2; + const T_INTEGER = 3; + const T_STRING = 4; + const T_FLOAT = 5; + + const T_AT = 101; + const T_CLOSE_CURLY_BRACES = 102; + const T_CLOSE_PARENTHESIS = 103; + const T_COMMA = 104; + const T_EQUALS = 105; + const T_FALSE = 106; + const T_NAMESPACE_SEPARATOR = 107; + const T_OPEN_CURLY_BRACES = 108; + const T_OPEN_PARENTHESIS = 109; + const T_TRUE = 110; + const T_NULL = 111; + const T_COLON = 112; + + /** + * @inheritdoc + */ + protected function getCatchablePatterns() + { + return array( + '[a-z_][a-z0-9_:]*', + '(?:[+-]?[0-9]+(?:[\.][0-9]+)*)(?:[eE][+-]?[0-9]+)?', + '"(?:[^"]|"")*"', + ); + } + + /** + * @inheritdoc + */ + protected function getNonCatchablePatterns() + { + return array('\s+', '\*+', '(.)'); + } + + /** + * @inheritdoc + */ + protected function getType(&$value) + { + $type = self::T_NONE; + + // Checking numeric value + if (is_numeric($value)) { + return (strpos($value, '.') !== false || stripos($value, 'e') !== false) + ? self::T_FLOAT : self::T_INTEGER; + } + + if ($value[0] === '"') { + $value = str_replace('""', '"', substr($value, 1, strlen($value) - 2)); + + return self::T_STRING; + } else { + switch (strtolower($value)) { + case '@': + return self::T_AT; + + case ',': + return self::T_COMMA; + + case '(': + return self::T_OPEN_PARENTHESIS; + + case ')': + return self::T_CLOSE_PARENTHESIS; + + case '{': + return self::T_OPEN_CURLY_BRACES; + + case '}': + return self::T_CLOSE_CURLY_BRACES; + + case '=': + return self::T_EQUALS; + + case '\\': + return self::T_NAMESPACE_SEPARATOR; + + case 'true': + return self::T_TRUE; + + case 'false': + return self::T_FALSE; + + case 'null': + return self::T_NULL; + + case ':': + return self::T_COLON; + + default: + if (ctype_alpha($value[0]) || $value[0] === '_') { + return self::T_IDENTIFIER; + } + + break; + } + } + + return $type; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php new file mode 100644 index 00000000..9d16b176 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php @@ -0,0 +1,891 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Closure; +use ReflectionClass; +use Doctrine\Common\Annotations\Annotation\Target; +use Doctrine\Common\Annotations\Annotation\Attribute; +use Doctrine\Common\Annotations\Annotation\Attributes; + +/** + * A parser for docblock annotations. + * + * It is strongly discouraged to change the default annotation parsing process. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +final class DocParser +{ + /** + * An array of all valid tokens for a class name. + * + * @var array + */ + private static $classIdentifiers = array(DocLexer::T_IDENTIFIER, DocLexer::T_TRUE, DocLexer::T_FALSE, DocLexer::T_NULL); + + /** + * The lexer. + * + * @var Doctrine\Common\Annotations\DocLexer + */ + private $lexer; + + /** + * Current target context + * + * @var string + */ + private $target; + + /** + * Doc Parser used to collect annotation target + * + * @var Doctrine\Common\Annotations\DocParser + */ + private static $metadataParser; + + /** + * Flag to control if the current annotation is nested or not. + * + * @var boolean + */ + private $isNestedAnnotation = false; + + /** + * Hashmap containing all use-statements that are to be used when parsing + * the given doc block. + * + * @var array + */ + private $imports = array(); + + /** + * This hashmap is used internally to cache results of class_exists() + * look-ups. + * + * @var array + */ + private $classExists = array(); + + /** + * Whether annotations that have not been imported should be ignored. + * + * @var boolean + */ + private $ignoreNotImportedAnnotations = false; + + /** + * An array of default namespaces if operating in simple mode. + * + * @var array + */ + private $namespaces = array(); + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names must be the raw names as used in the class, not the fully qualified + * class names. + * + * @var array + */ + private $ignoredAnnotationNames = array(); + + /** + * @var string + */ + private $context = ''; + + /** + * Hash-map for caching annotation metadata + * @var array + */ + private static $annotationMetadata = array( + 'Doctrine\Common\Annotations\Annotation\Target' => array( + 'is_annotation' => true, + 'has_constructor' => true, + 'properties' => array(), + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'attribute_types' => array( + 'value' => array( + 'required' => false, + 'type' =>'array', + 'array_type'=>'string', + 'value' =>'array' + ) + ), + ), + 'Doctrine\Common\Annotations\Annotation\Attribute' => array( + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_ANNOTATION', + 'targets' => Target::TARGET_ANNOTATION, + 'default_property' => 'name', + 'properties' => array( + 'name' => 'name', + 'type' => 'type', + 'required' => 'required' + ), + 'attribute_types' => array( + 'value' => array( + 'required' => true, + 'type' =>'string', + 'value' =>'string' + ), + 'type' => array( + 'required' =>true, + 'type' =>'string', + 'value' =>'string' + ), + 'required' => array( + 'required' =>false, + 'type' =>'boolean', + 'value' =>'boolean' + ) + ), + ), + 'Doctrine\Common\Annotations\Annotation\Attributes' => array( + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'properties' => array( + 'value' => 'value' + ), + 'attribute_types' => array( + 'value' => array( + 'type' =>'array', + 'required' =>true, + 'array_type'=>'Doctrine\Common\Annotations\Annotation\Attribute', + 'value' =>'array' + ) + ), + ), + ); + + /** + * Hash-map for handle types declaration + * + * @var array + */ + private static $typeMap = array( + 'float' => 'double', + 'bool' => 'boolean', + // allow uppercase Boolean in honor of George Boole + 'Boolean' => 'boolean', + 'int' => 'integer', + ); + + /** + * Constructs a new DocParser. + */ + public function __construct() + { + $this->lexer = new DocLexer; + } + + /** + * Sets the annotation names that are ignored during the parsing process. + * + * The names are supposed to be the raw names as used in the class, not the + * fully qualified class names. + * + * @param array $names + */ + public function setIgnoredAnnotationNames(array $names) + { + $this->ignoredAnnotationNames = $names; + } + + public function setIgnoreNotImportedAnnotations($bool) + { + $this->ignoreNotImportedAnnotations = (Boolean) $bool; + } + + /** + * Sets the default namespaces. + * @param array $namespaces + */ + public function addNamespace($namespace) + { + if ($this->imports) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + $this->namespaces[] = $namespace; + } + + public function setImports(array $imports) + { + if ($this->namespaces) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + $this->imports = $imports; + } + + /** + * Sets current target context as bitmask. + * + * @param integer $target + */ + public function setTarget($target) + { + $this->target = $target; + } + + /** + * Parses the given docblock string for annotations. + * + * @param string $input The docblock string to parse. + * @param string $context The parsing context. + * @return array Array of annotations. If no annotations are found, an empty array is returned. + */ + public function parse($input, $context = '') + { + if (false === $pos = strpos($input, '@')) { + return array(); + } + + // also parse whatever character is before the @ + if ($pos > 0) { + $pos -= 1; + } + + $this->context = $context; + $this->lexer->setInput(trim(substr($input, $pos), '* /')); + $this->lexer->moveNext(); + + return $this->Annotations(); + } + + /** + * Attempts to match the given token with the current lookahead token. + * If they match, updates the lookahead token; otherwise raises a syntax error. + * + * @param int Token type. + * @return bool True if tokens match; false otherwise. + */ + private function match($token) + { + if ( ! $this->lexer->isNextToken($token) ) { + $this->syntaxError($this->lexer->getLiteral($token)); + } + + return $this->lexer->moveNext(); + } + + /** + * Attempts to match the current lookahead token with any of the given tokens. + * + * If any of them matches, this method updates the lookahead token; otherwise + * a syntax error is raised. + * + * @param array $tokens + * @return bool + */ + private function matchAny(array $tokens) + { + if ( ! $this->lexer->isNextTokenAny($tokens)) { + $this->syntaxError(implode(' or ', array_map(array($this->lexer, 'getLiteral'), $tokens))); + } + + return $this->lexer->moveNext(); + } + + /** + * Generates a new syntax error. + * + * @param string $expected Expected string. + * @param array $token Optional token. + * @throws SyntaxException + */ + private function syntaxError($expected, $token = null) + { + if ($token === null) { + $token = $this->lexer->lookahead; + } + + $message = "Expected {$expected}, got "; + + if ($this->lexer->lookahead === null) { + $message .= 'end of string'; + } else { + $message .= "'{$token['value']}' at position {$token['position']}"; + } + + if (strlen($this->context)) { + $message .= ' in ' . $this->context; + } + + $message .= '.'; + + throw AnnotationException::syntaxError($message); + } + + /** + * Attempt to check if a class exists or not. This never goes through the PHP autoloading mechanism + * but uses the {@link AnnotationRegistry} to load classes. + * + * @param string $fqcn + * @return boolean + */ + private function classExists($fqcn) + { + if (isset($this->classExists[$fqcn])) { + return $this->classExists[$fqcn]; + } + + // first check if the class already exists, maybe loaded through another AnnotationReader + if (class_exists($fqcn, false)) { + return $this->classExists[$fqcn] = true; + } + + // final check, does this class exist? + return $this->classExists[$fqcn] = AnnotationRegistry::loadAnnotationClass($fqcn); + } + + /** + * Collects parsing metadata for a given annotation class + * + * @param string $name The annotation name + */ + private function collectAnnotationMetadata($name) + { + if (self::$metadataParser == null){ + self::$metadataParser = new self(); + self::$metadataParser->setTarget(Target::TARGET_CLASS); + self::$metadataParser->setIgnoreNotImportedAnnotations(true); + self::$metadataParser->setImports(array( + 'target' => 'Doctrine\Common\Annotations\Annotation\Target', + 'attribute' => 'Doctrine\Common\Annotations\Annotation\Attribute', + 'attributes' => 'Doctrine\Common\Annotations\Annotation\Attributes' + )); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Target.php'); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attribute.php'); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attributes.php'); + } + + $class = new \ReflectionClass($name); + $docComment = $class->getDocComment(); + + // Sets default values for annotation metadata + $metadata = array( + 'default_property' => null, + 'has_constructor' => (null !== $constructor = $class->getConstructor()) && $constructor->getNumberOfParameters() > 0, + 'properties' => array(), + 'property_types' => array(), + 'attribute_types' => array(), + 'targets_literal' => null, + 'targets' => Target::TARGET_ALL, + 'is_annotation' => false !== strpos($docComment, '@Annotation'), + ); + + // verify that the class is really meant to be an annotation + if ($metadata['is_annotation']) { + foreach (self::$metadataParser->parse($docComment, 'class @' . $name) as $annotation) { + if ($annotation instanceof Target) { + $metadata['targets'] = $annotation->targets; + $metadata['targets_literal'] = $annotation->literal; + + } elseif ($annotation instanceof Attributes) { + foreach ($annotation->value as $attrib) { + // handle internal type declaration + $type = isset(self::$typeMap[$attrib->type]) ? self::$typeMap[$attrib->type] : $attrib->type; + + // handle the case if the property type is mixed + if ('mixed' !== $type) { + // Checks if the property has array + if (false !== $pos = strpos($type, '<')) { + $arrayType = substr($type, $pos+1, -1); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$attrib->name]['array_type'] = $arrayType; + } + + $metadata['attribute_types'][$attrib->name]['type'] = $type; + $metadata['attribute_types'][$attrib->name]['value'] = $attrib->type; + $metadata['attribute_types'][$attrib->name]['required'] = $attrib->required; + } + } + } + } + + // if not has a constructor will inject values into public properties + if (false === $metadata['has_constructor']) { + // collect all public properties + foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) { + $metadata['properties'][$property->name] = $property->name; + + // checks if the property has @var annotation + if ((false !== $propertyComment = $property->getDocComment()) + && false !== strpos($propertyComment, '@var') + && preg_match('/@var\s+([^\s]+)/',$propertyComment, $matches)) { + // literal type declaration + $value = $matches[1]; + + // handle internal type declaration + $type = isset(self::$typeMap[$value]) ? self::$typeMap[$value] : $value; + + // handle the case if the property type is mixed + if ('mixed' !== $type) { + // Checks if the property has @var array annotation + if (false !== $pos = strpos($type, '<')) { + $arrayType = substr($type, $pos+1, -1); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$property->name]['array_type'] = $arrayType; + } + + $metadata['attribute_types'][$property->name]['type'] = $type; + $metadata['attribute_types'][$property->name]['value'] = $value; + $metadata['attribute_types'][$property->name]['required'] = false !== strpos($propertyComment, '@Required'); + } + } + } + + // choose the first property as default property + $metadata['default_property'] = reset($metadata['properties']); + } + } + + self::$annotationMetadata[$name] = $metadata; + } + + /** + * Annotations ::= Annotation {[ "*" ]* [Annotation]}* + * + * @return array + */ + private function Annotations() + { + $annotations = array(); + + while (null !== $this->lexer->lookahead) { + if (DocLexer::T_AT !== $this->lexer->lookahead['type']) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is preceded by non-catchable pattern + if (null !== $this->lexer->token && $this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value'])) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is followed by either a namespace separator, or + // an identifier token + if ((null === $peek = $this->lexer->glimpse()) + || (DocLexer::T_NAMESPACE_SEPARATOR !== $peek['type'] && !in_array($peek['type'], self::$classIdentifiers, true)) + || $peek['position'] !== $this->lexer->lookahead['position'] + 1) { + $this->lexer->moveNext(); + continue; + } + + $this->isNestedAnnotation = false; + if (false !== $annot = $this->Annotation()) { + $annotations[] = $annot; + } + } + + return $annotations; + } + + /** + * Annotation ::= "@" AnnotationName ["(" [Values] ")"] + * AnnotationName ::= QualifiedName | SimpleName + * QualifiedName ::= NameSpacePart "\" {NameSpacePart "\"}* SimpleName + * NameSpacePart ::= identifier | null | false | true + * SimpleName ::= identifier | null | false | true + * + * @return mixed False if it is not a valid annotation. + */ + private function Annotation() + { + $this->match(DocLexer::T_AT); + + // check if we have an annotation + if ($this->lexer->isNextTokenAny(self::$classIdentifiers)) { + $this->lexer->moveNext(); + $name = $this->lexer->token['value']; + } else if ($this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) { + $name = ''; + } else { + $this->syntaxError('namespace separator or identifier'); + } + + while ($this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value']) && $this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) { + $this->match(DocLexer::T_NAMESPACE_SEPARATOR); + $this->matchAny(self::$classIdentifiers); + $name .= '\\'.$this->lexer->token['value']; + } + + // only process names which are not fully qualified, yet + // fully qualified names must start with a \ + $originalName = $name; + if ('\\' !== $name[0]) { + $alias = (false === $pos = strpos($name, '\\'))? $name : substr($name, 0, $pos); + + $found = false; + if ($this->namespaces) { + foreach ($this->namespaces as $namespace) { + if ($this->classExists($namespace.'\\'.$name)) { + $name = $namespace.'\\'.$name; + $found = true; + break; + } + } + } elseif (isset($this->imports[$loweredAlias = strtolower($alias)])) { + if (false !== $pos) { + $name = $this->imports[$loweredAlias].substr($name, $pos); + } else { + $name = $this->imports[$loweredAlias]; + } + $found = true; + } elseif (isset($this->imports['__NAMESPACE__']) && $this->classExists($this->imports['__NAMESPACE__'].'\\'.$name)) { + $name = $this->imports['__NAMESPACE__'].'\\'.$name; + $found = true; + } elseif ($this->classExists($name)) { + $found = true; + } + + if (!$found) { + if ($this->ignoreNotImportedAnnotations || isset($this->ignoredAnnotationNames[$name])) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s was never imported. Did you maybe forget to add a "use" statement for this annotation?', $name, $this->context)); + } + } + + if (!$this->classExists($name)) { + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s does not exist, or could not be auto-loaded.', $name, $this->context)); + } + + // at this point, $name contains the fully qualified class name of the + // annotation, and it is also guaranteed that this class exists, and + // that it is loaded + + + // collects the metadata annotation only if there is not yet + if (!isset(self::$annotationMetadata[$name])) { + $this->collectAnnotationMetadata($name); + } + + // verify that the class is really meant to be an annotation and not just any ordinary class + if (self::$annotationMetadata[$name]['is_annotation'] === false) { + if (isset($this->ignoredAnnotationNames[$originalName])) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The class "%s" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "%s". If it is indeed no annotation, then you need to add @IgnoreAnnotation("%s") to the _class_ doc comment of %s.', $name, $name, $originalName, $this->context)); + } + + //if target is nested annotation + $target = $this->isNestedAnnotation ? Target::TARGET_ANNOTATION : $this->target; + + // Next will be nested + $this->isNestedAnnotation = true; + + //if annotation does not support current target + if (0 === (self::$annotationMetadata[$name]['targets'] & $target) && $target) { + throw AnnotationException::semanticalError( + sprintf('Annotation @%s is not allowed to be declared on %s. You may only use this annotation on these code elements: %s.', + $originalName, $this->context, self::$annotationMetadata[$name]['targets_literal']) + ); + } + + $values = array(); + if ($this->lexer->isNextToken(DocLexer::T_OPEN_PARENTHESIS)) { + $this->match(DocLexer::T_OPEN_PARENTHESIS); + + if ( ! $this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) { + $values = $this->Values(); + } + + $this->match(DocLexer::T_CLOSE_PARENTHESIS); + } + + // checks all declared attributes + foreach (self::$annotationMetadata[$name]['attribute_types'] as $property => $type) { + if ($property === self::$annotationMetadata[$name]['default_property'] + && !isset($values[$property]) && isset($values['value'])) { + $property = 'value'; + } + + // handle a not given attribute or null value + if (!isset($values[$property])) { + if ($type['required']) { + throw AnnotationException::requiredError($property, $originalName, $this->context, 'a(n) '.$type['value']); + } + + continue; + } + + if ($type['type'] === 'array') { + // handle the case of a single value + if (!is_array($values[$property])) { + $values[$property] = array($values[$property]); + } + + // checks if the attribute has array type declaration, such as "array" + if (isset($type['array_type'])) { + foreach ($values[$property] as $item) { + if (gettype($item) !== $type['array_type'] && !$item instanceof $type['array_type']) { + throw AnnotationException::typeError($property, $originalName, $this->context, 'either a(n) '.$type['array_type'].', or an array of '.$type['array_type'].'s', $item); + } + } + } + } elseif (gettype($values[$property]) !== $type['type'] && !$values[$property] instanceof $type['type']) { + throw AnnotationException::typeError($property, $originalName, $this->context, 'a(n) '.$type['value'], $values[$property]); + } + } + + // check if the annotation expects values via the constructor, + // or directly injected into public properties + if (self::$annotationMetadata[$name]['has_constructor'] === true) { + return new $name($values); + } + + $instance = new $name(); + foreach ($values as $property => $value) { + if (!isset(self::$annotationMetadata[$name]['properties'][$property])) { + if ('value' !== $property) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not have a property named "%s". Available properties: %s', $originalName, $this->context, $property, implode(', ', self::$annotationMetadata[$name]['properties']))); + } + + // handle the case if the property has no annotations + if (!$property = self::$annotationMetadata[$name]['default_property']) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not accept any values, but got %s.', $originalName, $this->context, json_encode($values))); + } + } + + $instance->{$property} = $value; + } + + return $instance; + } + + /** + * Values ::= Array | Value {"," Value}* + * + * @return array + */ + private function Values() + { + $values = array(); + + // Handle the case of a single array as value, i.e. @Foo({....}) + if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { + $values['value'] = $this->Value(); + return $values; + } + + $values[] = $this->Value(); + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + $token = $this->lexer->lookahead; + $value = $this->Value(); + + if ( ! is_object($value) && ! is_array($value)) { + $this->syntaxError('Value', $token); + } + + $values[] = $value; + } + + foreach ($values as $k => $value) { + if (is_object($value) && $value instanceof \stdClass) { + $values[$value->name] = $value->value; + } else if ( ! isset($values['value'])){ + $values['value'] = $value; + } else { + if ( ! is_array($values['value'])) { + $values['value'] = array($values['value']); + } + + $values['value'][] = $value; + } + + unset($values[$k]); + } + + return $values; + } + + /** + * Value ::= PlainValue | FieldAssignment + * + * @return mixed + */ + private function Value() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type']) { + return $this->FieldAssignment(); + } + + return $this->PlainValue(); + } + + /** + * PlainValue ::= integer | string | float | boolean | Array | Annotation + * + * @return mixed + */ + private function PlainValue() + { + if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { + return $this->Arrayx(); + } + + if ($this->lexer->isNextToken(DocLexer::T_AT)) { + return $this->Annotation(); + } + + switch ($this->lexer->lookahead['type']) { + case DocLexer::T_STRING: + $this->match(DocLexer::T_STRING); + return $this->lexer->token['value']; + + case DocLexer::T_INTEGER: + $this->match(DocLexer::T_INTEGER); + return (int)$this->lexer->token['value']; + + case DocLexer::T_FLOAT: + $this->match(DocLexer::T_FLOAT); + return (float)$this->lexer->token['value']; + + case DocLexer::T_TRUE: + $this->match(DocLexer::T_TRUE); + return true; + + case DocLexer::T_FALSE: + $this->match(DocLexer::T_FALSE); + return false; + + case DocLexer::T_NULL: + $this->match(DocLexer::T_NULL); + return null; + + default: + $this->syntaxError('PlainValue'); + } + } + + /** + * FieldAssignment ::= FieldName "=" PlainValue + * FieldName ::= identifier + * + * @return array + */ + private function FieldAssignment() + { + $this->match(DocLexer::T_IDENTIFIER); + $fieldName = $this->lexer->token['value']; + + $this->match(DocLexer::T_EQUALS); + + $item = new \stdClass(); + $item->name = $fieldName; + $item->value = $this->PlainValue(); + + return $item; + } + + /** + * Array ::= "{" ArrayEntry {"," ArrayEntry}* [","] "}" + * + * @return array + */ + private function Arrayx() + { + $array = $values = array(); + + $this->match(DocLexer::T_OPEN_CURLY_BRACES); + $values[] = $this->ArrayEntry(); + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + + // optional trailing comma + if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) { + break; + } + + $values[] = $this->ArrayEntry(); + } + + $this->match(DocLexer::T_CLOSE_CURLY_BRACES); + + foreach ($values as $value) { + list ($key, $val) = $value; + + if ($key !== null) { + $array[$key] = $val; + } else { + $array[] = $val; + } + } + + return $array; + } + + /** + * ArrayEntry ::= Value | KeyValuePair + * KeyValuePair ::= Key ("=" | ":") PlainValue + * Key ::= string | integer + * + * @return array + */ + private function ArrayEntry() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type'] + || DocLexer::T_COLON === $peek['type']) { + $this->matchAny(array(DocLexer::T_INTEGER, DocLexer::T_STRING)); + + $key = $this->lexer->token['value']; + $this->matchAny(array(DocLexer::T_EQUALS, DocLexer::T_COLON)); + + return array($key, $this->PlainValue()); + } + + return array(null, $this->Value()); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php new file mode 100644 index 00000000..4a42b583 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php @@ -0,0 +1,209 @@ +. + */ + +namespace Doctrine\Common\Annotations; + + +/** + * File cache reader for annotations. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + */ +class FileCacheReader implements Reader +{ + /** + * @var Reader + */ + private $reader; + private $dir; + private $debug; + private $loadedAnnotations = array(); + + public function __construct(Reader $reader, $cacheDir, $debug = false) + { + $this->reader = $reader; + if (!is_dir($cacheDir) && !@mkdir($cacheDir, 0777, true)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist and could not be created.', $cacheDir)); + } + if (!is_writable($cacheDir)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" is not writable. Both, the webserver and the console user need access. You can manage access rights for multiple users with "chmod +a". If your system does not support this, check out the acl package.', $cacheDir)); + } + + $this->dir = rtrim($cacheDir, '\\/'); + $this->debug = $debug; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $key = $class->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + @unlink($path); + + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $key = $class->getName().'$'.$property->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + unlink($path); + + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $key = $class->getName().'#'.$method->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + unlink($path); + + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + private function saveCacheFile($path, $data) + { + file_put_contents($path, 'getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = array(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php new file mode 100644 index 00000000..1eea4921 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php @@ -0,0 +1,94 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Reader; + +/** + * Allows the reader to be used in-place of Doctrine's reader. + * + * @author Johannes M. Schmitt + */ +class IndexedReader implements Reader +{ + private $delegate; + + public function __construct(Reader $reader) + { + $this->delegate = $reader; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $annotations = array(); + foreach ($this->delegate->getClassAnnotations($class) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getClassAnnotation(\ReflectionClass $class, $annotation) + { + return $this->delegate->getClassAnnotation($class, $annotation); + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $annotations = array(); + foreach ($this->delegate->getMethodAnnotations($method) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getMethodAnnotation(\ReflectionMethod $method, $annotation) + { + return $this->delegate->getMethodAnnotation($method, $annotation); + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $annotations = array(); + foreach ($this->delegate->getPropertyAnnotations($property) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getPropertyAnnotation(\ReflectionProperty $property, $annotation) + { + return $this->delegate->getPropertyAnnotation($property, $annotation); + } + + /** + * Proxy all methods to the delegate. + * + * @param type $method + * @param type $args + * @return type + */ + public function __call($method, $args) + { + return call_user_func_array(array($this->delegate, $method), $args); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php new file mode 100644 index 00000000..a14f8f5b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php @@ -0,0 +1,203 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use SplFileObject; + +/** + * Parses a file for namespaces/use/class declarations. + * + * @author Fabien Potencier + * @author Christian Kaps + */ +final class PhpParser +{ + /** + * The token list. + * + * @var array + */ + private $tokens; + + /** + * The number of tokens. + * + * @var int + */ + private $numTokens = 0; + + /** + * The current array pointer. + * + * @var int + */ + private $pointer = 0; + + /** + * Parses a class. + * + * @param \ReflectionClass $class A ReflectionClass object. + * @return array A list with use statements in the form (Alias => FQN). + */ + public function parseClass(\ReflectionClass $class) + { + if (false === $filename = $class->getFilename()) { + return array(); + } + + $content = $this->getFileContent($filename, $class->getStartLine()); + $namespace = str_replace('\\', '\\\\', $class->getNamespaceName()); + $content = preg_replace('/^.*?(\bnamespace\s+' . $namespace . '\s*[;{].*)$/s', '\\1', $content); + $this->tokens = token_get_all('numTokens = count($this->tokens); + $this->pointer = 0; + + $statements = $this->parseUseStatements($class->getNamespaceName()); + + return $statements; + } + + /** + * Get the content of the file right up to the given line number. + * + * @param string $filename The name of the file to load. + * @param int $lineNumber The number of lines to read from file. + * @return string The content of the file. + */ + private function getFileContent($filename, $lineNumber) + { + $content = ''; + $lineCnt = 0; + $file = new SplFileObject($filename); + while(!$file->eof()) { + if ($lineCnt++ == $lineNumber) { + break; + } + + $content .= $file->fgets(); + } + + return $content; + } + + /** + * Gets the next non whitespace and non comment token. + * + * @return array The token if exists, null otherwise. + */ + private function next() + { + for ($i = $this->pointer; $i < $this->numTokens; $i++) { + $this->pointer++; + if ($this->tokens[$i][0] === T_WHITESPACE || + $this->tokens[$i][0] === T_COMMENT || + $this->tokens[$i][0] === T_DOC_COMMENT) { + + continue; + } + + return $this->tokens[$i]; + } + + return null; + } + + /** + * Get all use statements. + * + * @param string $namespaceName The namespace name of the reflected class. + * @return array A list with all found use statements. + */ + private function parseUseStatements($namespaceName) + { + $statements = array(); + while (($token = $this->next())) { + if ($token[0] === T_USE) { + $statements = array_merge($statements, $this->parseUseStatement()); + continue; + } else if ($token[0] !== T_NAMESPACE || $this->parseNamespace() != $namespaceName) { + continue; + } + + // Get fresh array for new namespace. This is to prevent the parser to collect the use statements + // for a previous namespace with the same name. This is the case if a namespace is defined twice + // or if a namespace with the same name is commented out. + $statements = array(); + } + + return $statements; + } + + /** + * Get the namespace name. + * + * @return string The found namespace name. + */ + private function parseNamespace() + { + $namespace = ''; + while (($token = $this->next())){ + if ($token[0] === T_STRING || $token[0] === T_NS_SEPARATOR) { + $namespace .= $token[1]; + } else { + break; + } + } + + return $namespace; + } + + /** + * Parse a single use statement. + * + * @return array A list with all found class names for a use statement. + */ + private function parseUseStatement() + { + $class = ''; + $alias = ''; + $statements = array(); + $explicitAlias = false; + while (($token = $this->next())) { + $isNameToken = $token[0] === T_STRING || $token[0] === T_NS_SEPARATOR; + if (!$explicitAlias && $isNameToken) { + $class .= $token[1]; + $alias = $token[1]; + } else if ($explicitAlias && $isNameToken) { + $alias .= $token[1]; + } else if ($token[0] === T_AS) { + $explicitAlias = true; + $alias = ''; + } else if ($token === ',') { + $statements[strtolower($alias)] = $class; + $class = ''; + $alias = ''; + $explicitAlias = false; + } else if ($token === ';') { + $statements[strtolower($alias)] = $class; + break; + } else { + break; + } + } + + return $statements; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php new file mode 100644 index 00000000..8e85d392 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php @@ -0,0 +1,35 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Interface for annotation readers. + * + * @author Johannes M. Schmitt + */ +interface Reader +{ + function getClassAnnotations(\ReflectionClass $class); + function getClassAnnotation(\ReflectionClass $class, $annotationName); + function getMethodAnnotations(\ReflectionMethod $method); + function getMethodAnnotation(\ReflectionMethod $method, $annotationName); + function getPropertyAnnotations(\ReflectionProperty $property); + function getPropertyAnnotation(\ReflectionProperty $property, $annotationName); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php new file mode 100644 index 00000000..a13c7fa0 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php @@ -0,0 +1,152 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\Target; + +/** + * Simple Annotation Reader. + * + * This annotation reader is intended to be used in projects where you have + * full-control over all annotations that are available. + * + * @since 2.2 + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +class SimpleAnnotationReader implements Reader +{ + /** + * @var DocParser + */ + private $parser; + + /** + * Constructor. + * + * Initializes a new SimpleAnnotationReader. + */ + public function __construct() + { + $this->parser = new DocParser(); + $this->parser->setIgnoreNotImportedAnnotations(true); + } + + /** + * Adds a namespace in which we will look for annotations. + * + * @param string $namespace + */ + public function addNamespace($namespace) + { + $this->parser->addNamespace($namespace); + } + + /** + * Gets the annotations applied to a class. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @return array An array of Annotations. + */ + public function getClassAnnotations(\ReflectionClass $class) + { + return $this->parser->parse($class->getDocComment(), 'class '.$class->getName()); + } + + /** + * Gets the annotations applied to a method. + * + * @param ReflectionMethod $property The ReflectionMethod of the method from which + * the annotations should be read. + * @return array An array of Annotations. + */ + public function getMethodAnnotations(\ReflectionMethod $method) + { + return $this->parser->parse($method->getDocComment(), 'method '.$method->getDeclaringClass()->name.'::'.$method->getName().'()'); + } + + /** + * Gets the annotations applied to a property. + * + * @param ReflectionProperty $property The ReflectionProperty of the property + * from which the annotations should be read. + * @return array An array of Annotations. + */ + public function getPropertyAnnotations(\ReflectionProperty $property) + { + return $this->parser->parse($property->getDocComment(), 'property '.$property->getDeclaringClass()->name.'::$'.$property->getName()); + } + + /** + * Gets a class annotation. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php new file mode 100644 index 00000000..a59296f5 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php @@ -0,0 +1,97 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * APC cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class ApcCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return apc_fetch($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + $found = false; + + apc_fetch($id, $found); + + return $found; + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return (bool) apc_store($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return apc_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return apc_clear_cache() && apc_clear_cache('user'); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = apc_cache_info(); + $sma = apc_sma_info(); + + return array( + Cache::STATS_HITS => $info['num_hits'], + Cache::STATS_MISSES => $info['num_misses'], + Cache::STATS_UPTIME => $info['start_time'], + Cache::STATS_MEMORY_USAGE => $info['mem_size'], + Cache::STATS_MEMORY_AVAILIABLE => $sma['avail_mem'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php new file mode 100644 index 00000000..8a0b982b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php @@ -0,0 +1,96 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Array cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class ArrayCache extends CacheProvider +{ + /** + * @var array $data + */ + private $data = array(); + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return (isset($this->data[$id])) ? $this->data[$id] : false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return isset($this->data[$id]); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + $this->data[$id] = $data; + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + unset($this->data[$id]); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->data = array(); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php new file mode 100644 index 00000000..d303bde4 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php @@ -0,0 +1,102 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Interface for cache drivers. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Fabio B. Silva + */ +interface Cache +{ + const STATS_HITS = 'hits'; + const STATS_MISSES = 'misses'; + const STATS_UPTIME = 'uptime'; + const STATS_MEMORY_USAGE = 'memory_usage'; + const STATS_MEMORY_AVAILIABLE = 'memory_available'; + + /** + * Fetches an entry from the cache. + * + * @param string $id cache id The id of the cache entry to fetch. + * @return string The cached data or FALSE, if no cache entry exists for the given id. + */ + function fetch($id); + + /** + * Test if an entry exists in the cache. + * + * @param string $id cache id The cache id of the entry to check for. + * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. + */ + function contains($id); + + /** + * Puts data into the cache. + * + * @param string $id The cache id. + * @param string $data The cache entry/data. + * @param int $lifeTime The lifetime. If != 0, sets a specific lifetime for this cache entry (0 => infinite lifeTime). + * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. + */ + function save($id, $data, $lifeTime = 0); + + /** + * Deletes a cache entry. + * + * @param string $id cache id + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + function delete($id); + + /** + * Retrieves cached information from data store + * + * The server's statistics array has the following values: + * + * - hits + * Number of keys that have been requested and found present. + * + * - misses + * Number of items that have been requested and not found. + * + * - uptime + * Time that the server is running. + * + * - memory_usage + * Memory used by this server to store items. + * + * - memory_available + * Memory allowed to use for storage. + * + * @since 2.2 + * @var array Associative array with server's statistics if available, NULL otherwise. + */ + function getStats(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php new file mode 100644 index 00000000..fa11fc22 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php @@ -0,0 +1,188 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Base class for cache provider implementations. + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Fabio B. Silva + */ +abstract class CacheProvider implements Cache +{ + const DOCTRINE_NAMESPACE_CACHEKEY = 'DoctrineNamespaceCacheKey[%s]'; + + /** + * @var string The namespace to prefix all cache ids with + */ + private $namespace = ''; + + /** + * Set the namespace to prefix all cache ids with. + * + * @param string $namespace + * @return void + */ + public function setNamespace($namespace) + { + $this->namespace = (string) $namespace; + } + + /** + * Retrieve the namespace that prefixes all cache ids. + * + * @return string + */ + public function getNamespace() + { + return $this->namespace; + } + + /** + * {@inheritdoc} + */ + public function fetch($id) + { + return $this->doFetch($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function contains($id) + { + return $this->doContains($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function save($id, $data, $lifeTime = 0) + { + return $this->doSave($this->getNamespacedId($id), $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + public function delete($id) + { + return $this->doDelete($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function getStats() + { + return $this->doGetStats(); + } + + /** + * Deletes all cache entries. + * + * @return boolean TRUE if the cache entries were successfully flushed, FALSE otherwise. + */ + public function flushAll() + { + return $this->doFlush(); + } + + /** + * Delete all cache entries. + * + * @return boolean TRUE if the cache entries were successfully deleted, FALSE otherwise. + */ + public function deleteAll() + { + $namespaceCacheKey = sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); + $namespaceVersion = ($this->doContains($namespaceCacheKey)) ? $this->doFetch($namespaceCacheKey) : 1; + + return $this->doSave($namespaceCacheKey, $namespaceVersion + 1); + } + + /** + * Prefix the passed id with the configured namespace value + * + * @param string $id The id to namespace + * @return string $id The namespaced id + */ + private function getNamespacedId($id) + { + $namespaceCacheKey = sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); + $namespaceVersion = ($this->doContains($namespaceCacheKey)) ? $this->doFetch($namespaceCacheKey) : 1; + + return sprintf('%s[%s][%s]', $this->namespace, $id, $namespaceVersion); + } + + /** + * Fetches an entry from the cache. + * + * @param string $id cache id The id of the cache entry to fetch. + * @return string The cached data or FALSE, if no cache entry exists for the given id. + */ + abstract protected function doFetch($id); + + /** + * Test if an entry exists in the cache. + * + * @param string $id cache id The cache id of the entry to check for. + * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. + */ + abstract protected function doContains($id); + + /** + * Puts data into the cache. + * + * @param string $id The cache id. + * @param string $data The cache entry/data. + * @param int $lifeTime The lifetime. If != false, sets a specific lifetime for this cache entry (null => infinite lifeTime). + * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. + */ + abstract protected function doSave($id, $data, $lifeTime = false); + + /** + * Deletes a cache entry. + * + * @param string $id cache id + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + abstract protected function doDelete($id); + + /** + * Deletes all cache entries. + * + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + abstract protected function doFlush(); + + /** + * Retrieves cached information from data store + * + * @since 2.2 + * @return array An associative array with server's statistics if available, NULL otherwise. + */ + abstract protected function doGetStats(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php new file mode 100644 index 00000000..dd6d1e31 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php @@ -0,0 +1,121 @@ +. + */ + +namespace Doctrine\Common\Cache; + +use \Memcache; + +/** + * Memcache cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class MemcacheCache extends CacheProvider +{ + /** + * @var Memcache + */ + private $memcache; + + /** + * Sets the memcache instance to use. + * + * @param Memcache $memcache + */ + public function setMemcache(Memcache $memcache) + { + $this->memcache = $memcache; + } + + /** + * Gets the memcache instance used by the cache. + * + * @return Memcache + */ + public function getMemcache() + { + return $this->memcache; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcache->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (bool) $this->memcache->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + return $this->memcache->set($id, $data, 0, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->memcache->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcache->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcache->getStats(); + return array( + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php new file mode 100644 index 00000000..4675fae7 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php @@ -0,0 +1,124 @@ +. + */ + +namespace Doctrine\Common\Cache; + +use \Memcached; + +/** + * Memcached cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class MemcachedCache extends CacheProvider +{ + /** + * @var Memcached + */ + private $memcached; + + /** + * Sets the memcache instance to use. + * + * @param Memcached $memcached + */ + public function setMemcached(Memcached $memcached) + { + $this->memcached = $memcached; + } + + /** + * Gets the memcached instance used by the cache. + * + * @return Memcached + */ + public function getMemcached() + { + return $this->memcached; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcached->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (false !== $this->memcached->get($id)); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + return $this->memcached->set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->memcached->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcached->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcached->getStats(); + $servers = $this->memcached->getServerList(); + $key = $servers[0]['host'] . ':' . $servers[0]['port']; + $stats = $stats[$key]; + return array( + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php new file mode 100644 index 00000000..ed8ca74a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php @@ -0,0 +1,92 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * WinCache cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class WincacheCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return wincache_ucache_get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return wincache_ucache_exists($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return (bool) wincache_ucache_set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return wincache_ucache_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return wincache_ucache_clear(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = wincache_ucache_info(); + $meminfo= wincache_ucache_meminfo(); + return array( + Cache::STATS_HITS => $info['total_hit_count'], + Cache::STATS_MISSES => $info['total_miss_count'], + Cache::STATS_UPTIME => $info['total_cache_uptime'], + Cache::STATS_MEMORY_USAGE => $meminfo['memory_total'], + Cache::STATS_MEMORY_AVAILIABLE => $meminfo['memory_free'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php new file mode 100644 index 00000000..6e22d265 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php @@ -0,0 +1,110 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Xcache cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class XcacheCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->doContains($id) ? unserialize(xcache_get($id)) : false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return xcache_isset($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return xcache_set($id, serialize($data), (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return xcache_unset($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->checkAuthorization(); + + xcache_clear_cache(XC_TYPE_VAR, 0); + + return true; + } + + /** + * Checks that xcache.admin.enable_auth is Off + * + * @throws \BadMethodCallException When xcache.admin.enable_auth is On + * @return void + */ + protected function checkAuthorization() + { + if (ini_get('xcache.admin.enable_auth')) { + throw new \BadMethodCallException('To use all features of \Doctrine\Common\Cache\XcacheCache, you must set "xcache.admin.enable_auth" to "Off" in your php.ini.'); + } + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $this->checkAuthorization(); + + $info = xcache_info(XC_TYPE_VAR, 0); + return array( + Cache::STATS_HITS => $info['hits'], + Cache::STATS_MISSES => $info['misses'], + Cache::STATS_UPTIME => null, + Cache::STATS_MEMORY_USAGE => $info['size'], + Cache::STATS_MEMORY_AVAILIABLE => $info['avail'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php new file mode 100644 index 00000000..4e4dabe7 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php @@ -0,0 +1,84 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Zend Data Cache cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Ralph Schindler + * @author Guilherme Blanco + */ +class ZendDataCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return zend_shm_cache_fetch($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (false !== zend_shm_cache_fetch($id)); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return zend_shm_cache_store($id, $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return zend_shm_cache_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $namespace = $this->getNamespace(); + if (empty($namespace)) { + return zend_shm_cache_clear(); + } + return zend_shm_cache_clear($namespace); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php new file mode 100644 index 00000000..375b0d6b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php @@ -0,0 +1,262 @@ +. + */ + +namespace Doctrine\Common; + +/** + * A ClassLoader is an autoloader for class files that can be + * installed on the SPL autoload stack. It is a class loader that either loads only classes + * of a specific namespace or all namespaces and it is suitable for working together + * with other autoloaders in the SPL autoload stack. + * + * If no include path is configured through the constructor or {@link setIncludePath}, a ClassLoader + * relies on the PHP include_path. + * + * @author Roman Borschel + * @since 2.0 + */ +class ClassLoader +{ + /** + * @var string PHP file extension + */ + protected $fileExtension = '.php'; + + /** + * @var string Current namespace + */ + protected $namespace; + + /** + * @var string Current include path + */ + protected $includePath; + + /** + * @var string PHP namespace separator + */ + protected $namespaceSeparator = '\\'; + + /** + * Creates a new ClassLoader that loads classes of the + * specified namespace from the specified include path. + * + * If no include path is given, the ClassLoader relies on the PHP include_path. + * If neither a namespace nor an include path is given, the ClassLoader will + * be responsible for loading all classes, thereby relying on the PHP include_path. + * + * @param string $ns The namespace of the classes to load. + * @param string $includePath The base include path to use. + */ + public function __construct($ns = null, $includePath = null) + { + $this->namespace = $ns; + $this->includePath = $includePath; + } + + /** + * Sets the namespace separator used by classes in the namespace of this ClassLoader. + * + * @param string $sep The separator to use. + */ + public function setNamespaceSeparator($sep) + { + $this->namespaceSeparator = $sep; + } + + /** + * Gets the namespace separator used by classes in the namespace of this ClassLoader. + * + * @return string + */ + public function getNamespaceSeparator() + { + return $this->namespaceSeparator; + } + + /** + * Sets the base include path for all class files in the namespace of this ClassLoader. + * + * @param string $includePath + */ + public function setIncludePath($includePath) + { + $this->includePath = $includePath; + } + + /** + * Gets the base include path for all class files in the namespace of this ClassLoader. + * + * @return string + */ + public function getIncludePath() + { + return $this->includePath; + } + + /** + * Sets the file extension of class files in the namespace of this ClassLoader. + * + * @param string $fileExtension + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * Gets the file extension of class files in the namespace of this ClassLoader. + * + * @return string + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Registers this ClassLoader on the SPL autoload stack. + */ + public function register() + { + spl_autoload_register(array($this, 'loadClass')); + } + + /** + * Removes this ClassLoader from the SPL autoload stack. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $classname The name of the class to load. + * @return boolean TRUE if the class has been successfully loaded, FALSE otherwise. + */ + public function loadClass($className) + { + if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) { + return false; + } + + require ($this->includePath !== null ? $this->includePath . DIRECTORY_SEPARATOR : '') + . str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) + . $this->fileExtension; + + return true; + } + + /** + * Asks this ClassLoader whether it can potentially load the class (file) with + * the given name. + * + * @param string $className The fully-qualified name of the class. + * @return boolean TRUE if this ClassLoader can load the class, FALSE otherwise. + */ + public function canLoadClass($className) + { + if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) { + return false; + } + + $file = str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) . $this->fileExtension; + + if ($this->includePath !== null) { + return file_exists($this->includePath . DIRECTORY_SEPARATOR . $file); + } + + return (false !== stream_resolve_include_path($file)); + } + + /** + * Checks whether a class with a given name exists. A class "exists" if it is either + * already defined in the current request or if there is an autoloader on the SPL + * autoload stack that is a) responsible for the class in question and b) is able to + * load a class file in which the class definition resides. + * + * If the class is not already defined, each autoloader in the SPL autoload stack + * is asked whether it is able to tell if the class exists. If the autoloader is + * a ClassLoader, {@link canLoadClass} is used, otherwise the autoload + * function of the autoloader is invoked and expected to return a value that + * evaluates to TRUE if the class (file) exists. As soon as one autoloader reports + * that the class exists, TRUE is returned. + * + * Note that, depending on what kinds of autoloaders are installed on the SPL + * autoload stack, the class (file) might already be loaded as a result of checking + * for its existence. This is not the case with a ClassLoader, who separates + * these responsibilities. + * + * @param string $className The fully-qualified name of the class. + * @return boolean TRUE if the class exists as per the definition given above, FALSE otherwise. + */ + public static function classExists($className) + { + if (class_exists($className, false) || interface_exists($className, false)) { + return true; + } + + foreach (spl_autoload_functions() as $loader) { + if (is_array($loader)) { // array(???, ???) + if (is_object($loader[0])) { + if ($loader[0] instanceof ClassLoader) { // array($obj, 'methodName') + if ($loader[0]->canLoadClass($className)) { + return true; + } + } else if ($loader[0]->{$loader[1]}($className)) { + return true; + } + } else if ($loader[0]::$loader[1]($className)) { // array('ClassName', 'methodName') + return true; + } + } else if ($loader instanceof \Closure) { // function($className) {..} + if ($loader($className)) { + return true; + } + } else if (is_string($loader) && $loader($className)) { // "MyClass::loadClass" + return true; + } + } + + return class_exists($className, false) || interface_exists($className, false); + } + + /** + * Gets the ClassLoader from the SPL autoload stack that is responsible + * for (and is able to load) the class with the given name. + * + * @param string $className The name of the class. + * @return The ClassLoader for the class or NULL if no such ClassLoader exists. + */ + public static function getClassLoader($className) + { + foreach (spl_autoload_functions() as $loader) { + if (is_array($loader) + && $loader[0] instanceof ClassLoader + && $loader[0]->canLoadClass($className) + ) { + return $loader[0]; + } + } + + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php new file mode 100644 index 00000000..2a7d4eaf --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php @@ -0,0 +1,447 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Closure, ArrayIterator; + +/** + * An ArrayCollection is a Collection implementation that wraps a regular PHP array. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class ArrayCollection implements Collection +{ + /** + * An array containing the entries of this collection. + * + * @var array + */ + private $_elements; + + /** + * Initializes a new ArrayCollection. + * + * @param array $elements + */ + public function __construct(array $elements = array()) + { + $this->_elements = $elements; + } + + /** + * Gets the PHP array representation of this collection. + * + * @return array The PHP array representation of this collection. + */ + public function toArray() + { + return $this->_elements; + } + + /** + * Sets the internal iterator to the first element in the collection and + * returns this element. + * + * @return mixed + */ + public function first() + { + return reset($this->_elements); + } + + /** + * Sets the internal iterator to the last element in the collection and + * returns this element. + * + * @return mixed + */ + public function last() + { + return end($this->_elements); + } + + /** + * Gets the current key/index at the current internal iterator position. + * + * @return mixed + */ + public function key() + { + return key($this->_elements); + } + + /** + * Moves the internal iterator position to the next element. + * + * @return mixed + */ + public function next() + { + return next($this->_elements); + } + + /** + * Gets the element of the collection at the current internal iterator position. + * + * @return mixed + */ + public function current() + { + return current($this->_elements); + } + + /** + * Removes an element with a specific key/index from the collection. + * + * @param mixed $key + * @return mixed The removed element or NULL, if no element exists for the given key. + */ + public function remove($key) + { + if (isset($this->_elements[$key])) { + $removed = $this->_elements[$key]; + unset($this->_elements[$key]); + + return $removed; + } + + return null; + } + + /** + * Removes the specified element from the collection, if it is found. + * + * @param mixed $element The element to remove. + * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. + */ + public function removeElement($element) + { + $key = array_search($element, $this->_elements, true); + + if ($key !== false) { + unset($this->_elements[$key]); + + return true; + } + + return false; + } + + /** + * ArrayAccess implementation of offsetExists() + * + * @see containsKey() + */ + public function offsetExists($offset) + { + return $this->containsKey($offset); + } + + /** + * ArrayAccess implementation of offsetGet() + * + * @see get() + */ + public function offsetGet($offset) + { + return $this->get($offset); + } + + /** + * ArrayAccess implementation of offsetGet() + * + * @see add() + * @see set() + */ + public function offsetSet($offset, $value) + { + if ( ! isset($offset)) { + return $this->add($value); + } + return $this->set($offset, $value); + } + + /** + * ArrayAccess implementation of offsetUnset() + * + * @see remove() + */ + public function offsetUnset($offset) + { + return $this->remove($offset); + } + + /** + * Checks whether the collection contains a specific key/index. + * + * @param mixed $key The key to check for. + * @return boolean TRUE if the given key/index exists, FALSE otherwise. + */ + public function containsKey($key) + { + return isset($this->_elements[$key]); + } + + /** + * Checks whether the given element is contained in the collection. + * Only element values are compared, not keys. The comparison of two elements + * is strict, that means not only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element + * @return boolean TRUE if the given element is contained in the collection, + * FALSE otherwise. + */ + public function contains($element) + { + foreach ($this->_elements as $collectionElement) { + if ($element === $collectionElement) { + return true; + } + } + + return false; + } + + /** + * Tests for the existance of an element that satisfies the given predicate. + * + * @param Closure $p The predicate. + * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. + */ + public function exists(Closure $p) + { + foreach ($this->_elements as $key => $element) { + if ($p($key, $element)) { + return true; + } + } + return false; + } + + /** + * Searches for a given element and, if found, returns the corresponding key/index + * of that element. The comparison of two elements is strict, that means not + * only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element The element to search for. + * @return mixed The key/index of the element or FALSE if the element was not found. + */ + public function indexOf($element) + { + return array_search($element, $this->_elements, true); + } + + /** + * Gets the element with the given key/index. + * + * @param mixed $key The key. + * @return mixed The element or NULL, if no element exists for the given key. + */ + public function get($key) + { + if (isset($this->_elements[$key])) { + return $this->_elements[$key]; + } + return null; + } + + /** + * Gets all keys/indexes of the collection elements. + * + * @return array + */ + public function getKeys() + { + return array_keys($this->_elements); + } + + /** + * Gets all elements. + * + * @return array + */ + public function getValues() + { + return array_values($this->_elements); + } + + /** + * Returns the number of elements in the collection. + * + * Implementation of the Countable interface. + * + * @return integer The number of elements in the collection. + */ + public function count() + { + return count($this->_elements); + } + + /** + * Adds/sets an element in the collection at the index / with the specified key. + * + * When the collection is a Map this is like put(key,value)/add(key,value). + * When the collection is a List this is like add(position,value). + * + * @param mixed $key + * @param mixed $value + */ + public function set($key, $value) + { + $this->_elements[$key] = $value; + } + + /** + * Adds an element to the collection. + * + * @param mixed $value + * @return boolean Always TRUE. + */ + public function add($value) + { + $this->_elements[] = $value; + return true; + } + + /** + * Checks whether the collection is empty. + * + * Note: This is preferrable over count() == 0. + * + * @return boolean TRUE if the collection is empty, FALSE otherwise. + */ + public function isEmpty() + { + return ! $this->_elements; + } + + /** + * Gets an iterator for iterating over the elements in the collection. + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_elements); + } + + /** + * Applies the given function to each element in the collection and returns + * a new collection with the elements returned by the function. + * + * @param Closure $func + * @return Collection + */ + public function map(Closure $func) + { + return new static(array_map($func, $this->_elements)); + } + + /** + * Returns all the elements of this collection that satisfy the predicate p. + * The order of the elements is preserved. + * + * @param Closure $p The predicate used for filtering. + * @return Collection A collection with the results of the filter operation. + */ + public function filter(Closure $p) + { + return new static(array_filter($this->_elements, $p)); + } + + /** + * Applies the given predicate p to all elements of this collection, + * returning true, if the predicate yields true for all elements. + * + * @param Closure $p The predicate. + * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. + */ + public function forAll(Closure $p) + { + foreach ($this->_elements as $key => $element) { + if ( ! $p($key, $element)) { + return false; + } + } + + return true; + } + + /** + * Partitions this collection in two collections according to a predicate. + * Keys are preserved in the resulting collections. + * + * @param Closure $p The predicate on which to partition. + * @return array An array with two elements. The first element contains the collection + * of elements where the predicate returned TRUE, the second element + * contains the collection of elements where the predicate returned FALSE. + */ + public function partition(Closure $p) + { + $coll1 = $coll2 = array(); + foreach ($this->_elements as $key => $element) { + if ($p($key, $element)) { + $coll1[$key] = $element; + } else { + $coll2[$key] = $element; + } + } + return array(new static($coll1), new static($coll2)); + } + + /** + * Returns a string representation of this object. + * + * @return string + */ + public function __toString() + { + return __CLASS__ . '@' . spl_object_hash($this); + } + + /** + * Clears the collection. + */ + public function clear() + { + $this->_elements = array(); + } + + /** + * Extract a slice of $length elements starting at position $offset from the Collection. + * + * If $length is null it returns all elements from $offset to the end of the Collection. + * Keys have to be preserved by this method. Calling this method will only return the + * selected slice and NOT change the elements contained in the collection slice is called on. + * + * @param int $offset + * @param int $length + * @return array + */ + public function slice($offset, $length = null) + { + return array_slice($this->_elements, $offset, $length, true); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php new file mode 100644 index 00000000..9fca659c --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php @@ -0,0 +1,243 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Closure, Countable, IteratorAggregate, ArrayAccess; + +/** + * The missing (SPL) Collection/Array/OrderedMap interface. + * + * A Collection resembles the nature of a regular PHP array. That is, + * it is essentially an ordered map that can also be used + * like a list. + * + * A Collection has an internal iterator just like a PHP array. In addition, + * a Collection can be iterated with external iterators, which is preferrable. + * To use an external iterator simply use the foreach language construct to + * iterate over the collection (which calls {@link getIterator()} internally) or + * explicitly retrieve an iterator though {@link getIterator()} which can then be + * used to iterate over the collection. + * You can not rely on the internal iterator of the collection being at a certain + * position unless you explicitly positioned it before. Prefer iteration with + * external iterators. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface Collection extends Countable, IteratorAggregate, ArrayAccess +{ + /** + * Adds an element at the end of the collection. + * + * @param mixed $element The element to add. + * @return boolean Always TRUE. + */ + function add($element); + + /** + * Clears the collection, removing all elements. + */ + function clear(); + + /** + * Checks whether an element is contained in the collection. + * This is an O(n) operation, where n is the size of the collection. + * + * @param mixed $element The element to search for. + * @return boolean TRUE if the collection contains the element, FALSE otherwise. + */ + function contains($element); + + /** + * Checks whether the collection is empty (contains no elements). + * + * @return boolean TRUE if the collection is empty, FALSE otherwise. + */ + function isEmpty(); + + /** + * Removes the element at the specified index from the collection. + * + * @param string|integer $key The kex/index of the element to remove. + * @return mixed The removed element or NULL, if the collection did not contain the element. + */ + function remove($key); + + /** + * Removes the specified element from the collection, if it is found. + * + * @param mixed $element The element to remove. + * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. + */ + function removeElement($element); + + /** + * Checks whether the collection contains an element with the specified key/index. + * + * @param string|integer $key The key/index to check for. + * @return boolean TRUE if the collection contains an element with the specified key/index, + * FALSE otherwise. + */ + function containsKey($key); + + /** + * Gets the element at the specified key/index. + * + * @param string|integer $key The key/index of the element to retrieve. + * @return mixed + */ + function get($key); + + /** + * Gets all keys/indices of the collection. + * + * @return array The keys/indices of the collection, in the order of the corresponding + * elements in the collection. + */ + function getKeys(); + + /** + * Gets all values of the collection. + * + * @return array The values of all elements in the collection, in the order they + * appear in the collection. + */ + function getValues(); + + /** + * Sets an element in the collection at the specified key/index. + * + * @param string|integer $key The key/index of the element to set. + * @param mixed $value The element to set. + */ + function set($key, $value); + + /** + * Gets a native PHP array representation of the collection. + * + * @return array + */ + function toArray(); + + /** + * Sets the internal iterator to the first element in the collection and + * returns this element. + * + * @return mixed + */ + function first(); + + /** + * Sets the internal iterator to the last element in the collection and + * returns this element. + * + * @return mixed + */ + function last(); + + /** + * Gets the key/index of the element at the current iterator position. + * + */ + function key(); + + /** + * Gets the element of the collection at the current iterator position. + * + */ + function current(); + + /** + * Moves the internal iterator position to the next element. + * + */ + function next(); + + /** + * Tests for the existence of an element that satisfies the given predicate. + * + * @param Closure $p The predicate. + * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. + */ + function exists(Closure $p); + + /** + * Returns all the elements of this collection that satisfy the predicate p. + * The order of the elements is preserved. + * + * @param Closure $p The predicate used for filtering. + * @return Collection A collection with the results of the filter operation. + */ + function filter(Closure $p); + + /** + * Applies the given predicate p to all elements of this collection, + * returning true, if the predicate yields true for all elements. + * + * @param Closure $p The predicate. + * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. + */ + function forAll(Closure $p); + + /** + * Applies the given function to each element in the collection and returns + * a new collection with the elements returned by the function. + * + * @param Closure $func + * @return Collection + */ + function map(Closure $func); + + /** + * Partitions this collection in two collections according to a predicate. + * Keys are preserved in the resulting collections. + * + * @param Closure $p The predicate on which to partition. + * @return array An array with two elements. The first element contains the collection + * of elements where the predicate returned TRUE, the second element + * contains the collection of elements where the predicate returned FALSE. + */ + function partition(Closure $p); + + /** + * Gets the index/key of a given element. The comparison of two elements is strict, + * that means not only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element The element to search for. + * @return mixed The key/index of the element or FALSE if the element was not found. + */ + function indexOf($element); + + /** + * Extract a slice of $length elements starting at position $offset from the Collection. + * + * If $length is null it returns all elements from $offset to the end of the Collection. + * Keys have to be preserved by this method. Calling this method will only return the + * selected slice and NOT change the elements contained in the collection slice is called on. + * + * @param int $offset + * @param int $length + * @return array + */ + function slice($offset, $length = null); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php new file mode 100644 index 00000000..8c5669be --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php @@ -0,0 +1,28 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Base exception class for package Doctrine\Common + * @author heinrich + * + */ +class CommonException extends \Exception { +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php new file mode 100644 index 00000000..bc95d303 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php @@ -0,0 +1,47 @@ +. + */ + + +namespace Doctrine\Common; + +/** + * Comparable interface that allows to compare two value objects to each other for similarity. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.com + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + */ +interface Comparable +{ + /** + * Compare the current object to the passed $other. + * + * Returns 0 if they are semantically equal, 1 if the other object + * is less than the current one, or -1 if its more than the current one. + * + * This method should not check for identity using ===, only for semantical equality for example + * when two different DateTime instances point to the exact same Date + TZ. + * + * @return int + */ + public function compareTo($other); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php new file mode 100644 index 00000000..6a3c0699 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php @@ -0,0 +1,69 @@ +. + */ + +namespace Doctrine\Common; + +/** + * EventArgs is the base class for classes containing event data. + * + * This class contains no event data. It is used by events that do not pass state + * information to an event handler when an event is raised. The single empty EventArgs + * instance can be obtained through {@link getEmptyInstance}. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class EventArgs +{ + /** + * @var EventArgs Single instance of EventArgs + * @static + */ + private static $_emptyEventArgsInstance; + + /** + * Gets the single, empty and immutable EventArgs instance. + * + * This instance will be used when events are dispatched without any parameter, + * like this: EventManager::dispatchEvent('eventname'); + * + * The benefit from this is that only one empty instance is instantiated and shared + * (otherwise there would be instances for every dispatched in the abovementioned form) + * + * @see EventManager::dispatchEvent + * @link http://msdn.microsoft.com/en-us/library/system.eventargs.aspx + * @static + * @return EventArgs + */ + public static function getEmptyInstance() + { + if ( ! self::$_emptyEventArgsInstance) { + self::$_emptyEventArgsInstance = new EventArgs; + } + + return self::$_emptyEventArgsInstance; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php new file mode 100644 index 00000000..a1f11ed2 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php @@ -0,0 +1,136 @@ +. + */ + +namespace Doctrine\Common; + +/** + * The EventManager is the central point of Doctrine's event listener system. + * Listeners are registered on the manager and events are dispatched through the + * manager. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class EventManager +{ + /** + * Map of registered listeners. + * => + * + * @var array + */ + private $_listeners = array(); + + /** + * Dispatches an event to all registered listeners. + * + * @param string $eventName The name of the event to dispatch. The name of the event is + * the name of the method that is invoked on listeners. + * @param EventArgs $eventArgs The event arguments to pass to the event handlers/listeners. + * If not supplied, the single empty EventArgs instance is used. + * @return boolean + */ + public function dispatchEvent($eventName, EventArgs $eventArgs = null) + { + if (isset($this->_listeners[$eventName])) { + $eventArgs = $eventArgs === null ? EventArgs::getEmptyInstance() : $eventArgs; + + foreach ($this->_listeners[$eventName] as $listener) { + $listener->$eventName($eventArgs); + } + } + } + + /** + * Gets the listeners of a specific event or all listeners. + * + * @param string $event The name of the event. + * @return array The event listeners for the specified event, or all event listeners. + */ + public function getListeners($event = null) + { + return $event ? $this->_listeners[$event] : $this->_listeners; + } + + /** + * Checks whether an event has any registered listeners. + * + * @param string $event + * @return boolean TRUE if the specified event has any listeners, FALSE otherwise. + */ + public function hasListeners($event) + { + return isset($this->_listeners[$event]) && $this->_listeners[$event]; + } + + /** + * Adds an event listener that listens on the specified events. + * + * @param string|array $events The event(s) to listen on. + * @param object $listener The listener object. + */ + public function addEventListener($events, $listener) + { + // Picks the hash code related to that listener + $hash = spl_object_hash($listener); + + foreach ((array) $events as $event) { + // Overrides listener if a previous one was associated already + // Prevents duplicate listeners on same event (same instance only) + $this->_listeners[$event][$hash] = $listener; + } + } + + /** + * Removes an event listener from the specified events. + * + * @param string|array $events + * @param object $listener + */ + public function removeEventListener($events, $listener) + { + // Picks the hash code related to that listener + $hash = spl_object_hash($listener); + + foreach ((array) $events as $event) { + // Check if actually have this listener associated + if (isset($this->_listeners[$event][$hash])) { + unset($this->_listeners[$event][$hash]); + } + } + } + + /** + * Adds an EventSubscriber. The subscriber is asked for all the events he is + * interested in and added as a listener for these events. + * + * @param Doctrine\Common\EventSubscriber $subscriber The subscriber. + */ + public function addEventSubscriber(EventSubscriber $subscriber) + { + $this->addEventListener($subscriber->getSubscribedEvents(), $subscriber); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php new file mode 100644 index 00000000..ed3383fa --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php @@ -0,0 +1,45 @@ +. + */ + +namespace Doctrine\Common; + +/** + * An EventSubscriber knows himself what events he is interested in. + * If an EventSubscriber is added to an EventManager, the manager invokes + * {@link getSubscribedEvents} and registers the subscriber as a listener for all + * returned events. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface EventSubscriber +{ + /** + * Returns an array of events this subscriber wants to listen to. + * + * @return array + */ + function getSubscribedEvents(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php new file mode 100644 index 00000000..8df3b843 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php @@ -0,0 +1,266 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Base class for writing simple lexers, i.e. for creating small DSLs. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @todo Rename: AbstractLexer + */ +abstract class Lexer +{ + /** + * @var array Array of scanned tokens + */ + private $tokens = array(); + + /** + * @var integer Current lexer position in input string + */ + private $position = 0; + + /** + * @var integer Current peek of current lexer position + */ + private $peek = 0; + + /** + * @var array The next token in the input. + */ + public $lookahead; + + /** + * @var array The last matched/seen token. + */ + public $token; + + /** + * Sets the input data to be tokenized. + * + * The Lexer is immediately reset and the new input tokenized. + * Any unprocessed tokens from any previous input are lost. + * + * @param string $input The input to be tokenized. + */ + public function setInput($input) + { + $this->tokens = array(); + $this->reset(); + $this->scan($input); + } + + /** + * Resets the lexer. + */ + public function reset() + { + $this->lookahead = null; + $this->token = null; + $this->peek = 0; + $this->position = 0; + } + + /** + * Resets the peek pointer to 0. + */ + public function resetPeek() + { + $this->peek = 0; + } + + /** + * Resets the lexer position on the input to the given position. + * + * @param integer $position Position to place the lexical scanner + */ + public function resetPosition($position = 0) + { + $this->position = $position; + } + + /** + * Checks whether a given token matches the current lookahead. + * + * @param integer|string $token + * @return boolean + */ + public function isNextToken($token) + { + return null !== $this->lookahead && $this->lookahead['type'] === $token; + } + + /** + * Checks whether any of the given tokens matches the current lookahead + * + * @param array $tokens + * @return boolean + */ + public function isNextTokenAny(array $tokens) + { + return null !== $this->lookahead && in_array($this->lookahead['type'], $tokens, true); + } + + /** + * Moves to the next token in the input string. + * + * A token is an associative array containing three items: + * - 'value' : the string value of the token in the input string + * - 'type' : the type of the token (identifier, numeric, string, input + * parameter, none) + * - 'position' : the position of the token in the input string + * + * @return array|null the next token; null if there is no more tokens left + */ + public function moveNext() + { + $this->peek = 0; + $this->token = $this->lookahead; + $this->lookahead = (isset($this->tokens[$this->position])) + ? $this->tokens[$this->position++] : null; + + return $this->lookahead !== null; + } + + /** + * Tells the lexer to skip input tokens until it sees a token with the given value. + * + * @param $type The token type to skip until. + */ + public function skipUntil($type) + { + while ($this->lookahead !== null && $this->lookahead['type'] !== $type) { + $this->moveNext(); + } + } + + /** + * Checks if given value is identical to the given token + * + * @param mixed $value + * @param integer $token + * @return boolean + */ + public function isA($value, $token) + { + return $this->getType($value) === $token; + } + + /** + * Moves the lookahead token forward. + * + * @return array | null The next token or NULL if there are no more tokens ahead. + */ + public function peek() + { + if (isset($this->tokens[$this->position + $this->peek])) { + return $this->tokens[$this->position + $this->peek++]; + } else { + return null; + } + } + + /** + * Peeks at the next token, returns it and immediately resets the peek. + * + * @return array|null The next token or NULL if there are no more tokens ahead. + */ + public function glimpse() + { + $peek = $this->peek(); + $this->peek = 0; + return $peek; + } + + /** + * Scans the input string for tokens. + * + * @param string $input a query string + */ + protected function scan($input) + { + static $regex; + + if ( ! isset($regex)) { + $regex = '/(' . implode(')|(', $this->getCatchablePatterns()) . ')|' + . implode('|', $this->getNonCatchablePatterns()) . '/i'; + } + + $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE; + $matches = preg_split($regex, $input, -1, $flags); + + foreach ($matches as $match) { + // Must remain before 'value' assignment since it can change content + $type = $this->getType($match[0]); + + $this->tokens[] = array( + 'value' => $match[0], + 'type' => $type, + 'position' => $match[1], + ); + } + } + + /** + * Gets the literal for a given token. + * + * @param integer $token + * @return string + */ + public function getLiteral($token) + { + $className = get_class($this); + $reflClass = new \ReflectionClass($className); + $constants = $reflClass->getConstants(); + + foreach ($constants as $name => $value) { + if ($value === $token) { + return $className . '::' . $name; + } + } + + return $token; + } + + /** + * Lexical catchable patterns. + * + * @return array + */ + abstract protected function getCatchablePatterns(); + + /** + * Lexical non-catchable patterns. + * + * @return array + */ + abstract protected function getNonCatchablePatterns(); + + /** + * Retrieve token type. Also processes the token value if necessary. + * + * @param string $value + * @return integer + */ + abstract protected function getType(&$value); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php new file mode 100644 index 00000000..93e504ae --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php @@ -0,0 +1,45 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Contract for classes that provide the service of notifying listeners of + * changes to their properties. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface NotifyPropertyChanged +{ + /** + * Adds a listener that wants to be notified about property changes. + * + * @param PropertyChangedListener $listener + */ + function addPropertyChangedListener(PropertyChangedListener $listener); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php new file mode 100644 index 00000000..9fff343c --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php @@ -0,0 +1,224 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\ManagerRegistry; + +/** + * Abstract implementation of the ManagerRegistry contract. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +abstract class AbstractManagerRegistry implements ManagerRegistry +{ + private $name; + private $connections; + private $managers; + private $defaultConnection; + private $defaultManager; + private $proxyInterfaceName; + + public function __construct($name, array $connections, array $managers, $defaultConnection, $defaultManager, $proxyInterfaceName) + { + $this->name = $name; + $this->connections = $connections; + $this->managers = $managers; + $this->defaultConnection = $defaultConnection; + $this->defaultManager = $defaultManager; + $this->proxyInterfaceName = $proxyInterfaceName; + } + + /** + * Fetches/creates the given services + * + * A service in this context is connection or a manager instance + * + * @param string $name name of the service + * @return object instance of the given service + */ + abstract protected function getService($name); + + /** + * Resets the given services + * + * A service in this context is connection or a manager instance + * + * @param string $name name of the service + * @return void + */ + abstract protected function resetService($name); + + /** + * Get the name of the registry + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @inheritdoc + */ + public function getConnection($name = null) + { + if (null === $name) { + $name = $this->defaultConnection; + } + + if (!isset($this->connections[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Connection named "%s" does not exist.', $this->name, $name)); + } + + return $this->getService($this->connections[$name]); + } + + /** + * @inheritdoc + */ + public function getConnectionNames() + { + return $this->connections; + } + + /** + * @inheritdoc + */ + public function getConnections() + { + $connections = array(); + foreach ($this->connections as $name => $id) { + $connections[$name] = $this->getService($id); + } + + return $connections; + } + + /** + * @inheritdoc + */ + public function getDefaultConnectionName() + { + return $this->defaultConnection; + } + + /** + * @inheritdoc + */ + public function getDefaultManagerName() + { + return $this->defaultManager; + } + + /** + * @inheritdoc + */ + public function getManager($name = null) + { + if (null === $name) { + $name = $this->defaultManager; + } + + if (!isset($this->managers[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); + } + + return $this->getService($this->managers[$name]); + } + + /** + * @inheritdoc + */ + public function getManagerForClass($class) + { + // Check for namespace alias + if (strpos($class, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $class); + $class = $this->getAliasNamespace($namespaceAlias) . '\\' . $simpleClassName; + } + + $proxyClass = new \ReflectionClass($class); + if ($proxyClass->implementsInterface($this->proxyInterfaceName)) { + $class = $proxyClass->getParentClass()->getName(); + } + + foreach ($this->managers as $id) { + $manager = $this->getService($id); + + if (!$manager->getMetadataFactory()->isTransient($class)) { + return $manager; + } + } + } + + /** + * @inheritdoc + */ + public function getManagerNames() + { + return $this->managers; + } + + /** + * @inheritdoc + */ + public function getManagers() + { + $dms = array(); + foreach ($this->managers as $name => $id) { + $dms[$name] = $this->getService($id); + } + + return $dms; + } + + /** + * @inheritdoc + */ + public function getRepository($persistentObjectName, $persistentManagerName = null) + { + return $this->getManager($persistentManagerName)->getRepository($persistentObjectName); + } + + /** + * @inheritdoc + */ + public function resetManager($name = null) + { + if (null === $name) { + $name = $this->defaultManager; + } + + if (!isset($this->managers[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); + } + + // force the creation of a new document manager + // if the current one is closed + $this->resetService($this->managers[$name]); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php new file mode 100644 index 00000000..a47727fa --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php @@ -0,0 +1,63 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract covering connection for a Doctrine persistence layer ManagerRegistry class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +interface ConnectionRegistry +{ + /** + * Gets the default connection name. + * + * @return string The default connection name + */ + function getDefaultConnectionName(); + + /** + * Gets the named connection. + * + * @param string $name The connection name (null for the default one) + * + * @return Connection + */ + function getConnection($name = null); + + /** + * Gets an array of all registered connections + * + * @return array An array of Connection instances + */ + function getConnections(); + + /** + * Gets all connection names. + * + * @return array An array of connection names + */ + function getConnectionNames(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php new file mode 100644 index 00000000..8055b66d --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php @@ -0,0 +1,77 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs; +use Doctrine\Common\Persistence\ObjectManager; + +/** + * Lifecycle Events are triggered by the UnitOfWork during lifecycle transitions + * of entities. + * + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class LifecycleEventArgs extends EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var object + */ + private $entity; + + /** + * Constructor + * + * @param object $entity + * @param ObjectManager $objectManager + */ + public function __construct($entity, ObjectManager $objectManager) + { + $this->entity = $entity; + $this->objectManager = $objectManager; + } + + /** + * Retireve associated Entity. + * + * @return object + */ + public function getEntity() + { + return $this->entity; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php new file mode 100644 index 00000000..4a18d167 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php @@ -0,0 +1,76 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs; +use Doctrine\Common\Persistence\ObjectManager; +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Class that holds event arguments for a loadMetadata event. + * + * @author Jonathan H. Wage + * @since 2.2 + */ +class LoadClassMetadataEventArgs extends EventArgs +{ + /** + * @var ClassMetadata + */ + private $classMetadata; + + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * Constructor. + * + * @param ClasseMetadata $classMetadata + * @param ObjectManager $objectManager + */ + public function __construct(ClassMetadata $classMetadata, ObjectManager $objectManager) + { + $this->classMetadata = $classMetadata; + $this->objectManager = $objectManager; + } + + /** + * Retrieve associated ClassMetadata. + * + * @return ClassMetadata + */ + public function getClassMetadata() + { + return $this->classMetadata; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php new file mode 100644 index 00000000..33c4d796 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php @@ -0,0 +1,59 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\Persistence\ObjectManager; + +/** + * Provides event arguments for the preFlush event. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class ManagerEventArgs extends \Doctrine\Common\EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * Constructor. + * + * @param ObjectManager $objectManager + */ + public function __construct(ObjectManager $objectManager) + { + $this->objectManager = $objectManager; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php new file mode 100644 index 00000000..f67ab50e --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php @@ -0,0 +1,84 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +/** + * Provides event arguments for the onClear event. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class OnClearEventArgs extends \Doctrine\Common\EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var string + */ + private $entityClass; + + /** + * Constructor. + * + * @param ObjectManager $objectManager + * @param string $entityClass Optional entity class + */ + public function __construct($objectManager, $entityClass = null) + { + $this->objectManager = $objectManager; + $this->entityClass = $entityClass; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } + + /** + * Name of the entity class that is cleared, or empty if all are cleared. + * + * @return string + */ + public function getEntityClass() + { + return $this->entityClass; + } + + /** + * Check if event clears all entities. + * + * @return bool + */ + public function clearsAllEntities() + { + return ($this->entityClass === null); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php new file mode 100644 index 00000000..191d053a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php @@ -0,0 +1,129 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs, + Doctrine\Common\Persistence\ObjectManager; + +/** + * Class that holds event arguments for a preUpdate event. + * + * @author Guilherme Blanco + * @author Roman Borschel + * @author Benjamin Eberlei + * @since 2.2 + */ +class PreUpdateEventArgs extends LifecycleEventArgs +{ + /** + * @var array + */ + private $entityChangeSet; + + /** + * Constructor. + * + * @param object $entity + * @param ObjectManager $objectManager + * @param array $changeSet + */ + public function __construct($entity, ObjectManager $objectManager, array &$changeSet) + { + parent::__construct($entity, $objectManager); + + $this->entityChangeSet = &$changeSet; + } + + /** + * Retrieve entity changeset. + * + * @return array + */ + public function getEntityChangeSet() + { + return $this->entityChangeSet; + } + + /** + * Check if field has a changeset. + * + * @return boolean + */ + public function hasChangedField($field) + { + return isset($this->entityChangeSet[$field]); + } + + /** + * Get the old value of the changeset of the changed field. + * + * @param string $field + * @return mixed + */ + public function getOldValue($field) + { + $this->assertValidField($field); + + return $this->entityChangeSet[$field][0]; + } + + /** + * Get the new value of the changeset of the changed field. + * + * @param string $field + * @return mixed + */ + public function getNewValue($field) + { + $this->assertValidField($field); + + return $this->entityChangeSet[$field][1]; + } + + /** + * Set the new value of this field. + * + * @param string $field + * @param mixed $value + */ + public function setNewValue($field, $value) + { + $this->assertValidField($field); + + $this->entityChangeSet[$field][1] = $value; + } + + /** + * Assert the field exists in changeset. + * + * @param string $field + */ + private function assertValidField($field) + { + if ( ! isset($this->entityChangeSet[$field])) { + throw new \InvalidArgumentException(sprintf( + 'Field "%s" is not a valid field of the entity "%s" in PreUpdateEventArgs.', + $field, + get_class($this->getEntity()) + )); + } + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php new file mode 100644 index 00000000..4d92426b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php @@ -0,0 +1,112 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract covering object managers for a Doctrine persistence layer ManagerRegistry class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +interface ManagerRegistry extends ConnectionRegistry +{ + /** + * Gets the default object manager name. + * + * @return string The default object manager name + */ + function getDefaultManagerName(); + + /** + * Gets a named object manager. + * + * @param string $name The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectManager + */ + function getManager($name = null); + + /** + * Gets an array of all registered object managers + * + * @return array An array of ObjectManager instances + */ + function getManagers(); + + /** + * Resets a named object manager. + * + * This method is useful when an object manager has been closed + * because of a rollbacked transaction AND when you think that + * it makes sense to get a new one to replace the closed one. + * + * Be warned that you will get a brand new object manager as + * the existing one is not useable anymore. This means that any + * other object with a dependency on this object manager will + * hold an obsolete reference. You can inject the registry instead + * to avoid this problem. + * + * @param string $name The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectManager + */ + function resetManager($name = null); + + /** + * Resolves a registered namespace alias to the full namespace. + * + * This method looks for the alias in all registered object managers. + * + * @param string $alias The alias + * + * @return string The full namespace + */ + function getAliasNamespace($alias); + + /** + * Gets all connection names. + * + * @return array An array of connection names + */ + function getManagerNames(); + + /** + * Gets the ObjectRepository for an persistent object. + * + * @param string $persistentObject The name of the persistent object. + * @param string $persistentManagerName The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectRepository + */ + function getRepository($persistentObject, $persistentManagerName = null); + + /** + * Gets the object manager associated with a given class. + * + * @param string $class A persistent object class name + * + * @return \Doctrine\Common\Persistence\ObjectManager|null + */ + function getManagerForClass($class); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php new file mode 100644 index 00000000..a2a61850 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php @@ -0,0 +1,359 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use Doctrine\Common\Cache\Cache; + +/** + * The ClassMetadataFactory is used to create ClassMetadata objects that contain all the + * metadata mapping informations of a class which describes how a class should be mapped + * to a relational database. + * + * This class was abstracted from the ORM ClassMetadataFactory + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +abstract class AbstractClassMetadataFactory implements ClassMetadataFactory +{ + /** + * Salt used by specific Object Manager implementation. + * + * @var string + */ + protected $cacheSalt = "\$CLASSMETADATA"; + + /** + * @var \Doctrine\Common\Cache\Cache + */ + private $cacheDriver; + + /** + * @var array + */ + private $loadedMetadata = array(); + + /** + * @var bool + */ + protected $initialized = false; + + /** + * @var ReflectionService + */ + private $reflectionService; + + /** + * Sets the cache driver used by the factory to cache ClassMetadata instances. + * + * @param Doctrine\Common\Cache\Cache $cacheDriver + */ + public function setCacheDriver(Cache $cacheDriver = null) + { + $this->cacheDriver = $cacheDriver; + } + + /** + * Gets the cache driver used by the factory to cache ClassMetadata instances. + * + * @return Doctrine\Common\Cache\Cache + */ + public function getCacheDriver() + { + return $this->cacheDriver; + } + + /** + * Return an array of all the loaded metadata currently in memory. + * + * @return array + */ + public function getLoadedMetadata() + { + return $this->loadedMetadata; + } + + /** + * Forces the factory to load the metadata of all classes known to the underlying + * mapping driver. + * + * @return array The ClassMetadata instances of all mapped classes. + */ + public function getAllMetadata() + { + if ( ! $this->initialized) { + $this->initialize(); + } + + $driver = $this->getDriver(); + $metadata = array(); + foreach ($driver->getAllClassNames() as $className) { + $metadata[] = $this->getMetadataFor($className); + } + + return $metadata; + } + + /** + * Lazy initialization of this stuff, especially the metadata driver, + * since these are not needed at all when a metadata cache is active. + * + * @return void + */ + abstract protected function initialize(); + + /** + * Get the fully qualified class-name from the namespace alias. + * + * @param string $namespaceAlias + * @param string $simpleClassName + * @return string + */ + abstract protected function getFqcnFromAlias($namespaceAlias, $simpleClassName); + + /** + * Return the mapping driver implementation. + * + * @return MappingDriver + */ + abstract protected function getDriver(); + + /** + * Wakeup reflection after ClassMetadata gets unserialized from cache. + * + * @param ClassMetadata $class + * @param ReflectionService $reflService + * @return void + */ + abstract protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService); + + /** + * Initialize Reflection after ClassMetadata was constructed. + * + * @param ClassMetadata $class + * @param ReflectionSErvice $reflService + * @return void + */ + abstract protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService); + + /** + * Gets the class metadata descriptor for a class. + * + * @param string $className The name of the class. + * @return Doctrine\Common\Persistence\Mapping\ClassMetadata + */ + public function getMetadataFor($className) + { + if ( ! isset($this->loadedMetadata[$className])) { + $realClassName = $className; + + // Check for namespace alias + if (strpos($className, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $className); + $realClassName = $this->getFqcnFromAlias($namespaceAlias, $simpleClassName); + + if (isset($this->loadedMetadata[$realClassName])) { + // We do not have the alias name in the map, include it + $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; + + return $this->loadedMetadata[$realClassName]; + } + } + + if ($this->cacheDriver) { + if (($cached = $this->cacheDriver->fetch($realClassName . $this->cacheSalt)) !== false) { + $this->loadedMetadata[$realClassName] = $cached; + $this->wakeupReflection($cached, $this->getReflectionService()); + } else { + foreach ($this->loadMetadata($realClassName) as $loadedClassName) { + $this->cacheDriver->save( + $loadedClassName . $this->cacheSalt, $this->loadedMetadata[$loadedClassName], null + ); + } + } + } else { + $this->loadMetadata($realClassName); + } + + if ($className != $realClassName) { + // We do not have the alias name in the map, include it + $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; + } + } + + return $this->loadedMetadata[$className]; + } + + /** + * Checks whether the factory has the metadata for a class loaded already. + * + * @param string $className + * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. + */ + public function hasMetadataFor($className) + { + return isset($this->loadedMetadata[$className]); + } + + /** + * Sets the metadata descriptor for a specific class. + * + * NOTE: This is only useful in very special cases, like when generating proxy classes. + * + * @param string $className + * @param ClassMetadata $class + */ + public function setMetadataFor($className, $class) + { + $this->loadedMetadata[$className] = $class; + } + + /** + * Get array of parent classes for the given entity class + * + * @param string $name + * @return array $parentClasses + */ + protected function getParentClasses($name) + { + // Collect parent classes, ignoring transient (not-mapped) classes. + $parentClasses = array(); + foreach (array_reverse($this->getReflectionService()->getParentClasses($name)) as $parentClass) { + if ( ! $this->getDriver()->isTransient($parentClass)) { + $parentClasses[] = $parentClass; + } + } + return $parentClasses; + } + + /** + * Loads the metadata of the class in question and all it's ancestors whose metadata + * is still not loaded. + * + * @param string $name The name of the class for which the metadata should get loaded. + * @param array $tables The metadata collection to which the loaded metadata is added. + */ + protected function loadMetadata($name) + { + if ( ! $this->initialized) { + $this->initialize(); + } + + $loaded = array(); + + $parentClasses = $this->getParentClasses($name); + $parentClasses[] = $name; + + // Move down the hierarchy of parent classes, starting from the topmost class + $parent = null; + $rootEntityFound = false; + $visited = array(); + $reflService = $this->getReflectionService(); + foreach ($parentClasses as $className) { + if (isset($this->loadedMetadata[$className])) { + $parent = $this->loadedMetadata[$className]; + if (isset($parent->isMappedSuperclass) && $parent->isMappedSuperclass === false) { + $rootEntityFound = true; + array_unshift($visited, $className); + } + continue; + } + + $class = $this->newClassMetadataInstance($className); + $this->initializeReflection($class, $reflService); + + $this->doLoadMetadata($class, $parent, $rootEntityFound); + + $this->loadedMetadata[$className] = $class; + + $parent = $class; + + if (isset($parent->isMappedSuperclass) && $class->isMappedSuperclass === false) { + $rootEntityFound = true; + array_unshift($visited, $className); + } + + $this->wakeupReflection($class, $reflService); + + $loaded[] = $className; + } + + return $loaded; + } + + /** + * Actually load the metadata from the underlying metadata + * + * @param ClassMetadata $class + * @param ClassMetadata $parent + * @param bool $rootEntityFound + * @return void + */ + abstract protected function doLoadMetadata($class, $parent, $rootEntityFound); + + /** + * Creates a new ClassMetadata instance for the given class name. + * + * @param string $className + * @return ClassMetadata + */ + abstract protected function newClassMetadataInstance($className); + + /** + * Check if this class is mapped by this Object Manager + ClassMetadata configuration + * + * @param $class + * @return bool + */ + public function isTransient($class) + { + if ( ! $this->initialized) { + $this->initialize(); + } + + return $this->getDriver()->isTransient($class); + } + + /** + * Set reflectionService. + * + * @param ReflectionService $reflectionService + */ + public function setReflectionService(ReflectionService $reflectionService) + { + $this->reflectionService = $reflectionService; + } + + /** + * Get the reflection service associated with this metadata factory. + * + * @return ReflectionService + */ + public function getReflectionService() + { + if ($this->reflectionService === null) { + $this->reflectionService = new RuntimeReflectionService(); + } + return $this->reflectionService; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php new file mode 100644 index 00000000..705d59ac --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php @@ -0,0 +1,165 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ClassMetadata +{ + /** + * Get fully-qualified class name of this persistent class. + * + * @return string + */ + function getName(); + + /** + * Gets the mapped identifier field name. + * + * The returned structure is an array of the identifier field names. + * + * @return array + */ + function getIdentifier(); + + /** + * Gets the ReflectionClass instance for this mapped class. + * + * @return ReflectionClass + */ + function getReflectionClass(); + + /** + * Checks if the given field name is a mapped identifier for this class. + * + * @param string $fieldName + * @return boolean + */ + function isIdentifier($fieldName); + + /** + * Checks if the given field is a mapped property for this class. + * + * @param string $fieldName + * @return boolean + */ + function hasField($fieldName); + + /** + * Checks if the given field is a mapped association for this class. + * + * @param string $fieldName + * @return boolean + */ + function hasAssociation($fieldName); + + /** + * Checks if the given field is a mapped single valued association for this class. + * + * @param string $fieldName + * @return boolean + */ + function isSingleValuedAssociation($fieldName); + + /** + * Checks if the given field is a mapped collection valued association for this class. + * + * @param string $fieldName + * @return boolean + */ + function isCollectionValuedAssociation($fieldName); + + /** + * A numerically indexed list of field names of this persistent class. + * + * This array includes identifier fields if present on this class. + * + * @return array + */ + function getFieldNames(); + + /** + * Returns an array of identifier field names numerically indexed. + * + * @return array + */ + function getIdentifierFieldNames(); + + /** + * A numerically indexed list of association names of this persistent class. + * + * This array includes identifier associations if present on this class. + * + * @return array + */ + function getAssociationNames(); + + /** + * Returns a type name of this field. + * + * This type names can be implementation specific but should at least include the php types: + * integer, string, boolean, float/double, datetime. + * + * @param string $fieldName + * @return string + */ + function getTypeOfField($fieldName); + + /** + * Returns the target class name of the given association. + * + * @param string $assocName + * @return string + */ + function getAssociationTargetClass($assocName); + + /** + * Checks if the association is the inverse side of a bidirectional association + * + * @param string $assocName + * @return boolean + */ + function isAssociationInverseSide($assocName); + + /** + * Returns the target field of the owning side of the association + * + * @param string $assocName + * @return string + */ + function getAssociationMappedByTargetField($assocName); + + /** + * Return the identifier of this object as an array with field name as key. + * + * Has to return an empty array if no identifier isset. + * + * @param object $object + * @return array + */ + function getIdentifierValues($object); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php new file mode 100644 index 00000000..bf27ba9a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php @@ -0,0 +1,74 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ClassMetadataFactory +{ + /** + * Forces the factory to load the metadata of all classes known to the underlying + * mapping driver. + * + * @return array The ClassMetadata instances of all mapped classes. + */ + function getAllMetadata(); + + /** + * Gets the class metadata descriptor for a class. + * + * @param string $className The name of the class. + * @return ClassMetadata + */ + function getMetadataFor($className); + + /** + * Checks whether the factory has the metadata for a class loaded already. + * + * @param string $className + * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. + */ + function hasMetadataFor($className); + + /** + * Sets the metadata descriptor for a specific class. + * + * @param string $className + * @param ClassMetadata $class + */ + function setMetadataFor($className, $class); + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped directly or as a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + function isTransient($className); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php new file mode 100644 index 00000000..f52d37ee --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php @@ -0,0 +1,214 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Cache\ArrayCache, + Doctrine\Common\Annotations\AnnotationReader, + Doctrine\Common\Annotations\AnnotationRegistry, + Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The AnnotationDriver reads the mapping metadata from docblock annotations. + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +abstract class AnnotationDriver implements MappingDriver +{ + /** + * The AnnotationReader. + * + * @var AnnotationReader + */ + protected $reader; + + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * The file extension of mapping documents. + * + * @var string + */ + protected $fileExtension = '.php'; + + /** + * Cache for AnnotationDriver#getAllClassNames() + * + * @var array + */ + protected $classNames; + + /** + * Name of the entity annotations as keys + * + * @var array + */ + protected $entityAnnotationClasses = array(); + + /** + * Initializes a new AnnotationDriver that uses the given AnnotationReader for reading + * docblock annotations. + * + * @param AnnotationReader $reader The AnnotationReader to use, duck-typed. + * @param string|array $paths One or multiple paths where mapping classes can be found. + */ + public function __construct($reader, $paths = null) + { + $this->reader = $reader; + if ($paths) { + $this->addPaths((array) $paths); + } + } + + /** + * Append lookup paths to metadata driver. + * + * @param array $paths + */ + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * Retrieve the defined metadata lookup paths. + * + * @return array + */ + public function getPaths() + { + return $this->paths; + } + + /** + * Retrieve the current annotation reader + * + * @return AnnotationReader + */ + public function getReader() + { + return $this->reader; + } + + /** + * Get the file extension used to look for mapping files under + * + * @return void + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * Whether the class with the specified name is transient. Only non-transient + * classes, that is entities and mapped superclasses, should have their metadata loaded. + * + * A class is non-transient if it is annotated with an annotation + * from the {@see AnnotationDriver::entityAnnotationClasses}. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + $classAnnotations = $this->reader->getClassAnnotations(new \ReflectionClass($className)); + + foreach ($classAnnotations as $annot) { + if (isset($this->entityAnnotationClasses[get_class($annot)])) { + return false; + } + } + return true; + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames() + { + if ($this->classNames !== null) { + return $this->classNames; + } + + if (!$this->paths) { + throw MappingException::pathRequired(); + } + + $classes = array(); + $includedFiles = array(); + + foreach ($this->paths as $path) { + if ( ! is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RegexIterator( + new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS), + \RecursiveIteratorIterator::LEAVES_ONLY + ), + '/^.+' . str_replace('.', '\.', $this->fileExtension) . '$/i', + \RecursiveRegexIterator::GET_MATCH + ); + + foreach ($iterator as $file) { + $sourceFile = realpath($file[0]); + + require_once $sourceFile; + + $includedFiles[] = $sourceFile; + } + } + + $declared = get_declared_classes(); + + foreach ($declared as $className) { + $rc = new \ReflectionClass($className); + $sourceFile = $rc->getFileName(); + if (in_array($sourceFile, $includedFiles) && ! $this->isTransient($className)) { + $classes[] = $className; + } + } + + $this->classNames = $classes; + + return $classes; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php new file mode 100644 index 00000000..efaf545e --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php @@ -0,0 +1,169 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * Locate the file that contains the metadata information for a given class name. + * + * This behavior is inpependent of the actual content of the file. It just detects + * the file which is responsible for the given class name. + * + * @author Benjamin Eberlei + * @author Johannes M. Schmitt + */ +class DefaultFileLocator implements FileLocator +{ + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * The file extension of mapping documents. + * + * @var string + */ + protected $fileExtension; + + /** + * Initializes a new FileDriver that looks in the given path(s) for mapping + * documents and operates in the specified operating mode. + * + * @param string|array $paths One or multiple paths where mapping documents can be found. + */ + public function __construct($paths, $fileExtension = null) + { + $this->addPaths((array) $paths); + $this->fileExtension = $fileExtension; + } + + /** + * Append lookup paths to metadata driver. + * + * @param array $paths + */ + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * Retrieve the defined metadata lookup paths. + * + * @return array + */ + public function getPaths() + { + return $this->paths; + } + + /** + * Get the file extension used to look for mapping files under + * + * @return void + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * {@inheritDoc} + */ + public function findMappingFile($className) + { + $fileName = str_replace('\\', '.', $className) . $this->fileExtension; + + // Check whether file exists + foreach ($this->paths as $path) { + if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { + return $path . DIRECTORY_SEPARATOR . $fileName; + } + } + + throw MappingException::mappingFileNotFound($className, $fileName); + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames($globalBasename) + { + $classes = array(); + + if ($this->paths) { + foreach ($this->paths as $path) { + if ( ! is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + $fileName = $file->getBasename($this->fileExtension); + + if ($fileName == $file->getBasename() || $fileName == $globalBasename) { + continue; + } + + // NOTE: All files found here means classes are not transient! + $classes[] = str_replace('.', '\\', $fileName); + } + } + } + + return $classes; + } + + /** + * {@inheritDoc} + */ + public function fileExists($className) + { + $fileName = str_replace('\\', '.', $className) . $this->fileExtension; + + // Check whether file exists + foreach ((array) $this->paths as $path) { + if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php new file mode 100644 index 00000000..22cf117d --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php @@ -0,0 +1,178 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * Base driver for file-based metadata drivers. + * + * A file driver operates in a mode where it loads the mapping files of individual + * classes on demand. This requires the user to adhere to the convention of 1 mapping + * file per class and the file names of the mapping files must correspond to the full + * class name, including namespace, with the namespace delimiters '\', replaced by dots '.'. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.com + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +abstract class FileDriver implements MappingDriver +{ + /** + * @var FileLocator + */ + protected $locator; + + /** + * @var array + */ + protected $classCache; + + /** + * @var string + */ + protected $globalBasename; + + /** + * Initializes a new FileDriver that looks in the given path(s) for mapping + * documents and operates in the specified operating mode. + * + * @param string|array|FileLocator $paths A FileLocator or one/multiple paths where mapping documents can be found. + * @param string $fileExtension + */ + public function __construct($locator, $fileExtension = null) + { + if ($locator instanceof FileLocator) { + $this->locator = $locator; + } else { + $this->locator = new DefaultFileLocator((array)$locator, $fileExtension); + } + } + + public function setGlobalBasename($file) + { + $this->globalBasename = $file; + } + + public function getGlobalBasename() + { + return $this->globalBasename; + } + + /** + * Get the element of schema meta data for the class from the mapping file. + * This will lazily load the mapping file if it is not loaded yet + * + * @return array $element The element of schema meta data + */ + public function getElement($className) + { + if ($this->classCache === null) { + $this->initialize(); + } + + if (isset($this->classCache[$className])) { + return $this->classCache[$className]; + } + + $result = $this->loadMappingFile($this->locator->findMappingFile($className)); + + return $result[$className]; + } + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped as an Entity or a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + if ($this->classCache === null) { + $this->initialize(); + } + + if (isset($this->classCache[$className])) { + return false; + } + + return !$this->locator->fileExists($className); + } + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + public function getAllClassNames() + { + if ($this->classCache === null) { + $this->initialize(); + } + + $classNames = (array)$this->locator->getAllClassNames($this->globalBasename); + if ($this->classCache) { + $classNames = array_merge(array_keys($this->classCache), $classNames); + } + return $classNames; + } + + /** + * Loads a mapping file with the given name and returns a map + * from class/entity names to their corresponding file driver elements. + * + * @param string $file The mapping file to load. + * @return array + */ + abstract protected function loadMappingFile($file); + + /** + * Initialize the class cache from all the global files. + * + * Using this feature adds a substantial performance hit to file drivers as + * more metadata has to be loaded into memory than might actually be + * necessary. This may not be relevant to scenarios where caching of + * metadata is in place, however hits very hard in scenarios where no + * caching is used. + * + * @return void + */ + protected function initialize() + { + $this->classCache = array(); + if (null !== $this->globalBasename) { + foreach ($this->locator->getPaths() as $path) { + $file = $path.'/'.$this->globalBasename.$this->locator->getFileExtension(); + if (is_file($file)) { + $this->classCache = array_merge( + $this->classCache, + $this->loadMappingFile($file) + ); + } + } + } + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php new file mode 100644 index 00000000..a1019d71 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php @@ -0,0 +1,69 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +/** + * Locate the file that contains the metadata information for a given class name. + * + * This behavior is inpependent of the actual content of the file. It just detects + * the file which is responsible for the given class name. + * + * @author Benjamin Eberlei + * @author Johannes M. Schmitt + */ +interface FileLocator +{ + /** + * Locate mapping file for the given class name. + * + * @param string $className + * @return string + */ + function findMappingFile($className); + + /** + * Get all class names that are found with this file locator. + * + * @param string $globalBasename Passed to allow excluding the basename + * @return array + */ + function getAllClassNames($globalBasename); + + /** + * Check if a file can be found for this class name. + * + * @return bool + */ + function fileExists($className); + + /** + * Get all the paths that this file locator looks for mapping files. + * + * @return array + */ + function getPaths(); + + /** + * Get the file extension that mapping files are suffixed with. + * + * @return string + */ + function getFileExtension(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php new file mode 100644 index 00000000..c050d323 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php @@ -0,0 +1,56 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Contract for metadata drivers. + * + * @since 2.2 + * @author Jonathan H. Wage + */ +interface MappingDriver +{ + /** + * Loads the metadata for the specified class into the provided container. + * + * @param string $className + * @param ClassMetadata $metadata + */ + function loadMetadataForClass($className, ClassMetadata $metadata); + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + function getAllClassNames(); + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped as an Entity or a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + function isTransient($className); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php new file mode 100644 index 00000000..c7c14527 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php @@ -0,0 +1,125 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\Driver\MappingDriver, + Doctrine\Common\Persistence\Mapping\ClassMetadata, + Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The DriverChain allows you to add multiple other mapping drivers for + * certain namespaces + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class MappingDriverChain implements MappingDriver +{ + /** + * @var array + */ + private $drivers = array(); + + /** + * Add a nested driver. + * + * @param Driver $nestedDriver + * @param string $namespace + */ + public function addDriver(MappingDriver $nestedDriver, $namespace) + { + $this->drivers[$namespace] = $nestedDriver; + } + + /** + * Get the array of nested drivers. + * + * @return array $drivers + */ + public function getDrivers() + { + return $this->drivers; + } + + /** + * Loads the metadata for the specified class into the provided container. + * + * @param string $className + * @param ClassMetadataInfo $metadata + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + foreach ($this->drivers as $namespace => $driver) { + if (strpos($className, $namespace) === 0) { + $driver->loadMetadataForClass($className, $metadata); + return; + } + } + + throw MappingException::classNotFoundInNamespaces($className, array_keys($this->drivers)); + } + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + public function getAllClassNames() + { + $classNames = array(); + $driverClasses = array(); + foreach ($this->drivers AS $namespace => $driver) { + $oid = spl_object_hash($driver); + if (!isset($driverClasses[$oid])) { + $driverClasses[$oid] = $driver->getAllClassNames(); + } + + foreach ($driverClasses[$oid] AS $className) { + if (strpos($className, $namespace) === 0) { + $classNames[$className] = true; + } + } + } + return array_keys($classNames); + } + + /** + * Whether the class with the specified name should have its metadata loaded. + * + * This is only the case for non-transient classes either mapped as an Entity or MappedSuperclass. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + foreach ($this->drivers AS $namespace => $driver) { + if (strpos($className, $namespace) === 0) { + return $driver->isTransient($className); + } + } + + // class isTransient, i.e. not an entity or mapped superclass + return true; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php new file mode 100644 index 00000000..7751dae3 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * The PHPDriver includes php files which just populate ClassMetadataInfo + * instances with plain php code + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class PHPDriver extends FileDriver +{ + /** + * {@inheritdoc} + */ + protected $metadata; + + /** + * {@inheritDoc} + */ + public function __construct($locator, $fileExtension = null) + { + $fileExtension = ".php"; + parent::__construct($locator, $fileExtension); + } + + /** + * {@inheritdoc} + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + $this->metadata = $metadata; + $this->loadMappingFile($this->locator->findMappingFile($className)); + } + + /** + * {@inheritdoc} + */ + protected function loadMappingFile($file) + { + $metadata = $this->metadata; + include $file; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php new file mode 100644 index 00000000..9103ed86 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php @@ -0,0 +1,131 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The StaticPHPDriver calls a static loadMetadata() method on your entity + * classes where you can manually populate the ClassMetadata instance. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class StaticPHPDriver implements MappingDriver +{ + /** + * Paths of entity directories. + * + * @var array + */ + private $paths = array(); + + /** + * Map of all class names. + * + * @var array + */ + private $classNames; + + public function __construct($paths) + { + $this->addPaths((array) $paths); + } + + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * {@inheritdoc} + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + $className::loadMetadata($metadata); + } + + /** + * {@inheritDoc} + * @todo Same code exists in AnnotationDriver, should we re-use it somehow or not worry about it? + */ + public function getAllClassNames() + { + if ($this->classNames !== null) { + return $this->classNames; + } + + if (!$this->paths) { + throw MappingException::pathRequired(); + } + + $classes = array(); + $includedFiles = array(); + + foreach ($this->paths as $path) { + if (!is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + if ($file->getBasename('.php') == $file->getBasename()) { + continue; + } + + $sourceFile = realpath($file->getPathName()); + require_once $sourceFile; + $includedFiles[] = $sourceFile; + } + } + + $declared = get_declared_classes(); + + foreach ($declared as $className) { + $rc = new \ReflectionClass($className); + $sourceFile = $rc->getFileName(); + if (in_array($sourceFile, $includedFiles) && !$this->isTransient($className)) { + $classes[] = $className; + } + } + + $this->classNames = $classes; + + return $classes; + } + + /** + * {@inheritdoc} + */ + public function isTransient($className) + { + return ! method_exists($className, 'loadMetadata'); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php new file mode 100644 index 00000000..d338cf60 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php @@ -0,0 +1,198 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The Symfony File Locator makes a simplifying assumptions compared + * to the DefaultFileLocator. By assuming paths only contain entities of a certain + * namespace the mapping files consists of the short classname only. + * + * @author Fabien Potencier + * @author Benjamin Eberlei + * @license MIT + */ +class SymfonyFileLocator implements FileLocator +{ + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * A map of mapping directory path to namespace prefix used to expand class shortnames. + * + * @var array + */ + protected $prefixes = array(); + + /** + * File extension that is searched for. + * + * @var string + */ + protected $fileExtension; + + public function __construct(array $prefixes, $fileExtension = null) + { + $this->addNamespacePrefixes($prefixes); + $this->fileExtension = $fileExtension; + } + + public function addNamespacePrefixes(array $prefixes) + { + $this->prefixes = array_merge($this->prefixes, $prefixes); + $this->paths = array_merge($this->paths, array_keys($prefixes)); + } + + public function getNamespacePrefixes() + { + return $this->prefixes; + } + + /** + * {@inheritDoc} + */ + public function getPaths() + { + return $this->paths; + } + + /** + * {@inheritDoc} + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * {@inheritDoc} + */ + public function fileExists($className) + { + $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; + foreach ($this->paths as $path) { + if (!isset($this->prefixes[$path])) { + // global namespace class + if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { + return true; + } + + continue; + } + + $prefix = $this->prefixes[$path]; + + if (0 !== strpos($className, $prefix.'\\')) { + continue; + } + + $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; + return is_file($filename); + } + + return false; + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames($globalBasename = null) + { + $classes = array(); + + if ($this->paths) { + foreach ((array) $this->paths as $path) { + if (!is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + $fileName = $file->getBasename($this->fileExtension); + + if ($fileName == $file->getBasename() || $fileName == $globalBasename) { + continue; + } + + // NOTE: All files found here means classes are not transient! + if (isset($this->prefixes[$path])) { + $classes[] = $this->prefixes[$path].'\\'.str_replace('.', '\\', $fileName); + } else { + $classes[] = str_replace('.', '\\', $fileName); + } + } + } + } + + return $classes; + } + + /** + * {@inheritDoc} + */ + public function findMappingFile($className) + { + $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; + foreach ($this->paths as $path) { + if (!isset($this->prefixes[$path])) { + if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { + return $path.DIRECTORY_SEPARATOR.$defaultFileName; + } + + continue; + } + + $prefix = $this->prefixes[$path]; + + if (0 !== strpos($className, $prefix.'\\')) { + continue; + } + + $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; + if (is_file($filename)) { + return $filename; + } + + throw MappingException::mappingFileNotFound($className, $filename); + } + + throw MappingException::mappingFileNotFound($className, substr($className, strrpos($className, '\\') + 1).$this->fileExtension); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php new file mode 100644 index 00000000..4ecd2ad5 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php @@ -0,0 +1,57 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * A MappingException indicates that something is wrong with the mapping setup. + * + * @since 2.2 + */ +class MappingException extends \Exception +{ + public static function classNotFoundInNamespaces($className, $namespaces) + { + return new self("The class '" . $className . "' was not found in the ". + "chain configured namespaces " . implode(", ", $namespaces)); + } + + public static function pathRequired() + { + return new self("Specifying the paths to your entities is required ". + "in the AnnotationDriver to retrieve all class names."); + } + + public static function fileMappingDriversRequireConfiguredDirectoryPath($path = null) + { + if ( ! empty($path)) { + $path = '[' . $path . ']'; + } + + return new self( + 'File mapping drivers must have a valid directory path, ' . + 'however the given path ' . $path . ' seems to be incorrect!' + ); + } + + public static function mappingFileNotFound($entityName, $fileName) + { + return new self("No mapping file found named '$fileName' for class '$entityName'."); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php new file mode 100644 index 00000000..4e0e312f --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php @@ -0,0 +1,80 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Very simple reflection service abstraction. + * + * This is required inside metadata layers that may require either + * static or runtime reflection. + * + * @author Benjamin Eberlei + */ +interface ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + function getParentClasses($class); + + /** + * Return the shortname of a class. + * + * @param string $class + * @return string + */ + function getClassShortName($class); + + /** + * @param string $class + * @return string + */ + function getClassNamespace($class); + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + function getClass($class); + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + function getAccessibleProperty($class, $property); + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + function hasPublicMethod($class, $method); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php new file mode 100644 index 00000000..abcff581 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php @@ -0,0 +1,102 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use ReflectionClass; +use ReflectionProperty; + +/** + * PHP Runtime Reflection Service + * + * @author Benjamin Eberlei + */ +class RuntimeReflectionService implements ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + public function getParentClasses($class) + { + return class_parents($class); + } + + /** + * Return the shortname of a class. + * + * @param string $class + * @return string + */ + public function getClassShortName($class) + { + $r = new ReflectionClass($class); + return $r->getShortName(); + } + + /** + * @param string $class + * @return string + */ + public function getClassNamespace($class) + { + $r = new ReflectionClass($class); + return $r->getNamespaceName(); + } + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + public function getClass($class) + { + return new ReflectionClass($class); + } + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + public function getAccessibleProperty($class, $property) + { + $property = new ReflectionProperty($class, $property); + $property->setAccessible(true); + return $property; + } + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + public function hasPublicMethod($class, $method) + { + return method_exists($class, $method) && is_callable(array($class, $method)); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php new file mode 100644 index 00000000..2de6e761 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php @@ -0,0 +1,107 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use ReflectionClass; +use ReflectionProperty; + +/** + * PHP Runtime Reflection Service + * + * @author Benjamin Eberlei + */ +class StaticReflectionService implements ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + public function getParentClasses($class) + { + return array(); + } + + /** + * Return the shortname of a class. + * + * @param string $className + * @return string + */ + public function getClassShortName($className) + { + if (strpos($className, '\\') !== false) { + $className = substr($className, strrpos($className, "\\")+1); + } + return $className; + } + + /** + * Return the namespace of a class. + * + * @param string $className + * @return string + */ + public function getClassNamespace($className) + { + $namespace = ''; + if (strpos($className, '\\') !== false) { + $namespace = strrev(substr( strrev($className), strpos(strrev($className), '\\')+1 )); + } + return $namespace; + } + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + public function getClass($class) + { + return null; + } + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + public function getAccessibleProperty($class, $property) + { + return null; + } + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + public function hasPublicMethod($class, $method) + { + return method_exists($class, $method) && is_callable(array($class, $method)); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php new file mode 100644 index 00000000..6d70fc12 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php @@ -0,0 +1,143 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract for a Doctrine persistence layer ObjectManager class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ObjectManager +{ + /** + * Finds a object by its identifier. + * + * This is just a convenient shortcut for getRepository($className)->find($id). + * + * @param string + * @param mixed + * @return object + */ + function find($className, $id); + + /** + * Tells the ObjectManager to make an instance managed and persistent. + * + * The object will be entered into the database as a result of the flush operation. + * + * NOTE: The persist operation always considers objects that are not yet known to + * this ObjectManager as NEW. Do not pass detached objects to the persist operation. + * + * @param object $object The instance to make managed and persistent. + */ + function persist($object); + + /** + * Removes an object instance. + * + * A removed object will be removed from the database as a result of the flush operation. + * + * @param object $object The object instance to remove. + */ + function remove($object); + + /** + * Merges the state of a detached object into the persistence context + * of this ObjectManager and returns the managed copy of the object. + * The object passed to merge will not become associated/managed with this ObjectManager. + * + * @param object $object + */ + function merge($object); + + /** + * Detaches an object from the ObjectManager, causing a managed object to + * become detached. Unflushed changes made to the object if any + * (including removal of the object), will not be synchronized to the database. + * Objects which previously referenced the detached object will continue to + * reference it. + * + * @param object $object The object to detach. + */ + function detach($object); + + /** + * Refreshes the persistent state of an object from the database, + * overriding any local changes that have not yet been persisted. + * + * @param object $object The object to refresh. + */ + function refresh($object); + + /** + * Flushes all changes to objects that have been queued up to now to the database. + * This effectively synchronizes the in-memory state of managed objects with the + * database. + */ + function flush(); + + /** + * Gets the repository for a class. + * + * @param string $className + * @return \Doctrine\Common\Persistence\ObjectRepository + */ + function getRepository($className); + + /** + * Returns the ClassMetadata descriptor for a class. + * + * The class name must be the fully-qualified class name without a leading backslash + * (as it is returned by get_class($obj)). + * + * @param string $className + * @return \Doctrine\Common\Persistence\Mapping\ClassMetadata + */ + function getClassMetadata($className); + + /** + * Gets the metadata factory used to gather the metadata of classes. + * + * @return Doctrine\Common\Persistence\Mapping\ClassMetadataFactory + */ + function getMetadataFactory(); + + /** + * Helper method to initialize a lazy loading proxy or persistent collection. + * + * This method is a no-op for other objects. + * + * @param object $obj + */ + function initializeObject($obj); + + /** + * Check if the object is part of the current UnitOfWork and therefore + * managed. + * + * @param object $object + * @return bool + */ + function contains($object); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php new file mode 100644 index 00000000..015dd3dd --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php @@ -0,0 +1,49 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Makes a Persistent Objects aware of its own object-manager. + * + * Using this interface the managing object manager and class metadata instances + * are injected into the persistent object after construction. This allows + * you to implement ActiveRecord functionality on top of the persistance-ignorance + * that Doctrine propagates. + * + * Word of Warning: This is a very powerful hook to change how you can work with your domain models. + * Using this hook will break the Single Responsibility Principle inside your Domain Objects + * and increase the coupling of database and objects. + * + * Every ObjectManager has to implement this functionality itself. + * + * @author Benjamin Eberlei + */ +interface ObjectManagerAware +{ + /** + * Injects responsible ObjectManager and the ClassMetadata into this persistent object. + * + * @param ObjectManager $objectManager + * @param ClassMetadata $classMetadata + */ + public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php new file mode 100644 index 00000000..22633288 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php @@ -0,0 +1,78 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract for a Doctrine persistence layer ObjectRepository class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ObjectRepository +{ + /** + * Finds an object by its primary key / identifier. + * + * @param $id The identifier. + * @return object The object. + */ + function find($id); + + /** + * Finds all objects in the repository. + * + * @return mixed The objects. + */ + function findAll(); + + /** + * Finds objects by a set of criteria. + * + * Optionally sorting and limiting details can be passed. An implementation may throw + * an UnexpectedValueException if certain values of the sorting or limiting details are + * not supported. + * + * @throws UnexpectedValueException + * @param array $criteria + * @param array|null $orderBy + * @param int|null $limit + * @param int|null $offset + * @return mixed The objects. + */ + function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null); + + /** + * Finds a single object by a set of criteria. + * + * @param array $criteria + * @return object The object. + */ + function findOneBy(array $criteria); + + /** + * Returns the class name of the object managed by the repository + * + * @return string + */ + function getClassName(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php new file mode 100644 index 00000000..4274af62 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php @@ -0,0 +1,233 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; + +/** + * PersistentObject base class that implements getter/setter methods for all mapped fields and associations + * by overriding __call. + * + * This class is a forward compatible implementation of the PersistentObject trait. + * + * + * Limitations: + * + * 1. All persistent objects have to be associated with a single ObjectManager, multiple + * ObjectManagers are not supported. You can set the ObjectManager with `PersistentObject#setObjectManager()`. + * 2. Setters and getters only work if a ClassMetadata instance was injected into the PersistentObject. + * This is either done on `postLoad` of an object or by accessing the global object manager. + * 3. There are no hooks for setters/getters. Just implement the method yourself instead of relying on __call(). + * 4. Slower than handcoded implementations: An average of 7 method calls per access to a field and 11 for an association. + * 5. Only the inverse side associations get autoset on the owning side aswell. Setting objects on the owning side + * will not set the inverse side associations. + * + * @example + * + * PersistentObject::setObjectManager($em); + * + * class Foo extends PersistentObject + * { + * private $id; + * } + * + * $foo = new Foo(); + * $foo->getId(); // method exists through __call + * + * @author Benjamin Eberlei + */ +abstract class PersistentObject implements ObjectManagerAware +{ + /** + * @var ObjectManager + */ + private static $objectManager; + + /** + * @var ClassMetadata + */ + private $cm; + + /** + * Set the object manager responsible for all persistent object base classes. + * + * @param ObjectManager $objectManager + */ + static public function setObjectManager(ObjectManager $objectManager = null) + { + self::$objectManager = $objectManager; + } + + /** + * @return ObjectManager + */ + static public function getObjectManager() + { + return self::$objectManager; + } + + /** + * Inject Doctrine Object Manager + * + * @param ObjectManager $objectManager + * @param ClassMetadata $classMetadata + */ + public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata) + { + if ($objectManager !== self::$objectManager) { + throw new \RuntimeException("Trying to use PersistentObject with different ObjectManager instances. " . + "Was PersistentObject::setObjectManager() called?"); + } + + $this->cm = $classMetadata; + } + + /** + * Sets a persistent fields value. + * + * @throws InvalidArgumentException - When the wrong target object type is passed to an association + * @throws BadMethodCallException - When no persistent field exists by that name. + * @param string $field + * @param array $args + * @return void + */ + private function set($field, $args) + { + $this->initializeDoctrine(); + + if ($this->cm->hasField($field) && !$this->cm->isIdentifier($field)) { + $this->$field = $args[0]; + } else if ($this->cm->hasAssociation($field) && $this->cm->isSingleValuedAssociation($field)) { + $targetClass = $this->cm->getAssociationTargetClass($field); + if (!($args[0] instanceof $targetClass) && $args[0] !== null) { + throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); + } + $this->$field = $args[0]; + $this->completeOwningSide($field, $targetClass, $args[0]); + } else { + throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); + } + } + + /** + * Get persistent field value. + * + * @throws BadMethodCallException - When no persistent field exists by that name. + * @param string $field + * @return mixed + */ + private function get($field) + { + $this->initializeDoctrine(); + + if ( $this->cm->hasField($field) || $this->cm->hasAssociation($field) ) { + return $this->$field; + } else { + throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); + } + } + + /** + * If this is an inverse side association complete the owning side. + * + * @param string $field + * @param ClassMetadata $targetClass + * @param object $targetObject + */ + private function completeOwningSide($field, $targetClass, $targetObject) + { + // add this object on the owning side aswell, for obvious infinite recursion + // reasons this is only done when called on the inverse side. + if ($this->cm->isAssociationInverseSide($field)) { + $mappedByField = $this->cm->getAssociationMappedByTargetField($field); + $targetMetadata = self::$objectManager->getClassMetadata($targetClass); + + $setter = ($targetMetadata->isCollectionValuedAssociation($mappedByField) ? "add" : "set").$mappedByField; + $targetObject->$setter($this); + } + } + + /** + * Add an object to a collection + * + * @param type $field + * @param assoc $args + */ + private function add($field, $args) + { + $this->initializeDoctrine(); + + if ($this->cm->hasAssociation($field) && $this->cm->isCollectionValuedAssociation($field)) { + $targetClass = $this->cm->getAssociationTargetClass($field); + if (!($args[0] instanceof $targetClass)) { + throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); + } + if (!($this->$field instanceof Collection)) { + $this->$field = new ArrayCollection($this->$field ?: array()); + } + $this->$field->add($args[0]); + $this->completeOwningSide($field, $targetClass, $args[0]); + } else { + throw new \BadMethodCallException("There is no method add".$field."() on ".$this->cm->getName()); + } + } + + /** + * Initialize Doctrine Metadata for this class. + * + * @return void + */ + private function initializeDoctrine() + { + if ($this->cm !== null) { + return; + } + + if (!self::$objectManager) { + throw new \RuntimeException("No runtime object manager set. Call PersistentObject#setObjectManager()."); + } + + $this->cm = self::$objectManager->getClassMetadata(get_class($this)); + } + + /** + * Magic method that implements + * + * @param string $method + * @param array $args + * @return mixed + */ + public function __call($method, $args) + { + $command = substr($method, 0, 3); + $field = lcfirst(substr($method, 3)); + if ($command == "set") { + $this->set($field, $args); + } else if ($command == "get") { + return $this->get($field); + } else if ($command == "add") { + $this->add($field, $args); + } else { + throw new \BadMethodCallException("There is no method ".$method." on ".$this->cm->getName()); + } + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php new file mode 100644 index 00000000..726979fc --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php @@ -0,0 +1,60 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Interface for proxy classes. + * + * @author Roman Borschel + * @since 2.2 + */ +interface Proxy +{ + /** + * Marker for Proxy class names. + * + * @var string + */ + const MARKER = '__CG__'; + + /** + * Length of the proxy marker + * + * @var int + */ + const MARKER_LENGTH = 6; + + /** + * Initialize this proxy if its not yet initialized. + * + * Acts as a no-op if already initialized. + * + * @return void + */ + public function __load(); + + /** + * Is this proxy initialized or not. + * + * @return bool + */ + public function __isInitialized(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php b/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php new file mode 100644 index 00000000..87c5b413 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php @@ -0,0 +1,48 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Contract for classes that are potential listeners of a NotifyPropertyChanged + * implementor. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface PropertyChangedListener +{ + /** + * Notifies the listener of a property change. + * + * @param object $sender The object on which the property changed. + * @param string $propertyName The name of the property that changed. + * @param mixed $oldValue The old value of the property that changed. + * @param mixed $newValue The new value of the property that changed. + */ + function propertyChanged($sender, $propertyName, $oldValue, $newValue); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php new file mode 100644 index 00000000..c3462782 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php @@ -0,0 +1,103 @@ +. + */ + +namespace Doctrine\Common\Util; + +use Doctrine\Common\Persistence\Proxy; + +/** + * Class and reflection related functionality for objects that + * might or not be proxy objects at the moment. + * + * @author Benjamin Eberlei + * @author Johannes Schmitt + */ +class ClassUtils +{ + /** + * Get the real class name of a class name that could be a proxy. + * + * @param string + * @return string + */ + public static function getRealClass($class) + { + if (false === $pos = strrpos($class, '\\'.Proxy::MARKER.'\\')) { + return $class; + } + + return substr($class, $pos + Proxy::MARKER_LENGTH + 2); + } + + /** + * Get the real class name of an object (even if its a proxy) + * + * @param object + * @return string + */ + public static function getClass($object) + { + return self::getRealClass(get_class($object)); + } + + /** + * Get the real parent class name of a class or object + * + * @param string + * @return string + */ + public static function getParentClass($className) + { + return get_parent_class( self::getRealClass( $className ) ); + } + + /** + * Create a new reflection class + * + * @param string + * @return ReflectionClass + */ + public static function newReflectionClass($class) + { + return new \ReflectionClass( self::getRealClass( $class ) ); + } + + /** + * Create a new reflection object + * + * @param object + * @return ReflectionObject + */ + public static function newReflectionObject($object) + { + return self::newReflectionClass( self::getClass( $object ) ); + } + + /** + * Given a class name and a proxy namespace return the proxy name. + * + * @param string $className + * @param string $proxyNamespace + * @return string + */ + public static function generateProxyClassName($className, $proxyNamespace) + { + return rtrim($proxyNamespace, '\\') . '\\'.Proxy::MARKER.'\\' . ltrim($className, '\\'); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php new file mode 100644 index 00000000..57ae3120 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php @@ -0,0 +1,123 @@ +. + */ + +namespace Doctrine\Common\Util; + +/** + * Static class containing most used debug methods. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Giorgio Sironi + */ +final class Debug +{ + /** + * Private constructor (prevents from instantiation) + * + */ + private function __construct() {} + + /** + * Prints a dump of the public, protected and private properties of $var. + * + * @static + * @link http://xdebug.org/ + * @param mixed $var + * @param integer $maxDepth Maximum nesting level for object properties + * @param boolean $stripTags Flag that indicate if output should strip HTML tags + */ + public static function dump($var, $maxDepth = 2, $stripTags = true) + { + ini_set('html_errors', 'On'); + + if (extension_loaded('xdebug')) { + ini_set('xdebug.var_display_max_depth', $maxDepth); + } + + $var = self::export($var, $maxDepth++); + + ob_start(); + var_dump($var); + $dump = ob_get_contents(); + ob_end_clean(); + + echo ($stripTags ? strip_tags(html_entity_decode($dump)) : $dump); + + ini_set('html_errors', 'Off'); + } + + public static function export($var, $maxDepth) + { + $return = null; + $isObj = is_object($var); + + if ($isObj && in_array('Doctrine\Common\Collections\Collection', class_implements($var))) { + $var = $var->toArray(); + } + + if ($maxDepth) { + if (is_array($var)) { + $return = array(); + + foreach ($var as $k => $v) { + $return[$k] = self::export($v, $maxDepth - 1); + } + } else if ($isObj) { + $return = new \stdclass(); + if ($var instanceof \DateTime) { + $return->__CLASS__ = "DateTime"; + $return->date = $var->format('c'); + $return->timezone = $var->getTimeZone()->getName(); + } else { + $reflClass = ClassUtils::newReflectionObject($var); + $return->__CLASS__ = ClassUtils::getClass($var); + + if ($var instanceof \Doctrine\Common\Persistence\Proxy) { + $return->__IS_PROXY__ = true; + $return->__PROXY_INITIALIZED__ = $var->__isInitialized(); + } + + foreach ($reflClass->getProperties() as $reflProperty) { + $name = $reflProperty->getName(); + + $reflProperty->setAccessible(true); + $return->$name = self::export($reflProperty->getValue($var), $maxDepth - 1); + } + } + } else { + $return = $var; + } + } else { + $return = is_object($var) ? get_class($var) + : (is_array($var) ? 'Array(' . count($var) . ')' : $var); + } + + return $return; + } + + public static function toString($obj) + { + return method_exists('__toString', $obj) ? (string) $obj : get_class($obj) . '@' . spl_object_hash($obj); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php new file mode 100644 index 00000000..ba1eb17b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php @@ -0,0 +1,72 @@ +. + */ + +namespace Doctrine\Common\Util; + +/** + * Doctrine inflector has static methods for inflecting text + * + * The methods in these classes are from several different sources collected + * across several different php projects and several different authors. The + * original author names and emails are not known + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 1.0 + * @version $Revision: 3189 $ + * @author Konsta Vesterinen + * @author Jonathan H. Wage + */ +class Inflector +{ + /** + * Convert word in to the format for a Doctrine table name. Converts 'ModelName' to 'model_name' + * + * @param string $word Word to tableize + * @return string $word Tableized word + */ + public static function tableize($word) + { + return strtolower(preg_replace('~(?<=\\w)([A-Z])~', '_$1', $word)); + } + + /** + * Convert a word in to the format for a Doctrine class name. Converts 'table_name' to 'TableName' + * + * @param string $word Word to classify + * @return string $word Classified word + */ + public static function classify($word) + { + return str_replace(" ", "", ucwords(strtr($word, "_-", " "))); + } + + /** + * Camelize a word. This uses the classify() method and turns the first character to lowercase + * + * @param string $word + * @return string $word + */ + public static function camelize($word) + { + return lcfirst(self::classify($word)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Version.php b/vendor/doctrine/common/lib/Doctrine/Common/Version.php new file mode 100644 index 00000000..7a87311f --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Version.php @@ -0,0 +1,55 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Class to store and retrieve the version of Doctrine + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class Version +{ + /** + * Current Doctrine Version + */ + const VERSION = '2.2.3'; + + /** + * Compares a Doctrine version with the current one. + * + * @param string $version Doctrine version to compare. + * @return int Returns -1 if older, 0 if it is the same, 1 if version + * passed as argument is newer. + */ + public static function compare($version) + { + $currentVersion = str_replace(' ', '', strtolower(self::VERSION)); + $version = str_replace(' ', '', $version); + + return version_compare($version, $currentVersion); + } +} diff --git a/vendor/doctrine/common/phpunit.xml.dist b/vendor/doctrine/common/phpunit.xml.dist new file mode 100644 index 00000000..b9d3b340 --- /dev/null +++ b/vendor/doctrine/common/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + ./tests/Doctrine/ + + + + + + ./lib/Doctrine/ + + + + + + performance + + + diff --git a/vendor/doctrine/common/tests/.gitignore b/vendor/doctrine/common/tests/.gitignore new file mode 100644 index 00000000..72104052 --- /dev/null +++ b/vendor/doctrine/common/tests/.gitignore @@ -0,0 +1,3 @@ +Doctrine/Tests/Proxies/ +Doctrine/Tests/ORM/Proxy/generated/ +Doctrine/Tests/ORM/Tools/Export/export diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php new file mode 100644 index 00000000..0a329a3c --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php @@ -0,0 +1,538 @@ +getReader(); + + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\DummyClass'); + $this->assertEquals(1, count($reader->getClassAnnotations($class))); + $this->assertInstanceOf($annotName = 'Doctrine\Tests\Common\Annotations\DummyAnnotation', $annot = $reader->getClassAnnotation($class, $annotName)); + $this->assertEquals("hello", $annot->dummyValue); + + $field1Prop = $class->getProperty('field1'); + $propAnnots = $reader->getPropertyAnnotations($field1Prop); + $this->assertEquals(1, count($propAnnots)); + $this->assertInstanceOf($annotName, $annot = $reader->getPropertyAnnotation($field1Prop, $annotName)); + $this->assertEquals("fieldHello", $annot->dummyValue); + + $getField1Method = $class->getMethod('getField1'); + $methodAnnots = $reader->getMethodAnnotations($getField1Method); + $this->assertEquals(1, count($methodAnnots)); + $this->assertInstanceOf($annotName, $annot = $reader->getMethodAnnotation($getField1Method, $annotName)); + $this->assertEquals(array(1, 2, "three"), $annot->value); + + $field2Prop = $class->getProperty('field2'); + $propAnnots = $reader->getPropertyAnnotations($field2Prop); + $this->assertEquals(1, count($propAnnots)); + $this->assertInstanceOf($annotName = 'Doctrine\Tests\Common\Annotations\DummyJoinTable', $joinTableAnnot = $reader->getPropertyAnnotation($field2Prop, $annotName)); + $this->assertEquals(1, count($joinTableAnnot->joinColumns)); + $this->assertEquals(1, count($joinTableAnnot->inverseJoinColumns)); + $this->assertTrue($joinTableAnnot->joinColumns[0] instanceof DummyJoinColumn); + $this->assertTrue($joinTableAnnot->inverseJoinColumns[0] instanceof DummyJoinColumn); + $this->assertEquals('col1', $joinTableAnnot->joinColumns[0]->name); + $this->assertEquals('col2', $joinTableAnnot->joinColumns[0]->referencedColumnName); + $this->assertEquals('col3', $joinTableAnnot->inverseJoinColumns[0]->name); + $this->assertEquals('col4', $joinTableAnnot->inverseJoinColumns[0]->referencedColumnName); + + $dummyAnnot = $reader->getMethodAnnotation($class->getMethod('getField1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('', $dummyAnnot->dummyValue); + $this->assertEquals(array(1, 2, 'three'), $dummyAnnot->value); + + $dummyAnnot = $reader->getPropertyAnnotation($class->getProperty('field1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('fieldHello', $dummyAnnot->dummyValue); + + $classAnnot = $reader->getClassAnnotation($class, 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('hello', $classAnnot->dummyValue); + } + + public function testAnnotationsWithValidTargets() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithValidAnnotationTarget'); + + $this->assertEquals(1,count($reader->getClassAnnotations($class))); + $this->assertEquals(1,count($reader->getPropertyAnnotations($class->getProperty('foo')))); + $this->assertEquals(1,count($reader->getMethodAnnotations($class->getMethod('someFunction')))); + $this->assertEquals(1,count($reader->getPropertyAnnotations($class->getProperty('nested')))); + } + + public function testAnnotationsWithVarType() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $this->assertEquals(1,count($fooAnnot = $reader->getPropertyAnnotations($class->getProperty('foo')))); + $this->assertEquals(1,count($barAnnot = $reader->getMethodAnnotations($class->getMethod('bar')))); + + $this->assertInternalType('string', $fooAnnot[0]->string); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', $barAnnot[0]->annotation); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetPropertyMethod is not allowed to be declared on class Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass. You may only use this annotation on these code elements: METHOD, PROPERTY + */ + public function testClassWithInvalidAnnotationTargetAtClassDocBlock() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetClass is not allowed to be declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty::$foo. You may only use this annotation on these code elements: CLASS + */ + public function testClassWithInvalidAnnotationTargetAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty', 'foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetAnnotation is not allowed to be declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty::$bar. You may only use this annotation on these code elements: ANNOTATION + */ + public function testClassWithInvalidNestedAnnotationTargetAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty', 'bar')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetClass is not allowed to be declared on method Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod::functionName(). You may only use this annotation on these code elements: CLASS + */ + public function testClassWithInvalidAnnotationTargetAtMethodDocBlock() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod', 'functionName')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtClassDocBlock() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError','foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtMethodDocBlock() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError','bar')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Type Error] Attribute "string" of @AnnotationWithVarType declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType::$invalidProperty expects a(n) string, but got integer. + */ + public function testClassWithPropertyInvalidVarTypeError() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $reader->getPropertyAnnotations($class->getProperty('invalidProperty')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Type Error] Attribute "annotation" of @AnnotationWithVarType declared on method Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType::invalidMethod() expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll, but got an instance of Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. + */ + public function testClassWithMethodInvalidVarTypeError() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $reader->getMethodAnnotations($class->getMethod('invalidMethod')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in class Doctrine\Tests\Common\Annotations\DummyClassSyntaxError. + */ + public function testClassSyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\DummyClassSyntaxError')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in method Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError::foo(). + */ + public function testMethodSyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError', 'foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in property Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError::$foo. + */ + public function testPropertySyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError', 'foo')); + } + + /** + * @group regression + */ + public function testMultipleAnnotationsOnSameLine() + { + $reader = $this->getReader(); + $annots = $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClass2', 'id')); + $this->assertEquals(3, count($annots)); + } + + public function testNonAnnotationProblem() + { + $reader = $this->getReader(); + + $this->assertNotNull($annot = $reader->getPropertyAnnotation(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClassNonAnnotationProblem', 'foo'), $name = 'Doctrine\Tests\Common\Annotations\DummyAnnotation')); + $this->assertInstanceOf($name, $annot); + } + + public function testImportWithConcreteAnnotation() + { + $reader = $this->getReader(); + $property = new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestImportWithConcreteAnnotation', 'field'); + $annotations = $reader->getPropertyAnnotations($property); + $this->assertEquals(1, count($annotations)); + $this->assertNotNull($reader->getPropertyAnnotation($property, 'Doctrine\Tests\Common\Annotations\DummyAnnotation')); + } + + public function testImportWithInheritance() + { + $reader = $this->getReader(); + + $class = new TestParentClass(); + $ref = new \ReflectionClass($class); + + $childAnnotations = $reader->getPropertyAnnotations($ref->getProperty('child')); + $this->assertEquals(1, count($childAnnotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Foo\Name', reset($childAnnotations)); + + $parentAnnotations = $reader->getPropertyAnnotations($ref->getProperty('parent')); + $this->assertEquals(1, count($parentAnnotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Bar\Name', reset($parentAnnotations)); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation "@NameFoo" in property Doctrine\Tests\Common\Annotations\TestAnnotationNotImportedClass::$field was never imported. + */ + public function testImportDetectsNotImportedAnnotation() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestAnnotationNotImportedClass', 'field')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation "@Foo\Bar\Name" in property Doctrine\Tests\Common\Annotations\TestNonExistentAnnotationClass::$field was never imported. + */ + public function testImportDetectsNonExistentAnnotation() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestNonExistentAnnotationClass', 'field')); + } + + public function testTopLevelAnnotation() + { + $reader = $this->getReader(); + $annotations = $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestTopLevelAnnotationClass', 'field')); + + $this->assertEquals(1, count($annotations)); + $this->assertInstanceOf('\TopLevelAnnotation', reset($annotations)); + } + + public function testIgnoresAnnotationsNotPrefixedWithWhitespace() + { + $reader = $this->getReader(); + + $annotation = $reader->getClassAnnotation(new \ReflectionClass(new TestIgnoresNonAnnotationsClass()), 'Doctrine\Tests\Common\Annotations\Name'); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Name', $annotation); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The class "Doctrine\Tests\Common\Annotations\Fixtures\NoAnnotation" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "Doctrine\Tests\Common\Annotations\Fixtures\NoAnnotation". If it is indeed no annotation, then you need to add @IgnoreAnnotation("NoAnnotation") to the _class_ doc comment of class Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageClass. + */ + public function testErrorWhenInvalidAnnotationIsUsed() + { + $reader = $this->getReader(); + $ref = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageClass'); + $reader->getClassAnnotations($ref); + } + + public function testInvalidAnnotationUsageButIgnoredClass() + { + $reader = $this->getReader(); + $ref = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageButIgnoredClass'); + $annots = $reader->getClassAnnotations($ref); + + $this->assertEquals(2, count($annots)); + } + + /** + * @group DDC-1660 + * @group regression + */ + public function testInvalidAnnotationButIgnored() + { + $reader = $this->getReader(); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassDDC1660'); + + $this->assertTrue(class_exists('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Version')); + $this->assertCount(0, $reader->getClassAnnotations($class)); + $this->assertCount(0, $reader->getMethodAnnotations($class->getMethod('bar'))); + $this->assertCount(0, $reader->getPropertyAnnotations($class->getProperty('foo'))); + } + + abstract protected function getReader(); +} + +/** + * @parseAnnotation("var") + * @author Johannes M. Schmitt + * + */ +class TestParseAnnotationClass +{ + /** + * @var + */ + private $field; +} + +/** + * @Name + * @author Johannes M. Schmitt + */ +class TestIgnoresNonAnnotationsClass +{ +} + +class TestTopLevelAnnotationClass +{ + /** + * @\TopLevelAnnotation + */ + private $field; +} + +class TestNonExistentAnnotationClass +{ + /** + * @Foo\Bar\Name + */ + private $field; +} + +class TestAnnotationNotImportedClass +{ + /** + * @NameFoo + */ + private $field; +} + +class TestChildClass +{ + /** + * @\Doctrine\Tests\Common\Annotations\Foo\Name(name = "foo") + */ + protected $child; +} + +class TestParentClass extends TestChildClass +{ + /** + * @\Doctrine\Tests\Common\Annotations\Bar\Name(name = "bar") + */ + private $parent; +} + +class TestImportWithConcreteAnnotation +{ + /** + * @DummyAnnotation(dummyValue = "bar") + */ + private $field; +} + +/** + * A description of this class. + * + * Let's see if the parser recognizes that this @ is not really referring to an + * annotation. Also make sure that @var \ is not concated to "@var\is". + * + * @author robo + * @since 2.0 + * @DummyAnnotation(dummyValue="hello") + */ +class DummyClass { + /** + * A nice property. + * + * @var mixed + * @DummyAnnotation(dummyValue="fieldHello") + */ + private $field1; + + /** + * @DummyJoinTable(name="join_table", + * joinColumns={@DummyJoinColumn(name="col1", referencedColumnName="col2")}, + * inverseJoinColumns={ + * @DummyJoinColumn(name="col3", referencedColumnName="col4") + * }) + */ + private $field2; + + /** + * Gets the value of field1. + * + * @return mixed + * @DummyAnnotation({1,2,"three"}) + */ + public function getField1() { + } +} + +/** + * @ignoreAnnotation("var") + */ +class DummyClass2 { + /** + * @DummyId @DummyColumn(type="integer") @DummyGeneratedValue + * @var integer + */ + private $id; +} + +/** @Annotation */ +class DummyId extends \Doctrine\Common\Annotations\Annotation {} +/** @Annotation */ +class DummyColumn extends \Doctrine\Common\Annotations\Annotation { + public $type; +} +/** @Annotation */ +class DummyGeneratedValue extends \Doctrine\Common\Annotations\Annotation {} +/** @Annotation */ +class DummyAnnotation extends \Doctrine\Common\Annotations\Annotation { + public $dummyValue; +} +/** @Annotation */ +class DummyJoinColumn extends \Doctrine\Common\Annotations\Annotation { + public $name; + public $referencedColumnName; +} +/** @Annotation */ +class DummyJoinTable extends \Doctrine\Common\Annotations\Annotation { + public $name; + public $joinColumns; + public $inverseJoinColumns; +} + +/** + * @DummyAnnotation(@) + */ +class DummyClassSyntaxError +{ + +} + +class DummyClassMethodSyntaxError +{ + /** + * @DummyAnnotation(@) + */ + public function foo() + { + + } +} + +class DummyClassPropertySyntaxError +{ + /** + * @DummyAnnotation(@) + */ + public $foo; +} + +/** + * @ignoreAnnotation({"since", "var"}) + */ +class DummyClassNonAnnotationProblem +{ + /** + * @DummyAnnotation + * + * @var \Test + * @since 0.1 + */ + public $foo; +} + + +/** +* @DummyAnnotation Foo bar +*/ +class DummyClassWithEmail +{ + +} + +namespace Doctrine\Tests\Common\Annotations\Foo; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation +{ + public $name; +} + +namespace Doctrine\Tests\Common\Annotations\Bar; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation +{ + public $name; +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php new file mode 100644 index 00000000..d2cc6678 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php @@ -0,0 +1,13 @@ +getMock('Doctrine\Common\Cache\Cache'); + $cache + ->expects($this->at(0)) + ->method('fetch') + ->with($this->equalTo($cacheKey)) + ->will($this->returnValue(array())) + ; + $cache + ->expects($this->at(1)) + ->method('fetch') + ->with($this->equalTo('[C]'.$cacheKey)) + ->will($this->returnValue(time() - 10)) + ; + $cache + ->expects($this->at(2)) + ->method('save') + ->with($this->equalTo($cacheKey)) + ; + $cache + ->expects($this->at(3)) + ->method('save') + ->with($this->equalTo('[C]'.$cacheKey)) + ; + + $reader = new CachedReader(new AnnotationReader(), $cache, true); + $route = new Route(); + $route->pattern = '/someprefix'; + $this->assertEquals(array($route), $reader->getClassAnnotations(new \ReflectionClass($name))); + } + + protected function getReader() + { + $this->cache = new ArrayCache(); + return new CachedReader(new AnnotationReader(), $this->cache); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php new file mode 100644 index 00000000..cb080f08 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php @@ -0,0 +1,27 @@ +setInput("@Name"); + $this->assertNull($lexer->token); + $this->assertNull($lexer->lookahead); + + $this->assertTrue($lexer->moveNext()); + $this->assertNull($lexer->token); + $this->assertEquals('@', $lexer->lookahead['value']); + + $this->assertTrue($lexer->moveNext()); + $this->assertEquals('@', $lexer->token['value']); + $this->assertEquals('Name', $lexer->lookahead['value']); + + $this->assertFalse($lexer->moveNext()); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php new file mode 100644 index 00000000..56cae7fd --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php @@ -0,0 +1,1118 @@ +createTestParser(); + + // Nested arrays with nested annotations + $result = $parser->parse('@Name(foo={1,2, {"key"=@Name}})'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertNull($annot->value); + $this->assertEquals(3, count($annot->foo)); + $this->assertEquals(1, $annot->foo[0]); + $this->assertEquals(2, $annot->foo[1]); + $this->assertTrue(is_array($annot->foo[2])); + + $nestedArray = $annot->foo[2]; + $this->assertTrue(isset($nestedArray['key'])); + $this->assertTrue($nestedArray['key'] instanceof Name); + } + + public function testBasicAnnotations() + { + $parser = $this->createTestParser(); + + // Marker annotation + $result = $parser->parse("@Name"); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertNull($annot->value); + $this->assertNull($annot->foo); + + // Associative arrays + $result = $parser->parse('@Name(foo={"key1" = "value1"})'); + $annot = $result[0]; + $this->assertNull($annot->value); + $this->assertTrue(is_array($annot->foo)); + $this->assertTrue(isset($annot->foo['key1'])); + + // Numerical arrays + $result = $parser->parse('@Name({2="foo", 4="bar"})'); + $annot = $result[0]; + $this->assertTrue(is_array($annot->value)); + $this->assertEquals('foo', $annot->value[2]); + $this->assertEquals('bar', $annot->value[4]); + $this->assertFalse(isset($annot->value[0])); + $this->assertFalse(isset($annot->value[1])); + $this->assertFalse(isset($annot->value[3])); + + // Multiple values + $result = $parser->parse('@Name(@Name, @Name)'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertTrue(is_array($annot->value)); + $this->assertTrue($annot->value[0] instanceof Name); + $this->assertTrue($annot->value[1] instanceof Name); + + // Multiple types as values + $result = $parser->parse('@Name(foo="Bar", @Name, {"key1"="value1", "key2"="value2"})'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertTrue(is_array($annot->value)); + $this->assertTrue($annot->value[0] instanceof Name); + $this->assertTrue(is_array($annot->value[1])); + $this->assertEquals('value1', $annot->value[1]['key1']); + $this->assertEquals('value2', $annot->value[1]['key2']); + + // Complete docblock + $docblock = <<parse($docblock); + $this->assertEquals(1, count($result)); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + $this->assertNull($annot->value); + } + + public function testNamespacedAnnotations() + { + $parser = new DocParser; + $parser->setIgnoreNotImportedAnnotations(true); + + $docblock = << + * @Doctrine\Tests\Common\Annotations\Name(foo="bar") + * @ignore + */ +DOCBLOCK; + + $result = $parser->parse($docblock); + $this->assertEquals(1, count($result)); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + } + + /** + * @group debug + */ + public function testTypicalMethodDocBlock() + { + $parser = $this->createTestParser(); + + $docblock = <<parse($docblock); + $this->assertEquals(2, count($result)); + $this->assertTrue(isset($result[0])); + $this->assertTrue(isset($result[1])); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + $marker = $result[1]; + $this->assertTrue($marker instanceof Marker); + } + + + public function testAnnotationWithoutConstructor() + { + $parser = $this->createTestParser(); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertNotNull($annot); + $this->assertTrue($annot instanceof SomeAnnotationClassNameWithoutConstructor); + + $this->assertNull($annot->name); + $this->assertNotNull($annot->data); + $this->assertEquals($annot->data, "Some data"); + + + + +$docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertNotNull($annot); + $this->assertTrue($annot instanceof SomeAnnotationClassNameWithoutConstructor); + + $this->assertEquals($annot->name, "Some Name"); + $this->assertEquals($annot->data, "Some data"); + + + + +$docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->data, "Some data"); + $this->assertNull($annot->name); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertNull($annot->data); + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->data, "Some data"); + $this->assertNull($annot->name); + + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertEquals($annot->data, "Some data"); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertEquals($annot->data, "Some data"); + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $this->assertTrue($result[0] instanceof SomeAnnotationClassNameWithoutConstructorAndProperties); + } + + public function testAnnotationTarget() + { + + $parser = new DocParser; + $parser->setImports(array( + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations\Fixtures', + )); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithValidAnnotationTarget'); + + + $context = 'class ' . $class->getName(); + $docComment = $class->getDocComment(); + + $parser->setTarget(Target::TARGET_CLASS); + $this->assertNotNull($parser->parse($docComment,$context)); + + + $property = $class->getProperty('foo'); + $docComment = $property->getDocComment(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + + $parser->setTarget(Target::TARGET_PROPERTY); + $this->assertNotNull($parser->parse($docComment,$context)); + + + + $method = $class->getMethod('someFunction'); + $docComment = $property->getDocComment(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + + $parser->setTarget(Target::TARGET_METHOD); + $this->assertNotNull($parser->parse($docComment,$context)); + + + try { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass'); + $context = 'class ' . $class->getName(); + $docComment = $class->getDocComment(); + + $parser->setTarget(Target::TARGET_CLASS); + $parser->parse($class->getDocComment(),$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + + try { + + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod'); + $method = $class->getMethod('functionName'); + $docComment = $method->getDocComment(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + + $parser->setTarget(Target::TARGET_METHOD); + $parser->parse($docComment,$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + + try { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty'); + $property = $class->getProperty('foo'); + $docComment = $property->getDocComment(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + + $parser->setTarget(Target::TARGET_PROPERTY); + $parser->parse($docComment,$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + } + + public function getAnnotationVarTypeProviderValid() + { + //({attribute name}, {attribute value}) + return array( + // mixed type + array('mixed', '"String Value"'), + array('mixed', 'true'), + array('mixed', 'false'), + array('mixed', '1'), + array('mixed', '1.2'), + array('mixed', '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll'), + + // boolean type + array('boolean', 'true'), + array('boolean', 'false'), + + // alias for internal type boolean + array('bool', 'true'), + array('bool', 'false'), + + // integer type + array('integer', '0'), + array('integer', '1'), + array('integer', '123456789'), + array('integer', '9223372036854775807'), + + // alias for internal type double + array('float', '0.1'), + array('float', '1.2'), + array('float', '123.456'), + + // string type + array('string', '"String Value"'), + array('string', '"true"'), + array('string', '"123"'), + + // array type + array('array', '{@AnnotationExtendsAnnotationTargetAll}'), + array('array', '{@AnnotationExtendsAnnotationTargetAll,@AnnotationExtendsAnnotationTargetAll}'), + + array('arrayOfIntegers', '1'), + array('arrayOfIntegers', '{1}'), + array('arrayOfIntegers', '{1,2,3,4}'), + array('arrayOfAnnotations', '@AnnotationExtendsAnnotationTargetAll'), + array('arrayOfAnnotations', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll}'), + array('arrayOfAnnotations', '{@AnnotationExtendsAnnotationTargetAll, @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll}'), + + // annotation instance + array('annotation', '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll'), + array('annotation', '@AnnotationExtendsAnnotationTargetAll'), + ); + } + + public function getAnnotationVarTypeProviderInvalid() + { + //({attribute name}, {type declared type}, {attribute value} , {given type or class}) + return array( + // boolean type + array('boolean','boolean','1','integer'), + array('boolean','boolean','1.2','double'), + array('boolean','boolean','"str"','string'), + array('boolean','boolean','{1,2,3}','array'), + array('boolean','boolean','@Name', 'an instance of Doctrine\Tests\Common\Annotations\Name'), + + // alias for internal type boolean + array('bool','bool', '1','integer'), + array('bool','bool', '1.2','double'), + array('bool','bool', '"str"','string'), + array('bool','bool', '{"str"}','array'), + + // integer type + array('integer','integer', 'true','boolean'), + array('integer','integer', 'false','boolean'), + array('integer','integer', '1.2','double'), + array('integer','integer', '"str"','string'), + array('integer','integer', '{"str"}','array'), + array('integer','integer', '{1,2,3,4}','array'), + + // alias for internal type double + array('float','float', 'true','boolean'), + array('float','float', 'false','boolean'), + array('float','float', '123','integer'), + array('float','float', '"str"','string'), + array('float','float', '{"str"}','array'), + array('float','float', '{12.34}','array'), + array('float','float', '{1,2,3}','array'), + + // string type + array('string','string', 'true','boolean'), + array('string','string', 'false','boolean'), + array('string','string', '12','integer'), + array('string','string', '1.2','double'), + array('string','string', '{"str"}','array'), + array('string','string', '{1,2,3,4}','array'), + + // annotation instance + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'true','boolean'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'false','boolean'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '12','integer'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '1.2','double'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{"str"}','array'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{1,2,3,4}','array'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '@Name','an instance of Doctrine\Tests\Common\Annotations\Name'), + ); + } + + public function getAnnotationVarTypeArrayProviderInvalid() + { + //({attribute name}, {type declared type}, {attribute value} , {given type or class}) + return array( + array('arrayOfIntegers','integer', 'true','boolean'), + array('arrayOfIntegers','integer', 'false','boolean'), + array('arrayOfIntegers','integer', '{true,true}','boolean'), + array('arrayOfIntegers','integer', '{1,true}','boolean'), + array('arrayOfIntegers','integer', '{1,2,1.2}','double'), + array('arrayOfIntegers','integer', '{1,2,"str"}','string'), + + + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'true','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'false','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,true}','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,true}','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,1.2}','double'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,@AnnotationExtendsAnnotationTargetAll,"str"}','string'), + ); + } + + /** + * @dataProvider getAnnotationVarTypeProviderValid + */ + public function testAnnotationWithVarType($attribute, $value) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::$invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + $result = $parser->parse($docblock, $context); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType', $result[0]); + $this->assertNotNull($result[0]->$attribute); + } + + /** + * @dataProvider getAnnotationVarTypeProviderInvalid + */ + public function testAnnotationWithVarTypeError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType declared on property SomeClassName::invalidProperty. expects a(n) $type, but got $given.", $exc->getMessage()); + } + } + + + /** + * @dataProvider getAnnotationVarTypeArrayProviderInvalid + */ + public function testAnnotationWithVarTypeArrayError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType declared on property SomeClassName::invalidProperty. expects either a(n) $type, or an array of {$type}s, but got $given.", $exc->getMessage()); + } + } + + /** + * @dataProvider getAnnotationVarTypeProviderValid + */ + public function testAnnotationWithAttributes($attribute, $value) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::$invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + $result = $parser->parse($docblock, $context); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes', $result[0]); + $getter = "get".ucfirst($attribute); + $this->assertNotNull($result[0]->$getter()); + } + + /** + * @dataProvider getAnnotationVarTypeProviderInvalid + */ + public function testAnnotationWithAttributesError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes declared on property SomeClassName::invalidProperty. expects a(n) $type, but got $given.", $exc->getMessage()); + } + } + + + /** + * @dataProvider getAnnotationVarTypeArrayProviderInvalid + */ + public function testAnnotationWithAttributesWithVarTypeArrayError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes declared on property SomeClassName::invalidProperty. expects either a(n) $type, or an array of {$type}s, but got $given.", $exc->getMessage()); + } + } + + public function testAnnotationWithRequiredAttributes() + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $parser->setTarget(Target::TARGET_PROPERTY); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes("Some Value", annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + $result = $parser->parse($docblock); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes', $result[0]); + $this->assertEquals("Some Value",$result[0]->getValue()); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation', $result[0]->getAnnot()); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes("Some Value")'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "annot" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes declared on property SomeClassName::invalidProperty. expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. This value should not be null.', $exc->getMessage()); + } + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes(annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "value" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes declared on property SomeClassName::invalidProperty. expects a(n) string. This value should not be null.', $exc->getMessage()); + } + + } + + public function testAnnotationWithRequiredAttributesWithoutContructor() + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $parser->setTarget(Target::TARGET_PROPERTY); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor("Some Value", annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + $result = $parser->parse($docblock); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor', $result[0]); + $this->assertEquals("Some Value", $result[0]->value); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation', $result[0]->annot); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor("Some Value")'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "annot" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor declared on property SomeClassName::invalidProperty. expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. This value should not be null.', $exc->getMessage()); + } + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor(annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "value" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor declared on property SomeClassName::invalidProperty. expects a(n) string. This value should not be null.', $exc->getMessage()); + } + + } + + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation @SomeAnnotationClassNameWithoutConstructorAndProperties declared on does not accept any values, but got {"value":"Foo"}. + */ + public function testWithoutConstructorWhenIsNotDefaultValue() + { + $parser = $this->createTestParser(); + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation @SomeAnnotationClassNameWithoutConstructorAndProperties declared on does not accept any values, but got {"value":"Foo"}. + */ + public function testWithoutConstructorWhenHasNoProperties() + { + $parser = $this->createTestParser(); + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testAnnotationTargetSyntaxError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Invalid Target "Foo". Available targets: [ALL, CLASS, METHOD, PROPERTY, ANNOTATION] + */ + public function testAnnotationWithInvalidTargetDeclarationError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage @Target expects either a string value, or an array of strings, "NULL" given. + */ + public function testAnnotationWithTargetEmptyError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @group DDC-575 + */ + public function testRegressionDDC575() + { + $parser = $this->createTestParser(); + + $docblock = <<parse($docblock); + + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Name", $result[0]); + + $docblock = <<parse($docblock); + + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Name", $result[0]); + } + + /** + * @group DDC-77 + */ + public function testAnnotationWithoutClassIsIgnoredWithoutWarning() + { + $parser = new DocParser(); + $parser->setIgnoreNotImportedAnnotations(true); + $result = $parser->parse("@param"); + + $this->assertEquals(0, count($result)); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected PlainValue, got ''' at position 10. + */ + public function testAnnotationDontAcceptSingleQuotes() + { + $parser = $this->createTestParser(); + $parser->parse("@Name(foo='bar')"); + } + + /** + * @group DCOM-41 + */ + public function testAnnotationDoesntThrowExceptionWhenAtSignIsNotFollowedByIdentifier() + { + $parser = new DocParser(); + $result = $parser->parse("'@'"); + + $this->assertEquals(0, count($result)); + } + + /** + * @group DCOM-41 + * @expectedException Doctrine\Common\Annotations\AnnotationException + */ + public function testAnnotationThrowsExceptionWhenAtSignIsNotFollowedByIdentifierInNestedAnnotation() + { + $parser = new DocParser(); + $result = $parser->parse("@Doctrine\Tests\Common\Annotations\Name(@')"); + } + + /** + * @group DCOM-56 + */ + public function testAutoloadAnnotation() + { + $this->assertFalse(class_exists('Doctrine\Tests\Common\Annotations\Fixture\Annotation\Autoload', false), 'Pre-condition: Doctrine\Tests\Common\Annotations\Fixture\Annotation\Autoload not allowed to be loaded.'); + + $parser = new DocParser(); + + AnnotationRegistry::registerAutoloadNamespace('Doctrine\Tests\Common\Annotations\Fixtures\Annotation', __DIR__ . '/../../../../'); + + $parser->setImports(array( + 'autoload' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Autoload', + )); + $annotations = $parser->parse('@Autoload'); + + $this->assertEquals(1, count($annotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Autoload', $annotations[0]); + } + + public function createTestParser() + { + $parser = new DocParser(); + $parser->setIgnoreNotImportedAnnotations(true); + $parser->setImports(array( + 'name' => 'Doctrine\Tests\Common\Annotations\Name', + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations', + )); + + return $parser; + } + + /** + * @group DDC-78 + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected PlainValue, got ''' at position 10 in class \Doctrine\Tests\Common\Annotations\Name + */ + public function testSyntaxErrorWithContextDescription() + { + $parser = $this->createTestParser(); + $parser->parse("@Name(foo='bar')", "class \Doctrine\Tests\Common\Annotations\Name"); + } + + /** + * @group DDC-183 + */ + public function testSyntaxErrorWithUnknownCharacters() + { + $docblock = <<setInput(trim($docblock, '/ *')); + //var_dump($lexer); + + try { + $parser = $this->createTestParser(); + $result = $parser->parse($docblock); + } catch (Exception $e) { + $this->fail($e->getMessage()); + } + } + + /** + * @group DCOM-14 + */ + public function testIgnorePHPDocThrowTag() + { + $docblock = <<createTestParser(); + $result = $parser->parse($docblock); + } catch (Exception $e) { + $this->fail($e->getMessage()); + } + } + + /** + * @group DCOM-38 + */ + public function testCastInt() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=1234)"); + $annot = $result[0]; + $this->assertInternalType('int', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastNegativeInt() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=-1234)"); + $annot = $result[0]; + $this->assertInternalType('int', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastFloat() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastNegativeFloat() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=-1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->foo); + + $result = $parser->parse("@Marker(-1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->value); + } + + public function testReservedKeywordsInAnnotations() + { + $parser = $this->createTestParser(); + + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\True'); + $this->assertTrue($result[0] instanceof True); + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\False'); + $this->assertTrue($result[0] instanceof False); + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\Null'); + $this->assertTrue($result[0] instanceof Null); + + $result = $parser->parse('@True'); + $this->assertTrue($result[0] instanceof True); + $result = $parser->parse('@False'); + $this->assertTrue($result[0] instanceof False); + $result = $parser->parse('@Null'); + $this->assertTrue($result[0] instanceof Null); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Creation Error] The annotation @SomeAnnotationClassNameWithoutConstructor declared on some class does not have a property named "invalidaProperty". Available properties: data, name + */ + public function testSetValuesExeption() + { + $docblock = <<createTestParser()->parse($docblock, 'some class'); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Syntax Error] Expected Doctrine\Common\Annotations\DocLexer::T_IDENTIFIER or Doctrine\Common\Annotations\DocLexer::T_TRUE or Doctrine\Common\Annotations\DocLexer::T_FALSE or Doctrine\Common\Annotations\DocLexer::T_NULL, got '3.42' at position 5. + */ + public function testInvalidIdentifierInAnnotation() + { + $parser = $this->createTestParser(); + $parser->parse('@Foo\3.42'); + } + + public function testTrailingCommaIsAllowed() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Name({ + "Foo", + "Bar", + })'); + $this->assertEquals(1, count($annots)); + $this->assertEquals(array('Foo', 'Bar'), $annots[0]->value); + } + + public function testDefaultAnnotationValueIsNotOverwritten() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Doctrine\Tests\Common\Annotations\Fixtures\Annotation\AnnotWithDefaultValue'); + $this->assertEquals(1, count($annots)); + $this->assertEquals('bar', $annots[0]->foo); + } + + public function testArrayWithColon() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Name({"foo": "bar"})'); + $this->assertEquals(1, count($annots)); + $this->assertEquals(array('foo' => 'bar'), $annots[0]->value); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Syntax Error] Expected PlainValue, got 'foo:' at position 6. + */ + public function testColonNotAllowedOnTopLevel() + { + $parser = $this->createTestParser(); + $parser->parse('@Name(foo: "bar")'); + } +} + +/** @Annotation */ +class SomeAnnotationClassNameWithoutConstructor +{ + public $data; + public $name; +} + +/** @Annotation */ +class SomeAnnotationWithConstructorWithoutParams +{ + function __construct() + { + $this->data = "Some data"; + } + public $data; + public $name; +} + +/** @Annotation */ +class SomeAnnotationClassNameWithoutConstructorAndProperties{} + +/** + * @Annotation + * @Target("Foo") + */ +class AnnotationWithInvalidTargetDeclaration{} + +/** + * @Annotation + * @Target + */ +class AnnotationWithTargetEmpty{} + +/** @Annotation */ +class AnnotationExtendsAnnotationTargetAll extends \Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll +{ +} + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation { + public $foo; +} + +/** @Annotation */ +class Marker { + public $value; +} + +/** @Annotation */ +class True {} + +/** @Annotation */ +class False {} + +/** @Annotation */ +class Null {} + +namespace Doctrine\Tests\Common\Annotations\FooBar; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation { +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php new file mode 100644 index 00000000..c84344d8 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php @@ -0,0 +1,40 @@ +cacheDir = sys_get_temp_dir() . "/annotations_". uniqid(); + @mkdir($this->cacheDir); + return new FileCacheReader(new AnnotationReader(), $this->cacheDir); + } + + public function tearDown() + { + foreach (glob($this->cacheDir.'/*.php') AS $file) { + unlink($file); + } + rmdir($this->cacheDir); + } + + /** + * @group DCOM-81 + */ + public function testAttemptToCreateAnnotationCacheDir() + { + $this->cacheDir = sys_get_temp_dir() . "/not_existed_dir_". uniqid(); + + $this->assertFalse(is_dir($this->cacheDir)); + + $cache = new FileCacheReader(new AnnotationReader(), $this->cacheDir); + + $this->assertTrue(is_dir($this->cacheDir)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php new file mode 100644 index 00000000..44108e19 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php @@ -0,0 +1,10 @@ +roles = $values['value']; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php new file mode 100644 index 00000000..b507e602 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php @@ -0,0 +1,14 @@ +name = isset($values['value']) ? $values['value'] : null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php new file mode 100644 index 00000000..09ef0317 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php @@ -0,0 +1,11 @@ +"), + @Attribute("annotation", type = "Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll"), + @Attribute("arrayOfAnnotations", type = "array"), + }) + */ +final class AnnotationWithAttributes +{ + + public final function __construct(array $data) + { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + private $mixed; + private $boolean; + private $bool; + private $float; + private $string; + private $integer; + private $array; + private $annotation; + private $arrayOfIntegers; + private $arrayOfAnnotations; + + /** + * @return mixed + */ + public function getMixed() + { + return $this->mixed; + } + + /** + * @return boolean + */ + public function getBoolean() + { + return $this->boolean; + } + + /** + * @return bool + */ + public function getBool() + { + return $this->bool; + } + + /** + * @return float + */ + public function getFloat() + { + return $this->float; + } + + /** + * @return string + */ + public function getString() + { + return $this->string; + } + + public function getInteger() + { + return $this->integer; + } + + /** + * @return array + */ + public function getArray() + { + return $this->array; + } + + /** + * @return Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll + */ + public function getAnnotation() + { + return $this->annotation; + } + + /** + * @return array + */ + public function getArrayOfIntegers() + { + return $this->arrayOfIntegers; + } + + /** + * @return array + */ + public function getArrayOfAnnotations() + { + return $this->arrayOfAnnotations; + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php new file mode 100644 index 00000000..6eb1bc5a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php @@ -0,0 +1,50 @@ + $value) { + $this->$key = $value; + } + } + + /** + * @var string + */ + private $value; + + /** + * + * @var Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation + */ + private $annot; + + /** + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * @return Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation + */ + public function getAnnot() + { + return $this->annot; + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php new file mode 100644 index 00000000..bf458ee7 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php @@ -0,0 +1,24 @@ + + */ + public $arrayOfIntegers; + + /** + * @var array + */ + public $arrayOfAnnotations; + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php new file mode 100644 index 00000000..4e652e13 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php @@ -0,0 +1,30 @@ + + */ +class Controller +{ + /** + * @Route("/", name="_demo") + * @Template() + */ + public function indexAction() + { + return array(); + } + + /** + * @Route("/hello/{name}", name="_demo_hello") + * @Template() + */ + public function helloAction($name) + { + return array('name' => $name); + } + + /** + * @Route("/contact", name="_demo_contact") + * @Template() + */ + public function contactAction() + { + $form = ContactForm::create($this->get('form.context'), 'contact'); + + $form->bind($this->container->get('request'), $form); + if ($form->isValid()) { + $form->send($this->get('mailer')); + + $this->get('session')->setFlash('notice', 'Message sent!'); + + return new RedirectResponse($this->generateUrl('_demo')); + } + + return array('form' => $form); + } + + /** + * Creates the ACL for the passed object identity + * + * @param ObjectIdentityInterface $oid + * @return void + */ + private function createObjectIdentity(ObjectIdentityInterface $oid) + { + $classId = $this->createOrRetrieveClassId($oid->getType()); + + $this->connection->executeQuery($this->getInsertObjectIdentitySql($oid->getIdentifier(), $classId, true)); + } + + /** + * Returns the primary key for the passed class type. + * + * If the type does not yet exist in the database, it will be created. + * + * @param string $classType + * @return integer + */ + private function createOrRetrieveClassId($classType) + { + if (false !== $id = $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn()) { + return $id; + } + + $this->connection->executeQuery($this->getInsertClassSql($classType)); + + return $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn(); + } + + /** + * Returns the primary key for the passed security identity. + * + * If the security identity does not yet exist in the database, it will be + * created. + * + * @param SecurityIdentityInterface $sid + * @return integer + */ + private function createOrRetrieveSecurityIdentityId(SecurityIdentityInterface $sid) + { + if (false !== $id = $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn()) { + return $id; + } + + $this->connection->executeQuery($this->getInsertSecurityIdentitySql($sid)); + + return $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn(); + } + + /** + * Deletes all ACEs for the given object identity primary key. + * + * @param integer $oidPK + * @return void + */ + private function deleteAccessControlEntries($oidPK) + { + $this->connection->executeQuery($this->getDeleteAccessControlEntriesSql($oidPK)); + } + + /** + * Deletes the object identity from the database. + * + * @param integer $pk + * @return void + */ + private function deleteObjectIdentity($pk) + { + $this->connection->executeQuery($this->getDeleteObjectIdentitySql($pk)); + } + + /** + * Deletes all entries from the relations table from the database. + * + * @param integer $pk + * @return void + */ + private function deleteObjectIdentityRelations($pk) + { + $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk)); + } + + /** + * This regenerates the ancestor table which is used for fast read access. + * + * @param AclInterface $acl + * @return void + */ + private function regenerateAncestorRelations(AclInterface $acl) + { + $pk = $acl->getId(); + $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk)); + $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $pk)); + + $parentAcl = $acl->getParentAcl(); + while (null !== $parentAcl) { + $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $parentAcl->getId())); + + $parentAcl = $parentAcl->getParentAcl(); + } + } + + /** + * This processes changes on an ACE related property (classFieldAces, or objectFieldAces). + * + * @param string $name + * @param array $changes + * @return void + */ + private function updateFieldAceProperty($name, array $changes) + { + $sids = new \SplObjectStorage(); + $classIds = new \SplObjectStorage(); + $currentIds = array(); + foreach ($changes[1] as $field => $new) { + for ($i=0,$c=count($new); $i<$c; $i++) { + $ace = $new[$i]; + + if (null === $ace->getId()) { + if ($sids->contains($ace->getSecurityIdentity())) { + $sid = $sids->offsetGet($ace->getSecurityIdentity()); + } else { + $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity()); + } + + $oid = $ace->getAcl()->getObjectIdentity(); + if ($classIds->contains($oid)) { + $classId = $classIds->offsetGet($oid); + } else { + $classId = $this->createOrRetrieveClassId($oid->getType()); + } + + $objectIdentityId = $name === 'classFieldAces' ? null : $ace->getAcl()->getId(); + + $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, $field, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure())); + $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, $field, $i))->fetchColumn(); + $this->loadedAces[$aceId] = $ace; + + $aceIdProperty = new \ReflectionProperty('Symfony\Component\Security\Acl\Domain\Entry', 'id'); + $aceIdProperty->setAccessible(true); + $aceIdProperty->setValue($ace, intval($aceId)); + } else { + $currentIds[$ace->getId()] = true; + } + } + } + + foreach ($changes[0] as $old) { + for ($i=0,$c=count($old); $i<$c; $i++) { + $ace = $old[$i]; + + if (!isset($currentIds[$ace->getId()])) { + $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId())); + unset($this->loadedAces[$ace->getId()]); + } + } + } + } + + /** + * This processes changes on an ACE related property (classAces, or objectAces). + * + * @param string $name + * @param array $changes + * @return void + */ + private function updateAceProperty($name, array $changes) + { + list($old, $new) = $changes; + + $sids = new \SplObjectStorage(); + $classIds = new \SplObjectStorage(); + $currentIds = array(); + for ($i=0,$c=count($new); $i<$c; $i++) { + $ace = $new[$i]; + + if (null === $ace->getId()) { + if ($sids->contains($ace->getSecurityIdentity())) { + $sid = $sids->offsetGet($ace->getSecurityIdentity()); + } else { + $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity()); + } + + $oid = $ace->getAcl()->getObjectIdentity(); + if ($classIds->contains($oid)) { + $classId = $classIds->offsetGet($oid); + } else { + $classId = $this->createOrRetrieveClassId($oid->getType()); + } + + $objectIdentityId = $name === 'classAces' ? null : $ace->getAcl()->getId(); + + $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, null, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure())); + $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, null, $i))->fetchColumn(); + $this->loadedAces[$aceId] = $ace; + + $aceIdProperty = new \ReflectionProperty($ace, 'id'); + $aceIdProperty->setAccessible(true); + $aceIdProperty->setValue($ace, intval($aceId)); + } else { + $currentIds[$ace->getId()] = true; + } + } + + for ($i=0,$c=count($old); $i<$c; $i++) { + $ace = $old[$i]; + + if (!isset($currentIds[$ace->getId()])) { + $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId())); + unset($this->loadedAces[$ace->getId()]); + } + } + } + + /** + * Persists the changes which were made to ACEs to the database. + * + * @param \SplObjectStorage $aces + * @return void + */ + private function updateAces(\SplObjectStorage $aces) + { + foreach ($aces as $ace) { + $propertyChanges = $aces->offsetGet($ace); + $sets = array(); + + if (isset($propertyChanges['mask'])) { + $sets[] = sprintf('mask = %d', $propertyChanges['mask'][1]); + } + if (isset($propertyChanges['strategy'])) { + $sets[] = sprintf('granting_strategy = %s', $this->connection->quote($propertyChanges['strategy'])); + } + if (isset($propertyChanges['aceOrder'])) { + $sets[] = sprintf('ace_order = %d', $propertyChanges['aceOrder'][1]); + } + if (isset($propertyChanges['auditSuccess'])) { + $sets[] = sprintf('audit_success = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditSuccess'][1])); + } + if (isset($propertyChanges['auditFailure'])) { + $sets[] = sprintf('audit_failure = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditFailure'][1])); + } + + $this->connection->executeQuery($this->getUpdateAccessControlEntrySql($ace->getId(), $sets)); + } + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php new file mode 100644 index 00000000..bda2cc21 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php @@ -0,0 +1,15 @@ +test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test2() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test3() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test4() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test5() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test6() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test7() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test8() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test9() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test10() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test11() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test12() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test13() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test14() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test15() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test16() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test17() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test18() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test19() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test20() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test21() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test22() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test23() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test24() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test25() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test26() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test27() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test28() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test29() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test30() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test31() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test32() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test33() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test34() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test35() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test36() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test37() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test38() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test39() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php new file mode 100644 index 00000000..1dae104a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php @@ -0,0 +1,5 @@ +test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test2() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test3() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test4() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test5() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test6() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test7() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test8() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test9() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test10() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test11() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test12() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test13() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test14() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test15() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test16() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test17() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test18() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test19() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test20() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test21() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test22() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test23() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test24() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test25() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test26() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test27() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test28() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test29() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test30() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test31() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test32() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test33() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test34() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test35() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test36() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test37() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test38() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test39() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php new file mode 100644 index 00000000..58c5e6af --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php @@ -0,0 +1,13 @@ +getMethod(); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $reader->getMethodAnnotations($method); + } + $time = microtime(true) - $time; + + $this->printResults('cached reader (in-memory)', $time, $c); + } + + /** + * @group performance + */ + public function testCachedReadPerformanceWithFileCache() + { + $method = $this->getMethod(); + + // prime cache + $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir()); + $reader->getMethodAnnotations($method); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir()); + $reader->getMethodAnnotations($method); + clearstatcache(); + } + $time = microtime(true) - $time; + + $this->printResults('cached reader (file)', $time, $c); + } + + /** + * @group performance + */ + public function testReadPerformance() + { + $method = $this->getMethod(); + + $time = microtime(true); + for ($i=0,$c=150; $i<$c; $i++) { + $reader = new AnnotationReader(); + $reader->getMethodAnnotations($method); + } + $time = microtime(true) - $time; + + $this->printResults('reader', $time, $c); + } + + /** + * @group performance + */ + public function testDocParsePerformance() + { + $imports = array( + 'ignorephpdoc' => 'Annotations\Annotation\IgnorePhpDoc', + 'ignoreannotation' => 'Annotations\Annotation\IgnoreAnnotation', + 'route' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Route', + 'template' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Template', + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations\Fixtures', + ); + $ignored = array( + 'access', 'author', 'copyright', 'deprecated', 'example', 'ignore', + 'internal', 'link', 'see', 'since', 'tutorial', 'version', 'package', + 'subpackage', 'name', 'global', 'param', 'return', 'staticvar', + 'static', 'var', 'throws', 'inheritdoc', + ); + + $method = $this->getMethod(); + $methodComment = $method->getDocComment(); + $classComment = $method->getDeclaringClass()->getDocComment(); + + $time = microtime(true); + for ($i=0,$c=200; $i<$c; $i++) { + $parser = new DocParser(); + $parser->setImports($imports); + $parser->setIgnoredAnnotationNames($ignored); + $parser->setIgnoreNotImportedAnnotations(true); + + $parser->parse($methodComment); + $parser->parse($classComment); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser', $time, $c); + } + + /** + * @group performance + */ + public function testDocLexerPerformance() + { + $method = $this->getMethod(); + $methodComment = $method->getDocComment(); + $classComment = $method->getDeclaringClass()->getDocComment(); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $lexer = new DocLexer(); + $lexer->setInput($methodComment); + $lexer->setInput($classComment); + } + $time = microtime(true) - $time; + + $this->printResults('doc-lexer', $time, $c); + } + + /** + * @group performance + */ + public function testPhpParserPerformanceWithShortCut() + { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\NamespacedSingleClassLOC1000'); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $parser = new PhpParser(); + $parser->parseClass($class); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser-with-short-cut', $time, $c); + } + + /** + * @group performance + */ + public function testPhpParserPerformanceWithoutShortCut() + { + $class = new \ReflectionClass('SingleClassLOC1000'); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $parser = new PhpParser(); + $parser->parseClass($class); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser-without-short-cut', $time, $c); + } + + private function getMethod() + { + return new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\Controller', 'helloAction'); + } + + private function printResults($test, $time, $iterations) + { + if (0 == $iterations) { + throw new \InvalidArgumentException('$iterations cannot be zero.'); + } + + $title = $test." results:\n"; + $iterationsText = sprintf("Iterations: %d\n", $iterations); + $totalTime = sprintf("Total Time: %.3f s\n", $time); + $iterationTime = sprintf("Time per iteration: %.3f ms\n", $time/$iterations * 1000); + + $max = max(strlen($title), strlen($iterationTime)) - 1; + + echo "\n".str_repeat('-', $max)."\n"; + echo $title; + echo str_repeat('=', $max)."\n"; + echo $iterationsText; + echo $totalTime; + echo $iterationTime; + echo str_repeat('-', $max)."\n"; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php new file mode 100644 index 00000000..8de4aabf --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php @@ -0,0 +1,179 @@ +assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testParseClassWithMultipleImportsInUseStatement() + { + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\MultipleImportsInUseStatement'); + $parser = new PhpParser(); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testParseClassWhenNotUserDefined() + { + $parser = new PhpParser(); + $this->assertEquals(array(), $parser->parseClass(new \ReflectionClass('\stdClass'))); + } + + public function testParseClassWhenClassIsNotNamespaced() + { + $parser = new PhpParser(); + $class = new ReflectionClass('\AnnotationsTestsFixturesNonNamespacedClass'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testParseClassWhenClassIsInterface() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\TestInterface'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testClassWithFullyQualifiedUseStatements() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\ClassWithFullyQualifiedUseStatements'); + + $this->assertEquals(array( + 'secure' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testNamespaceAndClassCommentedOut() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceAndClassCommentedOut'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testEqualNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\EqualNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + ), $parser->parseClass($class)); + } + + public function testEqualNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\EqualNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testDifferentNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\DifferentNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testDifferentNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\DifferentNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testGlobalNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new \ReflectionClass('\GlobalNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + ), $parser->parseClass($class)); + } + + public function testGlobalNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass('\GlobalNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testNamespaceWithClosureDeclaration() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceWithClosureDeclaration'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testIfPointerResetsOnMultipleParsingTries() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceWithClosureDeclaration'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php new file mode 100644 index 00000000..376539ff --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php @@ -0,0 +1,97 @@ +getReader(); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassDDC1660'); + + $this->assertTrue(class_exists('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Version')); + $this->assertCount(1, $reader->getClassAnnotations($class)); + $this->assertCount(1, $reader->getMethodAnnotations($class->getMethod('bar'))); + $this->assertCount(1, $reader->getPropertyAnnotations($class->getProperty('foo'))); + } + + protected function getReader() + { + $reader = new SimpleAnnotationReader(); + $reader->addNamespace(__NAMESPACE__); + $reader->addNamespace(__NAMESPACE__ . '\Fixtures'); + $reader->addNamespace(__NAMESPACE__ . '\Fixtures\Annotation'); + + return $reader; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php new file mode 100644 index 00000000..a7b9e2f2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php @@ -0,0 +1,65 @@ +getClassAnnotations($class); + } + + public function testAnnotation() + { + $class = new \ReflectionClass(__NAMESPACE__ . '\\DCOM55Consumer'); + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $annots = $reader->getClassAnnotations($class); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf(__NAMESPACE__.'\\DCOM55Annotation', $annots[0]); + } + + public function testParseAnnotationDocblocks() + { + $class = new \ReflectionClass(__NAMESPACE__ . '\\DCOM55Annotation'); + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $annots = $reader->getClassAnnotations($class); + + $this->assertEquals(0, count($annots)); + } +} + +/** + * @Controller + */ +class Dummy +{ + +} + +/** + * @Annotation + */ +class DCOM55Annotation +{ + +} + +/** + * @DCOM55Annotation + */ +class DCOM55Consumer +{ + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php new file mode 100644 index 00000000..708bcc99 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php @@ -0,0 +1,8 @@ +getClassAnnotations(new \ReflectionClass(__NAMESPACE__."\MappedClass")); + + foreach ($result as $annot) { + $classAnnotations[get_class($annot)] = $annot; + } + + $this->assertTrue(!isset($classAnnotations['']), 'Class "xxx" is not a valid entity or mapped super class.'); + } + + public function testIssueGlobalNamespace() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->setImports(array( + "__NAMESPACE__" =>"Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping" + )); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + + public function testIssueNamespaces() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM"); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Entity", $annots[0]); + } + + public function testIssueMultipleNamespaces() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping"); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM"); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + + public function testIssueWithNamespacesOrImports() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Entity", $annots[0]); + $this->assertEquals(1, count($annots)); + } + + + public function testIssueSimpleAnnotationReader() + { + $reader = new \Doctrine\Common\Annotations\SimpleAnnotationReader(); + $reader->addNamespace('Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping'); + $annots = $reader->getClassAnnotations(new \ReflectionClass(__NAMESPACE__."\MappedClass")); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + +} + +/** + * @Entity + */ +class MappedClass +{ + +} + + +namespace Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping; +/** +* @Annotation +*/ +class Entity +{ + +} + +namespace Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM; +/** +* @Annotation +*/ +class Entity +{ + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php new file mode 100644 index 00000000..ff3ca376 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php @@ -0,0 +1,8 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of APC'); + } + } + + protected function _getCacheDriver() + { + return new ApcCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php new file mode 100644 index 00000000..71927174 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php @@ -0,0 +1,13 @@ +_getCacheDriver(); + + // Test save + $cache->save('test_key', 'testing this out'); + + // Test contains to test that save() worked + $this->assertTrue($cache->contains('test_key')); + + // Test fetch + $this->assertEquals('testing this out', $cache->fetch('test_key')); + + // Test delete + $cache->save('test_key2', 'test2'); + $cache->delete('test_key2'); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testDeleteAll() + { + $cache = $this->_getCacheDriver(); + $cache->save('test_key1', '1'); + $cache->save('test_key2', '2'); + $cache->deleteAll(); + + $this->assertFalse($cache->contains('test_key1')); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testFlushAll() + { + $cache = $this->_getCacheDriver(); + $cache->save('test_key1', '1'); + $cache->save('test_key2', '2'); + $cache->flushAll(); + + $this->assertFalse($cache->contains('test_key1')); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testNamespace() + { + $cache = $this->_getCacheDriver(); + $cache->setNamespace('test_'); + $cache->save('key1', 'test'); + + $this->assertTrue($cache->contains('key1')); + + $cache->setNamespace('test2_'); + + $this->assertFalse($cache->contains('key1')); + } + + /** + * @group DCOM-43 + */ + public function testGetStats() + { + if ($this instanceof ArrayCacheTest || $this instanceof ZendDataCacheTest ) { + $this->markTestSkipped("Statistics are not available for this driver"); + } + + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + + $this->assertArrayHasKey(Cache::STATS_HITS, $stats); + $this->assertArrayHasKey(Cache::STATS_MISSES, $stats); + $this->assertArrayHasKey(Cache::STATS_UPTIME, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_USAGE, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_AVAILIABLE, $stats); + } + + /** + * @return \Doctrine\Common\Cache\CacheProvider + */ + abstract protected function _getCacheDriver(); +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php new file mode 100644 index 00000000..362ff69a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php @@ -0,0 +1,38 @@ +_memcache = new \Memcache; + $ok = @$this->_memcache->connect('localhost', 11211); + if (!$ok) { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } else { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } + + public function testNoExpire() { + $cache = $this->_getCacheDriver(); + $cache->save('noexpire', 'value', 0); + sleep(1); + $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire'); + } + + protected function _getCacheDriver() + { + $driver = new MemcacheCache(); + $driver->setMemcache($this->_memcache); + return $driver; + } + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php new file mode 100644 index 00000000..947ba752 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php @@ -0,0 +1,40 @@ +memcached = new \Memcached(); + $this->memcached->setOption(\Memcached::OPT_COMPRESSION, false); + $this->memcached->addServer('127.0.0.1', 11211); + + $fh = @fsockopen('127.0.0.1', 11211); + if (!$fh) { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } else { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } + + public function testNoExpire() { + $cache = $this->_getCacheDriver(); + $cache->save('noexpire', 'value', 0); + sleep(1); + $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire'); + } + + protected function _getCacheDriver() + { + $driver = new MemcachedCache(); + $driver->setMemcached($this->memcached); + return $driver; + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php new file mode 100644 index 00000000..cb363df9 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of Wincache'); + } + } + + protected function _getCacheDriver() + { + return new WincacheCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php new file mode 100644 index 00000000..62598487 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of xcache'); + } + } + + protected function _getCacheDriver() + { + return new XcacheCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php new file mode 100644 index 00000000..27dcf359 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of Zend Data Cache which only works in apache2handler SAPI'); + } + } + + protected function _getCacheDriver() + { + return new ZendDataCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php new file mode 100644 index 00000000..567cf918 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php @@ -0,0 +1,45 @@ +setIncludePath(__DIR__); + $classLoader->setFileExtension('.class.php'); + $classLoader->setNamespaceSeparator('_'); + + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassA')); + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassB')); + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassC')); + $this->assertFalse($classLoader->canLoadClass('OtherClass')); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassA'), true); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassB'), true); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassC'), true); + } + + public function testClassExists() + { + $this->assertFalse(ClassLoader::classExists('ClassLoaderTest\ClassD')); + $badLoader = function($className) { + require __DIR__ . '/ClassLoaderTest/ClassD.php'; + return true; + }; + spl_autoload_register($badLoader); + $this->assertTrue(ClassLoader::classExists('ClassLoaderTest\ClassD')); + spl_autoload_unregister($badLoader); + } + + public function testGetClassLoader() + { + $cl = new ClassLoader('ClassLoaderTest', __DIR__); + $cl->register(); + $this->assertTrue(ClassLoader::getClassLoader('ClassLoaderTest\ClassD') instanceof \Doctrine\Common\ClassLoader); + $this->assertNull(ClassLoader::getClassLoader('This\Class\Does\Not\Exist')); + $cl->unregister(); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php new file mode 100644 index 00000000..85546547 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php @@ -0,0 +1,6 @@ +_coll = new \Doctrine\Common\Collections\ArrayCollection; + } + + public function testIssetAndUnset() + { + $this->assertFalse(isset($this->_coll[0])); + $this->_coll->add('testing'); + $this->assertTrue(isset($this->_coll[0])); + unset($this->_coll[0]); + $this->assertFalse(isset($this->_coll[0])); + } + + public function testToString() + { + $this->_coll->add('testing'); + $this->assertTrue(is_string((string) $this->_coll)); + } + + public function testRemovingNonExistentEntryReturnsNull() + { + $this->assertEquals(null, $this->_coll->remove('testing_does_not_exist')); + } + + public function testExists() + { + $this->_coll->add("one"); + $this->_coll->add("two"); + $exists = $this->_coll->exists(function($k, $e) { return $e == "one"; }); + $this->assertTrue($exists); + $exists = $this->_coll->exists(function($k, $e) { return $e == "other"; }); + $this->assertFalse($exists); + } + + public function testMap() + { + $this->_coll->add(1); + $this->_coll->add(2); + $res = $this->_coll->map(function($e) { return $e * 2; }); + $this->assertEquals(array(2, 4), $res->toArray()); + } + + public function testFilter() + { + $this->_coll->add(1); + $this->_coll->add("foo"); + $this->_coll->add(3); + $res = $this->_coll->filter(function($e) { return is_numeric($e); }); + $this->assertEquals(array(0 => 1, 2 => 3), $res->toArray()); + } + + public function testFirstAndLast() + { + $this->_coll->add('one'); + $this->_coll->add('two'); + + $this->assertEquals($this->_coll->first(), 'one'); + $this->assertEquals($this->_coll->last(), 'two'); + } + + public function testArrayAccess() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + + $this->assertEquals($this->_coll[0], 'one'); + $this->assertEquals($this->_coll[1], 'two'); + + unset($this->_coll[0]); + $this->assertEquals($this->_coll->count(), 1); + } + + public function testContainsKey() + { + $this->_coll[5] = 'five'; + $this->assertTrue($this->_coll->containsKey(5)); + } + + public function testContains() + { + $this->_coll[0] = 'test'; + $this->assertTrue($this->_coll->contains('test')); + } + + public function testSearch() + { + $this->_coll[0] = 'test'; + $this->assertEquals(0, $this->_coll->indexOf('test')); + } + + public function testGet() + { + $this->_coll[0] = 'test'; + $this->assertEquals('test', $this->_coll->get(0)); + } + + public function testGetKeys() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals(array(0, 1), $this->_coll->getKeys()); + } + + public function testGetValues() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals(array('one', 'two'), $this->_coll->getValues()); + } + + public function testCount() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals($this->_coll->count(), 2); + $this->assertEquals(count($this->_coll), 2); + } + + public function testForAll() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_string($e); }), true); + $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_array($e); }), false); + } + + public function testPartition() + { + $this->_coll[] = true; + $this->_coll[] = false; + $partition = $this->_coll->partition(function($k, $e) { return $e == true; }); + $this->assertEquals($partition[0][0], true); + $this->assertEquals($partition[1][0], false); + } + + public function testClear() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->_coll->clear(); + $this->assertEquals($this->_coll->isEmpty(), true); + } + + public function testRemove() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $el = $this->_coll->remove(0); + + $this->assertEquals('one', $el); + $this->assertEquals($this->_coll->contains('one'), false); + $this->assertNull($this->_coll->remove(0)); + } + + public function testRemoveElement() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + + $this->assertTrue($this->_coll->removeElement('two')); + $this->assertFalse($this->_coll->contains('two')); + $this->assertFalse($this->_coll->removeElement('two')); + } + + public function testSlice() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->_coll[] = 'three'; + + $slice = $this->_coll->slice(0, 1); + $this->assertInternalType('array', $slice); + $this->assertEquals(array('one'), $slice); + + $slice = $this->_coll->slice(1); + $this->assertEquals(array(1 => 'two', 2 => 'three'), $slice); + + $slice = $this->_coll->slice(1, 1); + $this->assertEquals(array(1 => 'two'), $slice); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php new file mode 100644 index 00000000..e69de29b diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php new file mode 100644 index 00000000..2b11b20e --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php @@ -0,0 +1,88 @@ +_eventManager = new EventManager; + $this->_preFooInvoked = false; + $this->_postFooInvoked = false; + } + + public function testInitialState() + { + $this->assertEquals(array(), $this->_eventManager->getListeners()); + $this->assertFalse($this->_eventManager->hasListeners(self::preFoo)); + $this->assertFalse($this->_eventManager->hasListeners(self::postFoo)); + } + + public function testAddEventListener() + { + $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); + $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); + $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); + $this->assertEquals(1, count($this->_eventManager->getListeners(self::preFoo))); + $this->assertEquals(1, count($this->_eventManager->getListeners(self::postFoo))); + $this->assertEquals(2, count($this->_eventManager->getListeners())); + } + + public function testDispatchEvent() + { + $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); + $this->_eventManager->dispatchEvent(self::preFoo); + $this->assertTrue($this->_preFooInvoked); + $this->assertFalse($this->_postFooInvoked); + } + + public function testRemoveEventListener() + { + $this->_eventManager->addEventListener(array('preBar'), $this); + $this->assertTrue($this->_eventManager->hasListeners(self::preBar)); + $this->_eventManager->removeEventListener(array('preBar'), $this); + $this->assertFalse($this->_eventManager->hasListeners(self::preBar)); + } + + public function testAddEventSubscriber() + { + $eventSubscriber = new TestEventSubscriber(); + $this->_eventManager->addEventSubscriber($eventSubscriber); + $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); + $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); + } + + /* Listener methods */ + + public function preFoo(EventArgs $e) + { + $this->_preFooInvoked = true; + } + + public function postFoo(EventArgs $e) + { + $this->_postFooInvoked = true; + } +} + +class TestEventSubscriber implements \Doctrine\Common\EventSubscriber +{ + public function getSubscribedEvents() + { + return array('preFoo', 'postFoo'); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php new file mode 100644 index 00000000..e1825ae2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php @@ -0,0 +1,94 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver1->expects($this->never()) + ->method('loadMetadataForClass'); + $driver1->expectS($this->never()) + ->method('isTransient'); + + $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver2->expects($this->at(0)) + ->method('loadMetadataForClass') + ->with($this->equalTo($className), $this->equalTo($classMetadata)); + $driver2->expects($this->at(1)) + ->method('isTransient') + ->with($this->equalTo($className)) + ->will($this->returnValue( true )); + + $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); + $chain->addDriver($driver2, 'Doctrine\Tests\Common\Persistence\Mapping'); + + $chain->loadMetadataForClass($className, $classMetadata); + + $this->assertTrue( $chain->isTransient($className) ); + } + + public function testLoadMetadata_NoDelegatorFound_ThrowsMappingException() + { + $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; + $classMetadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $this->setExpectedException('Doctrine\Common\Persistence\Mapping\MappingException'); + $chain->loadMetadataForClass($className, $classMetadata); + } + + public function testGatherAllClassNames() + { + $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; + $classMetadata = $this->getMock('Doctrine\Common\Peristence\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver1->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Doctrine\Tests\Models\Company\Foo'))); + + $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver2->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Doctrine\Tests\ORM\Mapping\Bar', 'Doctrine\Tests\ORM\Mapping\Baz', 'FooBarBaz'))); + + $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); + $chain->addDriver($driver2, 'Doctrine\Tests\ORM\Mapping'); + + $this->assertEquals(array( + 'Doctrine\Tests\Models\Company\Foo', + 'Doctrine\Tests\ORM\Mapping\Bar', + 'Doctrine\Tests\ORM\Mapping\Baz' + ), $chain->getAllClassNames()); + } + + /** + * @group DDC-706 + */ + public function testIsTransient() + { + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $chain = new MappingDriverChain(); + $chain->addDriver($driver1, 'Doctrine\Tests\Models\CMS'); + + $this->assertTrue($chain->isTransient('stdClass'), "stdClass isTransient"); + } +} + +class DriverChainEntity +{ + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php new file mode 100644 index 00000000..9fe32994 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php @@ -0,0 +1,134 @@ +getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $this->cmf = new TestClassMetadataFactory($driver, $metadata); + } + + public function testGetCacheDriver() + { + $this->assertNull($this->cmf->getCacheDriver()); + $cache = new ArrayCache(); + $this->cmf->setCacheDriver($cache); + $this->assertSame($cache, $this->cmf->getCacheDriver()); + } + + public function testGetMetadataFor() + { + $metadata = $this->cmf->getMetadataFor('stdClass'); + + $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); + $this->assertTrue($this->cmf->hasMetadataFor('stdClass')); + } + + public function testGetParentMetadata() + { + $metadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + + $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\RootEntity')); + } + + public function testGetCachedMetadata() + { + $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $cache = new ArrayCache(); + $cache->save(__NAMESPACE__. '\ChildEntity$CLASSMETADATA', $metadata); + + $this->cmf->setCacheDriver($cache); + + $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + $this->assertSame($loadedMetadata, $metadata); + } + + public function testCacheGetMetadataFor() + { + $cache = new ArrayCache(); + $this->cmf->setCacheDriver($cache); + + $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + + $this->assertSame($loadedMetadata, $cache->fetch(__NAMESPACE__. '\ChildEntity$CLASSMETADATA')); + } + + public function testGetAliasedMetadata() + { + $loadedMetadata = $this->cmf->getMetadataFor('prefix:ChildEntity'); + + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); + $this->assertTrue($this->cmf->hasMetadataFor('prefix:ChildEntity')); + } +} + +class TestClassMetadataFactory extends AbstractClassMetadataFactory +{ + public $driver; + public $metadata; + + public function __construct($driver, $metadata) + { + $this->driver = $driver; + $this->metadata = $metadata; + } + + protected function doLoadMetadata($class, $parent, $rootEntityFound) + { + + } + + protected function getFqcnFromAlias($namespaceAlias, $simpleClassName) + { + return __NAMESPACE__ . '\\' . $simpleClassName; + } + + protected function initialize() + { + + } + + protected function newClassMetadataInstance($className) + { + return $this->metadata; + } + + protected function getDriver() + { + return $this->driver; + } + protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService) + { + } + + protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService) + { + } +} + +class RootEntity +{ + +} + +class ChildEntity extends RootEntity +{ + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php new file mode 100644 index 00000000..3c600c40 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php @@ -0,0 +1,90 @@ +assertEquals(array($path), $locator->getPaths()); + + $locator = new DefaultFileLocator($path); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testGetFileExtension() + { + $locator = new DefaultFileLocator(array(), ".yml"); + $this->assertEquals(".yml", $locator->getFileExtension()); + $locator->setFileExtension(".xml"); + $this->assertEquals(".xml", $locator->getFileExtension()); + } + + public function testUniquePaths() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path, $path)); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testFindMappingFile() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->assertEquals(__DIR__ . '/_files/stdClass.yml', $locator->findMappingFile('stdClass')); + } + + public function testFindMappingFileNotFound() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->setExpectedException( + 'Doctrine\Common\Persistence\Mapping\MappingException', + "No mapping file found named 'stdClass2.yml' for class 'stdClass2'" + ); + $locator->findMappingFile('stdClass2'); + } + + public function testGetAllClassNames() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + $classes = $locator->getAllClassNames(null); + sort($classes); + + $this->assertEquals(array('global', 'stdClass'), $classes); + $this->assertEquals(array('stdClass'), $locator->getAllClassNames("global")); + } + + public function testGetAllClassNamesNonMatchingFileExtension() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".xml"); + $this->assertEquals(array(), $locator->getAllClassNames("global")); + } + + public function testFileExists() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->assertTrue($locator->fileExists("stdClass")); + $this->assertFalse($locator->fileExists("stdClass2")); + $this->assertTrue($locator->fileExists("global")); + $this->assertFalse($locator->fileExists("global2")); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php new file mode 100644 index 00000000..020c2424 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php @@ -0,0 +1,142 @@ +assertNull($driver->getGlobalBasename()); + + $driver->setGlobalBasename("global"); + $this->assertEquals("global", $driver->getGlobalBasename()); + } + + public function testGetElementFromGlobalFile() + { + $driver = new TestFileDriver($this->newLocator()); + $driver->setGlobalBasename("global"); + + $element = $driver->getElement('stdGlobal'); + + $this->assertEquals('stdGlobal', $element); + } + + public function testGetElementFromFile() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('findMappingFile') + ->with($this->equalTo('stdClass')) + ->will($this->returnValue(__DIR__ . '/_files/stdClass.yml')); + + $driver = new TestFileDriver($locator); + + $this->assertEquals('stdClass', $driver->getElement('stdClass')); + } + + public function testGetAllClassNamesGlobalBasename() + { + $driver = new TestFileDriver($this->newLocator()); + $driver->setGlobalBasename("global"); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdGlobal', 'stdGlobal2'), $classNames); + } + + public function testGetAllClassNamesFromMappingFile() + { + $locator = $this->newLocator(); + $locator->expects($this->any()) + ->method('getAllClassNames') + ->with($this->equalTo(null)) + ->will($this->returnValue(array('stdClass'))); + $driver = new TestFileDriver($locator); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdClass'), $classNames); + } + + public function testGetAllClassNamesBothSources() + { + $locator = $this->newLocator(); + $locator->expects($this->any()) + ->method('getAllClassNames') + ->with($this->equalTo('global')) + ->will($this->returnValue(array('stdClass'))); + $driver = new TestFileDriver($locator); + $driver->setGlobalBasename("global"); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdGlobal', 'stdGlobal2', 'stdClass'), $classNames); + } + + public function testIsNotTransient() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('fileExists') + ->with($this->equalTo('stdClass')) + ->will($this->returnValue( true )); + + $driver = new TestFileDriver($locator); + $driver->setGlobalBasename("global"); + + $this->assertFalse($driver->isTransient('stdClass')); + $this->assertFalse($driver->isTransient('stdGlobal')); + $this->assertFalse($driver->isTransient('stdGlobal2')); + } + + public function testIsTransient() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('fileExists') + ->with($this->equalTo('stdClass2')) + ->will($this->returnValue( false )); + + $driver = new TestFileDriver($locator); + + $this->assertTrue($driver->isTransient('stdClass2')); + } + + public function testNonLocatorFallback() + { + $driver = new TestFileDriver(__DIR__ . '/_files', '.yml'); + $this->assertTrue($driver->isTransient('stdClass2')); + $this->assertFalse($driver->isTransient('stdClass')); + } + + private function newLocator() + { + $locator = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\FileLocator'); + $locator->expects($this->any())->method('getFileExtension')->will($this->returnValue('.yml')); + $locator->expects($this->any())->method('getPaths')->will($this->returnValue(array(__DIR__ . "/_files"))); + return $locator; + } +} + +class TestFileDriver extends FileDriver +{ + protected function loadMappingFile($file) + { + if (strpos($file, "global.yml") !== false) { + return array('stdGlobal' => 'stdGlobal', 'stdGlobal2' => 'stdGlobal2'); + } + return array('stdClass' => 'stdClass'); + } + + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php new file mode 100644 index 00000000..8fc4d807 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php @@ -0,0 +1,18 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $metadata->expects($this->once())->method('getFieldNames'); + + $driver = new PHPDriver(array(__DIR__ . "/_files")); + $driver->loadMetadataForClass('TestEntity', $metadata); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php new file mode 100644 index 00000000..5f06cad9 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Tests\Common\Persistence\Mapping; + +use Doctrine\Common\Persistence\Mapping\RuntimeReflectionService; + +/** + * @group DCOM-93 + */ +class RuntimeReflectionServiceTest extends \PHPUnit_Framework_TestCase +{ + private $reflectionService; + + public function setUp() + { + $this->reflectionService = new RuntimeReflectionService(); + } + + public function testShortname() + { + $this->assertEquals("RuntimeReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); + } + + public function testClassNamespaceName() + { + $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); + } + + public function testGetParentClasses() + { + $classes = $this->reflectionService->getParentClasses(__CLASS__); + $this->assertTrue(count($classes) >= 1, "The test class ".__CLASS__." should have at least one parent."); + } + + public function testGetReflectionClass() + { + $class = $this->reflectionService->getClass(__CLASS__); + $this->assertInstanceOf("ReflectionClass", $class); + } + + public function testGetMethods() + { + $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); + $this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); + } + + public function testGetAccessibleProperty() + { + $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); + $this->assertInstanceOf("ReflectionProperty", $reflProp); + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php new file mode 100644 index 00000000..9f1c5684 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php @@ -0,0 +1,35 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $metadata->expects($this->once())->method('getFieldNames'); + + $driver = new StaticPHPDriver(array(__DIR__)); + $driver->loadMetadataForClass(__NAMESPACE__ . '\\TestEntity', $metadata); + } + + public function testGetAllClassNames() + { + $driver = new StaticPHPDriver(array(__DIR__)); + $classNames = $driver->getAllClassNames(); + + $this->assertContains( + 'Doctrine\Tests\Common\Persistence\Mapping\TestEntity', $classNames); + } +} + +class TestEntity +{ + static public function loadMetadata($metadata) + { + $metadata->getFieldNames(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php new file mode 100644 index 00000000..ffce6d40 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Tests\Common\Persistence\Mapping; + +use Doctrine\Common\Persistence\Mapping\StaticReflectionService; + +/** + * @group DCOM-93 + */ +class StaticReflectionServiceTest extends \PHPUnit_Framework_TestCase +{ + private $reflectionService; + + public function setUp() + { + $this->reflectionService = new StaticReflectionService(); + } + + public function testShortname() + { + $this->assertEquals("StaticReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); + } + + public function testClassNamespaceName() + { + $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); + } + + public function testGetParentClasses() + { + $classes = $this->reflectionService->getParentClasses(__CLASS__); + $this->assertTrue(count($classes) == 0, "The test class ".__CLASS__." should have no parents according to static reflection."); + } + + public function testGetReflectionClass() + { + $class = $this->reflectionService->getClass(__CLASS__); + $this->assertNull($class); + } + + public function testGetMethods() + { + $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); + $this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); + } + + public function testGetAccessibleProperty() + { + $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); + $this->assertNull($reflProp); + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php new file mode 100644 index 00000000..b51162e6 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php @@ -0,0 +1,88 @@ + $prefix)); + $this->assertEquals(array($path), $locator->getPaths()); + + $locator = new SymfonyFileLocator(array($path => $prefix)); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testGetPrefixes() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix)); + $this->assertEquals(array($path => $prefix), $locator->getNamespacePrefixes()); + } + + public function testGetFileExtension() + { + $locator = new SymfonyFileLocator(array(), ".yml"); + $this->assertEquals(".yml", $locator->getFileExtension()); + $locator->setFileExtension(".xml"); + $this->assertEquals(".xml", $locator->getFileExtension()); + } + + public function testFileExists() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->assertTrue($locator->fileExists("Foo\stdClass")); + $this->assertTrue($locator->fileExists("Foo\global")); + $this->assertFalse($locator->fileExists("Foo\stdClass2")); + $this->assertFalse($locator->fileExists("Foo\global2")); + } + + public function testGetAllClassNames() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + $classes = $locator->getAllClassNames(null); + sort($classes); + + $this->assertEquals(array("Foo\\global", "Foo\\stdClass"), $classes); + $this->assertEquals(array("Foo\\stdClass"), $locator->getAllClassNames("global")); + } + + public function testFindMappingFile() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->assertEquals(__DIR__ . "/_files/stdClass.yml", $locator->findMappingFile("Foo\\stdClass")); + } + + public function testFindMappingFileNotFound() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->setExpectedException( + "Doctrine\Common\Persistence\Mapping\MappingException", + "No mapping file found named '".__DIR__."/_files/stdClass2.yml' for class 'Foo\stdClass2'." + ); + $locator->findMappingFile("Foo\\stdClass2"); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php new file mode 100644 index 00000000..d0e9976a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php @@ -0,0 +1,3 @@ +getFieldNames(); \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php new file mode 100644 index 00000000..a0f77b50 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php @@ -0,0 +1,247 @@ +cm = new TestObjectMetadata; + $this->om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); + $this->om->expects($this->any())->method('getClassMetadata') + ->will($this->returnValue($this->cm)); + $this->object = new TestObject; + PersistentObject::setObjectManager($this->om); + $this->object->injectObjectManager($this->om, $this->cm); + } + + public function testGetObjectManager() + { + $this->assertSame($this->om, PersistentObject::getObjectManager()); + } + + public function testNonMatchingObjectManager() + { + $this->setExpectedException('RuntimeException'); + $om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); + $this->object->injectObjectManager($om, $this->cm); + } + + public function testGetField() + { + $this->assertEquals('beberlei', $this->object->getName()); + } + + public function testSetField() + { + $this->object->setName("test"); + $this->assertEquals("test", $this->object->getName()); + } + + public function testGetIdentifier() + { + $this->assertEquals(1, $this->object->getId()); + } + + public function testSetIdentifier() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->setId(2); + } + + public function testSetUnknownField() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->setUnknown("test"); + } + + public function testGetUnknownField() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->getUnknown(); + } + + public function testGetToOneAssociation() + { + $this->assertNull($this->object->getParent()); + } + + public function testSetToOneAssociation() + { + $parent = new TestObject(); + $this->object->setParent($parent); + $this->assertSame($parent, $this->object->getParent($parent)); + } + + public function testSetInvalidToOneAssocation() + { + $parent = new \stdClass(); + + $this->setExpectedException('InvalidArgumentException'); + $this->object->setParent($parent); + } + + public function testSetToOneAssociationNull() + { + $parent = new TestObject(); + $this->object->setParent($parent); + $this->object->setParent(null); + $this->assertNull($this->object->getParent()); + } + + public function testAddToManyAssocation() + { + $child = new TestObject(); + $this->object->addChildren($child); + + $this->assertSame($this->object, $child->getParent()); + $this->assertEquals(1, count($this->object->getChildren())); + + $child = new TestObject(); + $this->object->addChildren($child); + + $this->assertEquals(2, count($this->object->getChildren())); + } + + public function testAddInvalidToManyAssocation() + { + $this->setExpectedException('InvalidArgumentException'); + $this->object->addChildren(new \stdClass()); + } + + public function testNoObjectManagerSet() + { + PersistentObject::setObjectManager(null); + $child = new TestObject(); + + $this->setExpectedException('RuntimeException'); + $child->setName("test"); + } + + public function testInvalidMethod() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->asdf(); + } + + public function testAddInvalidCollection() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->addAsdf(new \stdClass()); + } +} + +class TestObject extends PersistentObject +{ + protected $id = 1; + protected $name = 'beberlei'; + protected $parent; + protected $children; +} + +class TestObjectMetadata implements ClassMetadata +{ + + public function getAssociationMappedByTargetField($assocName) + { + $assoc = array('children' => 'parent'); + return $assoc[$assocName]; + } + + public function getAssociationNames() + { + return array('parent', 'children'); + } + + public function getAssociationTargetClass($assocName) + { + return __NAMESPACE__ . '\TestObject'; + } + + public function getFieldNames() + { + return array('id', 'name'); + } + + public function getIdentifier() + { + return array('id'); + } + + public function getName() + { + return __NAMESPACE__ . '\TestObject'; + } + + public function getReflectionClass() + { + return new \ReflectionClass($this->getName()); + } + + public function getTypeOfField($fieldName) + { + $types = array('id' => 'integer', 'name' => 'string'); + return $types[$fieldName]; + } + + public function hasAssociation($fieldName) + { + return in_array($fieldName, array('parent', 'children')); + } + + public function hasField($fieldName) + { + return in_array($fieldName, array('id', 'name')); + } + + public function isAssociationInverseSide($assocName) + { + return ($assocName === 'children'); + } + + public function isCollectionValuedAssociation($fieldName) + { + return ($fieldName === 'children'); + } + + public function isIdentifier($fieldName) + { + return $fieldName === 'id'; + } + + public function isSingleValuedAssociation($fieldName) + { + return $fieldName === 'parent'; + } + + public function getIdentifierValues($entity) + { + + } + + public function getIdentifierFieldNames() + { + + } + + public function initializeReflection(ReflectionService $reflService) + { + + } + + public function wakeupReflection(ReflectionService $reflService) + { + + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php new file mode 100644 index 00000000..a2814500 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php @@ -0,0 +1,100 @@ +assertEquals($expectedClassName, ClassUtils::getRealClass($className)); + } + + /** + * @dataProvider dataGetClass + */ + public function testGetClass( $className, $expectedClassName ) + { + $object = new $className(); + $this->assertEquals($expectedClassName, ClassUtils::getClass($object)); + } + + public function testGetParentClass() + { + $parentClass = ClassUtils::getParentClass( 'MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject' ); + $this->assertEquals('stdClass', $parentClass); + } + + public function testGenerateProxyClassName() + { + $this->assertEquals( 'Proxies\__CG__\stdClass', ClassUtils::generateProxyClassName( 'stdClass', 'Proxies' ) ); + } + + /** + * @dataProvider dataGetClass + */ + public function testNewReflectionClass( $className, $expectedClassName ) + { + $reflClass = ClassUtils::newReflectionClass( $className ); + $this->assertEquals( $expectedClassName, $reflClass->getName() ); + } + + /** + * @dataProvider dataGetClass + */ + public function testNewReflectionObject( $className, $expectedClassName ) + { + $object = new $className; + $reflClass = ClassUtils::newReflectionObject( $object ); + $this->assertEquals( $expectedClassName, $reflClass->getName() ); + } + } + + class ChildObject extends \stdClass + { + } +} + +namespace MyProject\Proxies\__CG__ +{ + class stdClass extends \stdClass + { + } +} + +namespace MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util +{ + class ChildObject extends \Doctrine\Tests\Common\Util\ChildObject + { + } +} + +namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__ +{ + class stdClass extends \MyProject\Proxies\__CG__\stdClass + { + } +} + +namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util +{ + class ChildObject extends \MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject + { + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php new file mode 100644 index 00000000..b4e9eed2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php @@ -0,0 +1,27 @@ +foo = "bar"; + $obj->bar = 1234; + + $var = Debug::export($obj, 2); + $this->assertEquals( "stdClass", $var->__CLASS__ ); + } + + public function testExportDateTime() + { + $obj = new \DateTime( "2010-10-10 10:10:10" ); + + $var = Debug::export( $obj, 2 ); + $this->assertEquals( "DateTime", $var->__CLASS__ ); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php b/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php new file mode 100644 index 00000000..e8323d29 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php @@ -0,0 +1,10 @@ + + */ +class NativePhpunitTask extends Task +{ + private $test; + private $testfile; + private $testdirectory; + private $configuration = null; + private $coverageClover = null; + private $junitlogfile = null; + private $haltonfailure = true; + private $haltonerror = true; + + public function setTestdirectory($directory) { + $this->testdirectory = $directory; + } + + public function setTest($test) { + $this->test = $test; + } + + public function setTestfile($testfile) { + $this->testfile = $testfile; + } + + public function setJunitlogfile($junitlogfile) { + if (strlen($junitlogfile) == 0) { + $junitlogfile = NULL; + } + + $this->junitlogfile = $junitlogfile; + } + + public function setConfiguration($configuration) { + if (strlen($configuration) == 0) { + $configuration = NULL; + } + + $this->configuration = $configuration; + } + + public function setCoverageClover($coverageClover) { + if (strlen($coverageClover) == 0) { + $coverageClover = NULL; + } + + $this->coverageClover = $coverageClover; + } + + public function setHaltonfailure($haltonfailures) { + $this->haltonfailure = $haltonfailures; + } + + public function setHaltonerror($haltonerrors) { + $this->haltonerror = $haltonerrors; + } + + public function init() + { + require_once "PHPUnit/Runner/Version.php"; + $version = PHPUnit_Runner_Version::id(); + + if (version_compare($version, '3.4.0') < 0) { + throw new BuildException("NativePHPUnitTask requires PHPUnit version >= 3.2.0", $this->getLocation()); + } + + require_once 'PHPUnit/Util/Filter.php'; + + // point PHPUnit_MAIN_METHOD define to non-existing method + if (!defined('PHPUnit_MAIN_METHOD')) { + define('PHPUnit_MAIN_METHOD', 'PHPUnitTask::undefined'); + } + } + + public function main() + { + if (!is_dir(realpath($this->testdirectory))) { + throw new BuildException("NativePHPUnitTask requires a Test Directory path given, '".$this->testdirectory."' given."); + } + set_include_path(realpath($this->testdirectory) . PATH_SEPARATOR . get_include_path()); + + $printer = new NativePhpunitPrinter(); + + $arguments = array( + 'configuration' => $this->configuration, + 'coverageClover' => $this->coverageClover, + 'junitLogfile' => $this->junitlogfile, + 'printer' => $printer, + ); + + $runner = new PHPUnit_TextUI_TestRunner(); + $suite = $runner->getTest($this->test, $this->testfile, true); + + try { + $result = $runner->doRun($suite, $arguments); + /* @var $result PHPUnit_Framework_TestResult */ + + if ( ($this->haltonfailure && $result->failureCount() > 0) || ($this->haltonerror && $result->errorCount() > 0) ) { + throw new BuildException("PHPUnit: ".$result->failureCount()." Failures and ".$result->errorCount()." Errors, ". + "last failure message: ".$printer->getMessages()); + } + + $this->log("PHPUnit Success: ".count($result->passed())." tests passed, no ". + "failures (".$result->skippedCount()." skipped, ".$result->notImplementedCount()." not implemented)"); + + // Hudson for example doesn't like the backslash in class names + if (file_exists($this->coverageClover)) { + $this->log("Generated Clover Coverage XML to: ".$this->coverageClover); + $content = file_get_contents($this->coverageClover); + $content = str_replace("\\", ".", $content); + file_put_contents($this->coverageClover, $content); + unset($content); + } + + } catch(\Exception $e) { + throw new BuildException("NativePhpunitTask failed: ".$e->getMessage()); + } + } +} + +class NativePhpunitPrinter extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener +{ + private $_messages = array(); + + public function write($buffer) + { + // do nothing + } + + public function getMessages() + { + return $this->_messages; + } + + /** + * An error occurred. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + */ + public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) + { + $this->_messages[] = "Test ERROR: ".$test->getName().": ".$e->getMessage(); + } + + /** + * A failure occurred. + * + * @param PHPUnit_Framework_Test $test + * @param PHPUnit_Framework_AssertionFailedError $e + * @param float $time + */ + public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) + { + $this->_messages[] = "Test FAILED: ".$test->getName().": ".$e->getMessage(); + } + + /** + * Incomplete test. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + */ + public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) + { + + } + + /** + * Skipped test. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + * @since Method available since Release 3.0.0 + */ + public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) + { + + } + + /** + * A test suite started. + * + * @param PHPUnit_Framework_TestSuite $suite + * @since Method available since Release 2.2.0 + */ + public function startTestSuite(PHPUnit_Framework_TestSuite $suite) + { + + } + + /** + * A test suite ended. + * + * @param PHPUnit_Framework_TestSuite $suite + * @since Method available since Release 2.2.0 + */ + public function endTestSuite(PHPUnit_Framework_TestSuite $suite) + { + + } + + /** + * A test started. + * + * @param PHPUnit_Framework_Test $test + */ + public function startTest(PHPUnit_Framework_Test $test) + { + + } + + /** + * A test ended. + * + * @param PHPUnit_Framework_Test $test + * @param float $time + */ + public function endTest(PHPUnit_Framework_Test $test, $time) + { + + } +} diff --git a/vendor/doctrine/common/tests/README.markdown b/vendor/doctrine/common/tests/README.markdown new file mode 100644 index 00000000..e6f1703d --- /dev/null +++ b/vendor/doctrine/common/tests/README.markdown @@ -0,0 +1,27 @@ +# Running the Doctrine 2 Testsuite + +## Running tests + +Execute PHPUnit in the root folder of your doctrine-common clone. + + phpunit + +## Testing Lock-Support + +The Lock support in Doctrine 2 is tested using Gearman, which allows to run concurrent tasks in parallel. +Install Gearman with PHP as follows: + +1. Go to http://www.gearman.org and download the latest Gearman Server +2. Compile it and then call ldconfig +3. Start it up "gearmand -vvvv" +4. Install pecl/gearman by calling "gearman-beta" + +You can then go into tests/ and start up two workers: + + php Doctrine/Tests/ORM/Functional/Locking/LockAgentWorker.php + +Then run the locking test-suite: + + phpunit --configuration Doctrine/Tests/ORM/Functional/Locking/GearmanLockTest.php + +This can run considerable time, because it is using sleep() to test for the timing ranges of locks. \ No newline at end of file From d18e116d9714c9b9afd0dc0a81ae91f3205d8499 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 1 Feb 2013 10:01:23 +0000 Subject: [PATCH 043/180] Added Album module --- module/Album/Module.php | 24 ++++++++++++++++++++++++ module/Album/autoload_classmap.php | 2 ++ 2 files changed, 26 insertions(+) create mode 100644 module/Album/Module.php create mode 100644 module/Album/autoload_classmap.php diff --git a/module/Album/Module.php b/module/Album/Module.php new file mode 100644 index 00000000..a1740307 --- /dev/null +++ b/module/Album/Module.php @@ -0,0 +1,24 @@ + array( + __DIR__ . '/autoload_classmap.php', + ), + 'Zend\Loader\StandardAutoloader' => array( + 'namespaces' => array( + __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, + ), + ), + ); + } + + public function getConfig() + { + return include __DIR__ . '/config/module.config.php'; + } +} \ No newline at end of file diff --git a/module/Album/autoload_classmap.php b/module/Album/autoload_classmap.php new file mode 100644 index 00000000..dad330e6 --- /dev/null +++ b/module/Album/autoload_classmap.php @@ -0,0 +1,2 @@ + Date: Fri, 1 Feb 2013 10:01:23 +0000 Subject: [PATCH 044/180] Added Album module --- module/Album/Module.php | 24 ++++++++++++++++++++++++ module/Album/autoload_classmap.php | 2 ++ 2 files changed, 26 insertions(+) create mode 100644 module/Album/Module.php create mode 100644 module/Album/autoload_classmap.php diff --git a/module/Album/Module.php b/module/Album/Module.php new file mode 100644 index 00000000..a1740307 --- /dev/null +++ b/module/Album/Module.php @@ -0,0 +1,24 @@ + array( + __DIR__ . '/autoload_classmap.php', + ), + 'Zend\Loader\StandardAutoloader' => array( + 'namespaces' => array( + __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, + ), + ), + ); + } + + public function getConfig() + { + return include __DIR__ . '/config/module.config.php'; + } +} \ No newline at end of file diff --git a/module/Album/autoload_classmap.php b/module/Album/autoload_classmap.php new file mode 100644 index 00000000..dad330e6 --- /dev/null +++ b/module/Album/autoload_classmap.php @@ -0,0 +1,2 @@ + Date: Fri, 1 Feb 2013 10:05:27 +0000 Subject: [PATCH 045/180] Adde the module to the config --- config/application.config.php | 1 + module/Album/config/module.config.php | 13 +++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 module/Album/config/module.config.php diff --git a/config/application.config.php b/config/application.config.php index 6504dea7..aaa7a91f 100644 --- a/config/application.config.php +++ b/config/application.config.php @@ -2,6 +2,7 @@ return array( 'modules' => array( 'Application', + 'Album', // <-- Add this line ), 'module_listener_options' => array( 'config_glob_paths' => array( diff --git a/module/Album/config/module.config.php b/module/Album/config/module.config.php new file mode 100644 index 00000000..cb5df0f8 --- /dev/null +++ b/module/Album/config/module.config.php @@ -0,0 +1,13 @@ + array( + 'invokables' => array( + 'Album\Controller\Album' => 'Album\Controller\AlbumController', + ), + ), + 'view_manager' => array( + 'template_path_stack' => array( + 'album' => __DIR__ . '/../view', + ), + ), +); \ No newline at end of file From c4bddfe517f410eacadd0d51fa7856825a957666 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" <> Date: Fri, 1 Feb 2013 10:05:27 +0000 Subject: [PATCH 046/180] Adde the module to the config --- config/application.config.php | 1 + module/Album/config/module.config.php | 13 +++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 module/Album/config/module.config.php diff --git a/config/application.config.php b/config/application.config.php index 6504dea7..aaa7a91f 100644 --- a/config/application.config.php +++ b/config/application.config.php @@ -2,6 +2,7 @@ return array( 'modules' => array( 'Application', + 'Album', // <-- Add this line ), 'module_listener_options' => array( 'config_glob_paths' => array( diff --git a/module/Album/config/module.config.php b/module/Album/config/module.config.php new file mode 100644 index 00000000..cb5df0f8 --- /dev/null +++ b/module/Album/config/module.config.php @@ -0,0 +1,13 @@ + array( + 'invokables' => array( + 'Album\Controller\Album' => 'Album\Controller\AlbumController', + ), + ), + 'view_manager' => array( + 'template_path_stack' => array( + 'album' => __DIR__ . '/../view', + ), + ), +); \ No newline at end of file From 239720996a96da3e41fa93e7e42a18470dbc1f60 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 1 Feb 2013 10:13:19 +0000 Subject: [PATCH 047/180] Added the controller --- module/Album/config/module.config.php | 21 ++++++++++++++++ .../src/Album/Controller/AlbumController.php | 24 +++++++++++++++++++ module/Album/view/album/album/add.phtml | 1 + module/Album/view/album/album/delete.phtml | 1 + module/Album/view/album/album/edit.phtml | 1 + module/Album/view/album/album/index.phtml | 1 + 6 files changed, 49 insertions(+) create mode 100644 module/Album/src/Album/Controller/AlbumController.php create mode 100644 module/Album/view/album/album/add.phtml create mode 100644 module/Album/view/album/album/delete.phtml create mode 100644 module/Album/view/album/album/edit.phtml create mode 100644 module/Album/view/album/album/index.phtml diff --git a/module/Album/config/module.config.php b/module/Album/config/module.config.php index cb5df0f8..c02888fe 100644 --- a/module/Album/config/module.config.php +++ b/module/Album/config/module.config.php @@ -5,6 +5,27 @@ 'Album\Controller\Album' => 'Album\Controller\AlbumController', ), ), + + // The following section is new and should be added to your file + 'router' => array( + 'routes' => array( + 'album' => array( + 'type' => 'segment', + 'options' => array( + 'route' => '/album[/:action][/:id]', + 'constraints' => array( + 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', + 'id' => '[0-9]+', + ), + 'defaults' => array( + 'controller' => 'Album\Controller\Album', + 'action' => 'index', + ), + ), + ), + ), + ), + 'view_manager' => array( 'template_path_stack' => array( 'album' => __DIR__ . '/../view', diff --git a/module/Album/src/Album/Controller/AlbumController.php b/module/Album/src/Album/Controller/AlbumController.php new file mode 100644 index 00000000..c9c4c69d --- /dev/null +++ b/module/Album/src/Album/Controller/AlbumController.php @@ -0,0 +1,24 @@ +The view script add.phtml \ No newline at end of file diff --git a/module/Album/view/album/album/delete.phtml b/module/Album/view/album/album/delete.phtml new file mode 100644 index 00000000..92991679 --- /dev/null +++ b/module/Album/view/album/album/delete.phtml @@ -0,0 +1 @@ +

The view script delete.phtml

\ No newline at end of file diff --git a/module/Album/view/album/album/edit.phtml b/module/Album/view/album/album/edit.phtml new file mode 100644 index 00000000..87526417 --- /dev/null +++ b/module/Album/view/album/album/edit.phtml @@ -0,0 +1 @@ +

The view script edit.phtml

\ No newline at end of file diff --git a/module/Album/view/album/album/index.phtml b/module/Album/view/album/album/index.phtml new file mode 100644 index 00000000..ef47cb50 --- /dev/null +++ b/module/Album/view/album/album/index.phtml @@ -0,0 +1 @@ +

The view script index.phtml

\ No newline at end of file From da3c6d379874bae4ce2084f5132999b0ae569a79 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" <> Date: Fri, 1 Feb 2013 10:13:19 +0000 Subject: [PATCH 048/180] Added the controller --- module/Album/config/module.config.php | 21 ++++++++++++++++ .../src/Album/Controller/AlbumController.php | 24 +++++++++++++++++++ module/Album/view/album/album/add.phtml | 1 + module/Album/view/album/album/delete.phtml | 1 + module/Album/view/album/album/edit.phtml | 1 + module/Album/view/album/album/index.phtml | 1 + 6 files changed, 49 insertions(+) create mode 100644 module/Album/src/Album/Controller/AlbumController.php create mode 100644 module/Album/view/album/album/add.phtml create mode 100644 module/Album/view/album/album/delete.phtml create mode 100644 module/Album/view/album/album/edit.phtml create mode 100644 module/Album/view/album/album/index.phtml diff --git a/module/Album/config/module.config.php b/module/Album/config/module.config.php index cb5df0f8..c02888fe 100644 --- a/module/Album/config/module.config.php +++ b/module/Album/config/module.config.php @@ -5,6 +5,27 @@ 'Album\Controller\Album' => 'Album\Controller\AlbumController', ), ), + + // The following section is new and should be added to your file + 'router' => array( + 'routes' => array( + 'album' => array( + 'type' => 'segment', + 'options' => array( + 'route' => '/album[/:action][/:id]', + 'constraints' => array( + 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', + 'id' => '[0-9]+', + ), + 'defaults' => array( + 'controller' => 'Album\Controller\Album', + 'action' => 'index', + ), + ), + ), + ), + ), + 'view_manager' => array( 'template_path_stack' => array( 'album' => __DIR__ . '/../view', diff --git a/module/Album/src/Album/Controller/AlbumController.php b/module/Album/src/Album/Controller/AlbumController.php new file mode 100644 index 00000000..c9c4c69d --- /dev/null +++ b/module/Album/src/Album/Controller/AlbumController.php @@ -0,0 +1,24 @@ +The view script add.phtml \ No newline at end of file diff --git a/module/Album/view/album/album/delete.phtml b/module/Album/view/album/album/delete.phtml new file mode 100644 index 00000000..92991679 --- /dev/null +++ b/module/Album/view/album/album/delete.phtml @@ -0,0 +1 @@ +

The view script delete.phtml

\ No newline at end of file diff --git a/module/Album/view/album/album/edit.phtml b/module/Album/view/album/album/edit.phtml new file mode 100644 index 00000000..87526417 --- /dev/null +++ b/module/Album/view/album/album/edit.phtml @@ -0,0 +1 @@ +

The view script edit.phtml

\ No newline at end of file diff --git a/module/Album/view/album/album/index.phtml b/module/Album/view/album/album/index.phtml new file mode 100644 index 00000000..ef47cb50 --- /dev/null +++ b/module/Album/view/album/album/index.phtml @@ -0,0 +1 @@ +

The view script index.phtml

\ No newline at end of file From f3de0dab5c2257221e4817958047919a1ca7847a Mon Sep 17 00:00:00 2001 From: cl-server Date: Fri, 8 Feb 2013 07:01:26 +0000 Subject: [PATCH 049/180] init --- .htaccess | 4 ++++ README | 1 + index.php | 8 ++++++++ 3 files changed, 13 insertions(+) create mode 100644 .htaccess create mode 100644 README create mode 100644 index.php diff --git a/.htaccess b/.htaccess new file mode 100644 index 00000000..912ca125 --- /dev/null +++ b/.htaccess @@ -0,0 +1,4 @@ + + Order allow,deny + Deny from all + diff --git a/README b/README new file mode 100644 index 00000000..de855a2f --- /dev/null +++ b/README @@ -0,0 +1 @@ +This is a sample PHP project diff --git a/index.php b/index.php new file mode 100644 index 00000000..d5a9ce2b --- /dev/null +++ b/index.php @@ -0,0 +1,8 @@ + + + Hello World + + + Hello World

'; ?> + + From e4b8bc84eebe109eefbbef1f557fa89f8026420c Mon Sep 17 00:00:00 2001 From: "mihaelakerkenekova@gmail.com" <> Date: Fri, 8 Feb 2013 07:05:25 +0000 Subject: [PATCH 050/180] dobaven fail --- MihaelaKerkenekova.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 MihaelaKerkenekova.php diff --git a/MihaelaKerkenekova.php b/MihaelaKerkenekova.php new file mode 100644 index 00000000..41ae7b43 --- /dev/null +++ b/MihaelaKerkenekova.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Mihaela Kerkenekova

'; ?> + + \ No newline at end of file From fbbea680f5df022b9b9fcae694781b6124583a17 Mon Sep 17 00:00:00 2001 From: "stoyan.atanasoff@gmail.com" <> Date: Fri, 8 Feb 2013 07:38:19 +0000 Subject: [PATCH 051/180] 214 --- StoyanAtanasoff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php index eaea34b0..3fc95087 100644 --- a/StoyanAtanasoff.php +++ b/StoyanAtanasoff.php @@ -1,3 +1,3 @@ \ No newline at end of file From d0de600b8aeafbe3b990f019a4bccf0e0709afae Mon Sep 17 00:00:00 2001 From: "stoyan.atanasoff@gmail.com" <> Date: Fri, 8 Feb 2013 07:38:55 +0000 Subject: [PATCH 052/180] xdfsd --- StoyanAtanasoff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php index 3fc95087..082f4257 100644 --- a/StoyanAtanasoff.php +++ b/StoyanAtanasoff.php @@ -1,3 +1,3 @@ \ No newline at end of file From bb7f96ccde41b4babf330d8406e9fdefe6dbfebc Mon Sep 17 00:00:00 2001 From: cl-server Date: Fri, 8 Feb 2013 07:44:18 +0000 Subject: [PATCH 053/180] init --- .htaccess | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .htaccess diff --git a/.htaccess b/.htaccess new file mode 100644 index 00000000..912ca125 --- /dev/null +++ b/.htaccess @@ -0,0 +1,4 @@ + + Order allow,deny + Deny from all + From 102b70bccb2260158a578714aafe761924ea6403 Mon Sep 17 00:00:00 2001 From: "stoyan.atanasoff@gmail.com" <> Date: Fri, 8 Feb 2013 07:46:37 +0000 Subject: [PATCH 054/180] axdasdas --- StoyanAtanasoff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php index 082f4257..d127ef19 100644 --- a/StoyanAtanasoff.php +++ b/StoyanAtanasoff.php @@ -1,3 +1,3 @@ \ No newline at end of file From 3536d2edd56a41dab40e77aa28ecbec3c278d665 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 8 Feb 2013 07:52:45 +0000 Subject: [PATCH 055/180] Added Model --- .travis.yml | 5 ++ config/autoload/global.php | 20 +++++++- module/Album/Module.php | 26 ++++++++++ module/Album/src/Album/Model/Album.php | 16 ++++++ module/Album/src/Album/Model/AlbumTable.php | 55 +++++++++++++++++++++ 5 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 .travis.yml create mode 100644 module/Album/src/Album/Model/Album.php create mode 100644 module/Album/src/Album/Model/AlbumTable.php diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..42d77d16 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,5 @@ +language: php +php: + - "5.5" + - "5.4" + - "5.3" \ No newline at end of file diff --git a/config/autoload/global.php b/config/autoload/global.php index 1473720f..bd28f061 100644 --- a/config/autoload/global.php +++ b/config/autoload/global.php @@ -10,7 +10,25 @@ * control, so do not include passwords or other sensitive information in this * file. */ - +/* return array( // ... ); +*/ + + array( + 'driver' => 'Pdo', +// 'dsn' => 'mysql:dbname=wingman;host=wingman-db.my.phpcloud.com', + 'driver_options' => array( + PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' + ), + ), + 'service_manager' => array( + 'factories' => array( + 'Zend\Db\Adapter\Adapter' + => 'Zend\Db\Adapter\AdapterServiceFactory', + ), + ), +); \ No newline at end of file diff --git a/module/Album/Module.php b/module/Album/Module.php index a1740307..31072251 100644 --- a/module/Album/Module.php +++ b/module/Album/Module.php @@ -1,6 +1,12 @@ array( + 'Album\Model\AlbumTable' => function($sm) { + $tableGateway = $sm->get('AlbumTableGateway'); + $table = new AlbumTable($tableGateway); + return $table; + }, + 'AlbumTableGateway' => function ($sm) { + $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); + $resultSetPrototype = new ResultSet(); + $resultSetPrototype->setArrayObjectPrototype(new Album()); + return new TableGateway('album', $dbAdapter, null, $resultSetPrototype); + }, + ), + ); + } } \ No newline at end of file diff --git a/module/Album/src/Album/Model/Album.php b/module/Album/src/Album/Model/Album.php new file mode 100644 index 00000000..dcf72cf9 --- /dev/null +++ b/module/Album/src/Album/Model/Album.php @@ -0,0 +1,16 @@ +id = (isset($data['id'])) ? $data['id'] : null; + $this->artist = (isset($data['artist'])) ? $data['artist'] : null; + $this->title = (isset($data['title'])) ? $data['title'] : null; + } +} \ No newline at end of file diff --git a/module/Album/src/Album/Model/AlbumTable.php b/module/Album/src/Album/Model/AlbumTable.php new file mode 100644 index 00000000..90f178c0 --- /dev/null +++ b/module/Album/src/Album/Model/AlbumTable.php @@ -0,0 +1,55 @@ +tableGateway = $tableGateway; + } + + public function fetchAll() + { + $resultSet = $this->tableGateway->select(); + return $resultSet; + } + + public function getAlbum($id) + { + $id = (int) $id; + $rowset = $this->tableGateway->select(array('id' => $id)); + $row = $rowset->current(); + if (!$row) { + throw new \Exception("Could not find row $id"); + } + return $row; + } + + public function saveAlbum(Album $album) + { + $data = array( + 'artist' => $album->artist, + 'title' => $album->title, + ); + + $id = (int)$album->id; + if ($id == 0) { + $this->tableGateway->insert($data); + } else { + if ($this->getAlbum($id)) { + $this->tableGateway->update($data, array('id' => $id)); + } else { + throw new \Exception('Form id does not exist'); + } + } + } + + public function deleteAlbum($id) + { + $this->tableGateway->delete(array('id' => $id)); + } +} \ No newline at end of file From 71d871caa5109dc5075a9ac5468b988388ec0763 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" <> Date: Fri, 8 Feb 2013 07:52:45 +0000 Subject: [PATCH 056/180] Added Model --- .travis.yml | 5 ++ config/autoload/global.php | 20 +++++++- module/Album/Module.php | 26 ++++++++++ module/Album/src/Album/Model/Album.php | 16 ++++++ module/Album/src/Album/Model/AlbumTable.php | 55 +++++++++++++++++++++ 5 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 .travis.yml create mode 100644 module/Album/src/Album/Model/Album.php create mode 100644 module/Album/src/Album/Model/AlbumTable.php diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..42d77d16 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,5 @@ +language: php +php: + - "5.5" + - "5.4" + - "5.3" \ No newline at end of file diff --git a/config/autoload/global.php b/config/autoload/global.php index 1473720f..bd28f061 100644 --- a/config/autoload/global.php +++ b/config/autoload/global.php @@ -10,7 +10,25 @@ * control, so do not include passwords or other sensitive information in this * file. */ - +/* return array( // ... ); +*/ + + array( + 'driver' => 'Pdo', +// 'dsn' => 'mysql:dbname=wingman;host=wingman-db.my.phpcloud.com', + 'driver_options' => array( + PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' + ), + ), + 'service_manager' => array( + 'factories' => array( + 'Zend\Db\Adapter\Adapter' + => 'Zend\Db\Adapter\AdapterServiceFactory', + ), + ), +); \ No newline at end of file diff --git a/module/Album/Module.php b/module/Album/Module.php index a1740307..31072251 100644 --- a/module/Album/Module.php +++ b/module/Album/Module.php @@ -1,6 +1,12 @@ array( + 'Album\Model\AlbumTable' => function($sm) { + $tableGateway = $sm->get('AlbumTableGateway'); + $table = new AlbumTable($tableGateway); + return $table; + }, + 'AlbumTableGateway' => function ($sm) { + $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); + $resultSetPrototype = new ResultSet(); + $resultSetPrototype->setArrayObjectPrototype(new Album()); + return new TableGateway('album', $dbAdapter, null, $resultSetPrototype); + }, + ), + ); + } } \ No newline at end of file diff --git a/module/Album/src/Album/Model/Album.php b/module/Album/src/Album/Model/Album.php new file mode 100644 index 00000000..dcf72cf9 --- /dev/null +++ b/module/Album/src/Album/Model/Album.php @@ -0,0 +1,16 @@ +id = (isset($data['id'])) ? $data['id'] : null; + $this->artist = (isset($data['artist'])) ? $data['artist'] : null; + $this->title = (isset($data['title'])) ? $data['title'] : null; + } +} \ No newline at end of file diff --git a/module/Album/src/Album/Model/AlbumTable.php b/module/Album/src/Album/Model/AlbumTable.php new file mode 100644 index 00000000..90f178c0 --- /dev/null +++ b/module/Album/src/Album/Model/AlbumTable.php @@ -0,0 +1,55 @@ +tableGateway = $tableGateway; + } + + public function fetchAll() + { + $resultSet = $this->tableGateway->select(); + return $resultSet; + } + + public function getAlbum($id) + { + $id = (int) $id; + $rowset = $this->tableGateway->select(array('id' => $id)); + $row = $rowset->current(); + if (!$row) { + throw new \Exception("Could not find row $id"); + } + return $row; + } + + public function saveAlbum(Album $album) + { + $data = array( + 'artist' => $album->artist, + 'title' => $album->title, + ); + + $id = (int)$album->id; + if ($id == 0) { + $this->tableGateway->insert($data); + } else { + if ($this->getAlbum($id)) { + $this->tableGateway->update($data, array('id' => $id)); + } else { + throw new \Exception('Form id does not exist'); + } + } + } + + public function deleteAlbum($id) + { + $this->tableGateway->delete(array('id' => $id)); + } +} \ No newline at end of file From 5e22e869eec607b4d89fcce1e764f071b6d65723 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 8 Feb 2013 07:59:01 +0000 Subject: [PATCH 057/180] correction --- config/autoload/global.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config/autoload/global.php b/config/autoload/global.php index bd28f061..2324c5c7 100644 --- a/config/autoload/global.php +++ b/config/autoload/global.php @@ -16,11 +16,10 @@ ); */ - array( 'driver' => 'Pdo', -// 'dsn' => 'mysql:dbname=wingman;host=wingman-db.my.phpcloud.com', +// 'dsn' => 'mysql:dbname=zf2tutorial;host=localhost', 'driver_options' => array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' ), From 9190b048b456b10ff198ec8e65d730ae64297c69 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" <> Date: Fri, 8 Feb 2013 07:59:01 +0000 Subject: [PATCH 058/180] correction --- config/autoload/global.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config/autoload/global.php b/config/autoload/global.php index bd28f061..2324c5c7 100644 --- a/config/autoload/global.php +++ b/config/autoload/global.php @@ -16,11 +16,10 @@ ); */ - array( 'driver' => 'Pdo', -// 'dsn' => 'mysql:dbname=wingman;host=wingman-db.my.phpcloud.com', +// 'dsn' => 'mysql:dbname=zf2tutorial;host=localhost', 'driver_options' => array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' ), From 4b873e8a6754d5d59eb24fa449254c94808692e0 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 8 Feb 2013 08:09:28 +0000 Subject: [PATCH 059/180] Added Retrieve --- .../src/Album/Controller/AlbumController.php | 16 +++++++++ module/Album/view/album/album/index.phtml | 33 ++++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/module/Album/src/Album/Controller/AlbumController.php b/module/Album/src/Album/Controller/AlbumController.php index c9c4c69d..1b64312c 100644 --- a/module/Album/src/Album/Controller/AlbumController.php +++ b/module/Album/src/Album/Controller/AlbumController.php @@ -6,8 +6,14 @@ class AlbumController extends AbstractActionController { + + protected $albumTable; + public function indexAction() { + return new ViewModel(array( + 'albums' => $this->getAlbumTable()->fetchAll(), + )); } public function addAction() @@ -21,4 +27,14 @@ public function editAction() public function deleteAction() { } + + // module/Album/src/Album/Controller/AlbumController.php: + public function getAlbumTable() + { + if (!$this->albumTable) { + $sm = $this->getServiceLocator(); + $this->albumTable = $sm->get('Album\Model\AlbumTable'); + } + return $this->albumTable; + } } \ No newline at end of file diff --git a/module/Album/view/album/album/index.phtml b/module/Album/view/album/album/index.phtml index ef47cb50..c6e26835 100644 --- a/module/Album/view/album/album/index.phtml +++ b/module/Album/view/album/album/index.phtml @@ -1 +1,32 @@ -

The view script index.phtml

\ No newline at end of file +

The view script index.phtml

+ +headTitle($title); +?> +

escapeHtml($title); ?>

+

+ Add new album +

+ +
+ + + + + + + + + + + + +
TitleArtist 
escapeHtml($album->title);?>escapeHtml($album->artist);?> + Edit + Delete +
\ No newline at end of file From e88003bf589283a16c260c176f93a1cfb7f7a743 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" <> Date: Fri, 8 Feb 2013 08:09:28 +0000 Subject: [PATCH 060/180] Added Retrieve --- .../src/Album/Controller/AlbumController.php | 16 +++++++++ module/Album/view/album/album/index.phtml | 33 ++++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/module/Album/src/Album/Controller/AlbumController.php b/module/Album/src/Album/Controller/AlbumController.php index c9c4c69d..1b64312c 100644 --- a/module/Album/src/Album/Controller/AlbumController.php +++ b/module/Album/src/Album/Controller/AlbumController.php @@ -6,8 +6,14 @@ class AlbumController extends AbstractActionController { + + protected $albumTable; + public function indexAction() { + return new ViewModel(array( + 'albums' => $this->getAlbumTable()->fetchAll(), + )); } public function addAction() @@ -21,4 +27,14 @@ public function editAction() public function deleteAction() { } + + // module/Album/src/Album/Controller/AlbumController.php: + public function getAlbumTable() + { + if (!$this->albumTable) { + $sm = $this->getServiceLocator(); + $this->albumTable = $sm->get('Album\Model\AlbumTable'); + } + return $this->albumTable; + } } \ No newline at end of file diff --git a/module/Album/view/album/album/index.phtml b/module/Album/view/album/album/index.phtml index ef47cb50..c6e26835 100644 --- a/module/Album/view/album/album/index.phtml +++ b/module/Album/view/album/album/index.phtml @@ -1 +1,32 @@ -

The view script index.phtml

\ No newline at end of file +

The view script index.phtml

+ +headTitle($title); +?> +

escapeHtml($title); ?>

+

+ Add new album +

+ + + + + + + + + + + + + + +
TitleArtist 
escapeHtml($album->title);?>escapeHtml($album->artist);?> + Edit + Delete +
\ No newline at end of file From 4dd3fa881dc056aff8659a052799b06738d3bd54 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 8 Feb 2013 08:14:31 +0000 Subject: [PATCH 061/180] new commit --- .../src/Album/Controller/AlbumController.php | 6 ++-- module/Album/view/album/album/index.phtml | 30 ------------------- 2 files changed, 3 insertions(+), 33 deletions(-) diff --git a/module/Album/src/Album/Controller/AlbumController.php b/module/Album/src/Album/Controller/AlbumController.php index 1b64312c..7df0c04f 100644 --- a/module/Album/src/Album/Controller/AlbumController.php +++ b/module/Album/src/Album/Controller/AlbumController.php @@ -11,9 +11,9 @@ class AlbumController extends AbstractActionController public function indexAction() { - return new ViewModel(array( - 'albums' => $this->getAlbumTable()->fetchAll(), - )); + // return new ViewModel(array( + // 'albums' => $this->getAlbumTable()->fetchAll(), + // )); } public function addAction() diff --git a/module/Album/view/album/album/index.phtml b/module/Album/view/album/album/index.phtml index c6e26835..77dd8037 100644 --- a/module/Album/view/album/album/index.phtml +++ b/module/Album/view/album/album/index.phtml @@ -1,32 +1,2 @@

The view script index.phtml

-headTitle($title); -?> -

escapeHtml($title); ?>

-

- Add new album -

- - - - - - - - - - - - - - -
TitleArtist 
escapeHtml($album->title);?>escapeHtml($album->artist);?> - Edit - Delete -
\ No newline at end of file From b2c3aeec8c457e83f44d578015e827ae30558a9c Mon Sep 17 00:00:00 2001 From: "stoyan.atanasoff@gmail.com" <> Date: Fri, 8 Feb 2013 08:18:58 +0000 Subject: [PATCH 062/180] fasfasfasfasfa --- StoyanAtanasoff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php index d127ef19..cc985e87 100644 --- a/StoyanAtanasoff.php +++ b/StoyanAtanasoff.php @@ -1,3 +1,3 @@ \ No newline at end of file From 316fa17b653c90e05402b4f23709f83731a09114 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 8 Feb 2013 08:21:21 +0000 Subject: [PATCH 063/180] add --- config/autoload/global.php | 2 +- module/Album/src/Album/Controller/AlbumController.php | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config/autoload/global.php b/config/autoload/global.php index 2324c5c7..1f3524c4 100644 --- a/config/autoload/global.php +++ b/config/autoload/global.php @@ -19,7 +19,7 @@ return array( 'db' => array( 'driver' => 'Pdo', -// 'dsn' => 'mysql:dbname=zf2tutorial;host=localhost', +// 'dsn' => 'mysql:dbname=wingman;host=wingman-db.my.phpcloud.com', 'driver_options' => array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' ), diff --git a/module/Album/src/Album/Controller/AlbumController.php b/module/Album/src/Album/Controller/AlbumController.php index 7df0c04f..448639e3 100644 --- a/module/Album/src/Album/Controller/AlbumController.php +++ b/module/Album/src/Album/Controller/AlbumController.php @@ -11,9 +11,9 @@ class AlbumController extends AbstractActionController public function indexAction() { - // return new ViewModel(array( - // 'albums' => $this->getAlbumTable()->fetchAll(), - // )); + return new ViewModel(array( + 'albums' => $this->getAlbumTable()->fetchAll(), + )); } public function addAction() From fba2666a0d5df8faa514cbf56b44c582340132c4 Mon Sep 17 00:00:00 2001 From: "stoyan.atanasoff@gmail.com" <> Date: Fri, 8 Feb 2013 08:21:28 +0000 Subject: [PATCH 064/180] sdadsads --- StoyanAtanasoff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php index cc985e87..50371740 100644 --- a/StoyanAtanasoff.php +++ b/StoyanAtanasoff.php @@ -1,3 +1,3 @@ \ No newline at end of file From 5ef731d95e0ab0ef023aae9ed7c52ccf22a65fce Mon Sep 17 00:00:00 2001 From: "stoyan.atanasoff@gmail.com" <> Date: Fri, 8 Feb 2013 08:22:12 +0000 Subject: [PATCH 065/180] fasfasfa --- StoyanAtanasoff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php index 50371740..c8b8ba0e 100644 --- a/StoyanAtanasoff.php +++ b/StoyanAtanasoff.php @@ -1,3 +1,3 @@ \ No newline at end of file From 5ce11c43c4b04e8e60fede1473ab68a2eb3cba0d Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 8 Feb 2013 08:24:03 +0000 Subject: [PATCH 066/180] index.phtml --- module/Album/view/album/album/index.phtml | 29 +++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/module/Album/view/album/album/index.phtml b/module/Album/view/album/album/index.phtml index 77dd8037..1a7710e8 100644 --- a/module/Album/view/album/album/index.phtml +++ b/module/Album/view/album/album/index.phtml @@ -1,2 +1,31 @@

The view script index.phtml

+headTitle($title); +?> +

escapeHtml($title); ?>

+

+ Add new album +

+ + + + + + + + + + + + + + +
TitleArtist 
escapeHtml($album->title);?>escapeHtml($album->artist);?> + Edit + Delete +
From 28ebdf6fc3044a95692f0240179bdd15de91bcbb Mon Sep 17 00:00:00 2001 From: "stoyan.atanasoff@gmail.com" <> Date: Fri, 8 Feb 2013 08:24:32 +0000 Subject: [PATCH 067/180] dfsafdf --- StoyanAtanasoff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php index c8b8ba0e..0543b47f 100644 --- a/StoyanAtanasoff.php +++ b/StoyanAtanasoff.php @@ -1,3 +1,3 @@ \ No newline at end of file From 0f70b688f22461b543dc61ec83d85701ca1e95e1 Mon Sep 17 00:00:00 2001 From: "stoyan.atanasoff@gmail.com" <> Date: Fri, 8 Feb 2013 08:25:55 +0000 Subject: [PATCH 068/180] sdd --- StoyanAtanasoff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php index 0543b47f..c1b688fe 100644 --- a/StoyanAtanasoff.php +++ b/StoyanAtanasoff.php @@ -1,3 +1,3 @@ \ No newline at end of file From 22b585a54db85a85b4f6a1d45ac487db5d94151e Mon Sep 17 00:00:00 2001 From: "stoyan.atanasoff@gmail.com" <> Date: Fri, 8 Feb 2013 08:29:15 +0000 Subject: [PATCH 069/180] ssssss --- StoyanAtanasoff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php index c1b688fe..b200f08d 100644 --- a/StoyanAtanasoff.php +++ b/StoyanAtanasoff.php @@ -1,3 +1,3 @@ \ No newline at end of file From 839d087cfb04f4204a12537338c122a80f1a6d92 Mon Sep 17 00:00:00 2001 From: "stoyan.atanasoff@gmail.com" <> Date: Fri, 8 Feb 2013 08:30:12 +0000 Subject: [PATCH 070/180] sss --- StoyanAtanasoff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php index b200f08d..d82ba158 100644 --- a/StoyanAtanasoff.php +++ b/StoyanAtanasoff.php @@ -1,3 +1,3 @@ \ No newline at end of file From bcfc198c1c1935dd6b5c64a5e93a588f0c34d459 Mon Sep 17 00:00:00 2001 From: "stoyan.atanasoff@gmail.com" <> Date: Fri, 8 Feb 2013 08:33:46 +0000 Subject: [PATCH 071/180] sssssssss --- StoyanAtanasoff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php index d82ba158..622f90be 100644 --- a/StoyanAtanasoff.php +++ b/StoyanAtanasoff.php @@ -1,3 +1,3 @@ \ No newline at end of file From 3b82d87760d114d5c6c0ecc7303049a934c55623 Mon Sep 17 00:00:00 2001 From: "stoyan.atanasoff@gmail.com" <> Date: Fri, 8 Feb 2013 08:34:35 +0000 Subject: [PATCH 072/180] fdfdf --- StoyanAtanasoff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php index 622f90be..eb562286 100644 --- a/StoyanAtanasoff.php +++ b/StoyanAtanasoff.php @@ -1,3 +1,3 @@ \ No newline at end of file From 7a021980a607d3609f4fb682d9a078ea59d13d93 Mon Sep 17 00:00:00 2001 From: "stoyan.atanasoff@gmail.com" <> Date: Fri, 8 Feb 2013 08:35:53 +0000 Subject: [PATCH 073/180] sssf --- StoyanAtanasoff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php index eb562286..b200f08d 100644 --- a/StoyanAtanasoff.php +++ b/StoyanAtanasoff.php @@ -1,3 +1,3 @@ \ No newline at end of file From 2585767d051ddce74d8dbec3294d117917e1ab2f Mon Sep 17 00:00:00 2001 From: "stoyan.atanasoff@gmail.com" <> Date: Fri, 8 Feb 2013 08:38:45 +0000 Subject: [PATCH 074/180] sfdfg --- StoyanAtanasoff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php index b200f08d..60f5c081 100644 --- a/StoyanAtanasoff.php +++ b/StoyanAtanasoff.php @@ -1,3 +1,3 @@ \ No newline at end of file From d4efbdfcb0ebc6b6301b18a3cbeaa48a05bca113 Mon Sep 17 00:00:00 2001 From: "stoyan.atanasoff@gmail.com" <> Date: Fri, 8 Feb 2013 08:41:54 +0000 Subject: [PATCH 075/180] hghghg --- StoyanAtanasoff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php index 60f5c081..6d918fbf 100644 --- a/StoyanAtanasoff.php +++ b/StoyanAtanasoff.php @@ -1,3 +1,3 @@ \ No newline at end of file From 75556fba67f1dbb6937d8ef74ad964d6a95e4445 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 8 Feb 2013 08:44:11 +0000 Subject: [PATCH 076/180] gitignore --- config/autoload/.gitignore | 4 +- .../src/Album/Controller/AlbumController.php | 21 +++++ module/Album/src/Album/Form/AlbumForm.php | 46 +++++++++++ module/Album/src/Album/Model/Album.php | 76 ++++++++++++++++++- module/Album/view/album/album/add.phtml | 21 ++++- 5 files changed, 162 insertions(+), 6 deletions(-) create mode 100644 module/Album/src/Album/Form/AlbumForm.php diff --git a/config/autoload/.gitignore b/config/autoload/.gitignore index 1a83fda6..5ab30a71 100644 --- a/config/autoload/.gitignore +++ b/config/autoload/.gitignore @@ -1,2 +1,2 @@ -local.php -*.local.php +# local.php +# *.local.php diff --git a/module/Album/src/Album/Controller/AlbumController.php b/module/Album/src/Album/Controller/AlbumController.php index 448639e3..31b67394 100644 --- a/module/Album/src/Album/Controller/AlbumController.php +++ b/module/Album/src/Album/Controller/AlbumController.php @@ -3,6 +3,8 @@ use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; +use Album\Model\Album; // <-- Add this import +use Album\Form\AlbumForm; // <-- Add this import class AlbumController extends AbstractActionController { @@ -16,8 +18,27 @@ public function indexAction() )); } + // Add content to this method: public function addAction() { + $form = new AlbumForm(); + $form->get('submit')->setValue('Add'); + + $request = $this->getRequest(); + if ($request->isPost()) { + $album = new Album(); + $form->setInputFilter($album->getInputFilter()); + $form->setData($request->getPost()); + + if ($form->isValid()) { + $album->exchangeArray($form->getData()); + $this->getAlbumTable()->saveAlbum($album); + + // Redirect to list of albums + return $this->redirect()->toRoute('album'); + } + } + return array('form' => $form); } public function editAction() diff --git a/module/Album/src/Album/Form/AlbumForm.php b/module/Album/src/Album/Form/AlbumForm.php new file mode 100644 index 00000000..511a1804 --- /dev/null +++ b/module/Album/src/Album/Form/AlbumForm.php @@ -0,0 +1,46 @@ +setAttribute('method', 'post'); + $this->add(array( + 'name' => 'id', + 'attributes' => array( + 'type' => 'hidden', + ), + )); + $this->add(array( + 'name' => 'artist', + 'attributes' => array( + 'type' => 'text', + ), + 'options' => array( + 'label' => 'Artist', + ), + )); + $this->add(array( + 'name' => 'title', + 'attributes' => array( + 'type' => 'text', + ), + 'options' => array( + 'label' => 'Title', + ), + )); + $this->add(array( + 'name' => 'submit', + 'attributes' => array( + 'type' => 'submit', + 'value' => 'Go', + 'id' => 'submitbutton', + ), + )); + } +} \ No newline at end of file diff --git a/module/Album/src/Album/Model/Album.php b/module/Album/src/Album/Model/Album.php index dcf72cf9..dba9b501 100644 --- a/module/Album/src/Album/Model/Album.php +++ b/module/Album/src/Album/Model/Album.php @@ -1,16 +1,86 @@ id = (isset($data['id'])) ? $data['id'] : null; + $this->id = (isset($data['id'])) ? $data['id'] : null; $this->artist = (isset($data['artist'])) ? $data['artist'] : null; - $this->title = (isset($data['title'])) ? $data['title'] : null; + $this->title = (isset($data['title'])) ? $data['title'] : null; + } + + // Add content to this method: + public function setInputFilter(InputFilterInterface $inputFilter) + { + throw new \Exception("Not used"); + } + + public function getInputFilter() + { + if (!$this->inputFilter) { + $inputFilter = new InputFilter(); + $factory = new InputFactory(); + + $inputFilter->add($factory->createInput(array( + 'name' => 'id', + 'required' => true, + 'filters' => array( + array('name' => 'Int'), + ), + ))); + + $inputFilter->add($factory->createInput(array( + 'name' => 'artist', + 'required' => true, + 'filters' => array( + array('name' => 'StripTags'), + array('name' => 'StringTrim'), + ), + 'validators' => array( + array( + 'name' => 'StringLength', + 'options' => array( + 'encoding' => 'UTF-8', + 'min' => 1, + 'max' => 100, + ), + ), + ), + ))); + + $inputFilter->add($factory->createInput(array( + 'name' => 'title', + 'required' => true, + 'filters' => array( + array('name' => 'StripTags'), + array('name' => 'StringTrim'), + ), + 'validators' => array( + array( + 'name' => 'StringLength', + 'options' => array( + 'encoding' => 'UTF-8', + 'min' => 1, + 'max' => 100, + ), + ), + ), + ))); + + $this->inputFilter = $inputFilter; + } + + return $this->inputFilter; } } \ No newline at end of file diff --git a/module/Album/view/album/album/add.phtml b/module/Album/view/album/album/add.phtml index ae46fa90..f3b1cb79 100644 --- a/module/Album/view/album/album/add.phtml +++ b/module/Album/view/album/album/add.phtml @@ -1 +1,20 @@ -

The view script add.phtml

\ No newline at end of file +

The view script add.phtml

+ +headTitle($title); +?> +

escapeHtml($title); ?>

+form; +$form->setAttribute('action', $this->url('album', array('action' => 'add'))); +$form->prepare(); + +echo $this->form()->openTag($form); +echo $this->formHidden($form->get('id')); +echo $this->formRow($form->get('title')); +echo $this->formRow($form->get('artist')); +echo $this->formSubmit($form->get('submit')); +echo $this->form()->closeTag(); \ No newline at end of file From e722dd84afe178a458cd55fc53886f2f418fd982 Mon Sep 17 00:00:00 2001 From: "stoyan.atanasoff@gmail.com" <> Date: Fri, 8 Feb 2013 08:49:34 +0000 Subject: [PATCH 077/180] ffhgfh --- StoyanAtanasoff.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php index 6d918fbf..49b60952 100644 --- a/StoyanAtanasoff.php +++ b/StoyanAtanasoff.php @@ -1,3 +1,3 @@ - \ No newline at end of file From fdf2e58b64656e3a3bf753a7d1e150b9ac5853c4 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 8 Feb 2013 08:52:46 +0000 Subject: [PATCH 078/180] test --- .../src/Album/Controller/AlbumController.php | 18 ------------------ module/Album/view/album/album/add.phtml | 18 ------------------ 2 files changed, 36 deletions(-) diff --git a/module/Album/src/Album/Controller/AlbumController.php b/module/Album/src/Album/Controller/AlbumController.php index 31b67394..4abd6231 100644 --- a/module/Album/src/Album/Controller/AlbumController.php +++ b/module/Album/src/Album/Controller/AlbumController.php @@ -21,24 +21,6 @@ public function indexAction() // Add content to this method: public function addAction() { - $form = new AlbumForm(); - $form->get('submit')->setValue('Add'); - - $request = $this->getRequest(); - if ($request->isPost()) { - $album = new Album(); - $form->setInputFilter($album->getInputFilter()); - $form->setData($request->getPost()); - - if ($form->isValid()) { - $album->exchangeArray($form->getData()); - $this->getAlbumTable()->saveAlbum($album); - - // Redirect to list of albums - return $this->redirect()->toRoute('album'); - } - } - return array('form' => $form); } public function editAction() diff --git a/module/Album/view/album/album/add.phtml b/module/Album/view/album/album/add.phtml index f3b1cb79..e410e880 100644 --- a/module/Album/view/album/album/add.phtml +++ b/module/Album/view/album/album/add.phtml @@ -1,20 +1,2 @@

The view script add.phtml

-headTitle($title); -?> -

escapeHtml($title); ?>

-form; -$form->setAttribute('action', $this->url('album', array('action' => 'add'))); -$form->prepare(); - -echo $this->form()->openTag($form); -echo $this->formHidden($form->get('id')); -echo $this->formRow($form->get('title')); -echo $this->formRow($form->get('artist')); -echo $this->formSubmit($form->get('submit')); -echo $this->form()->closeTag(); \ No newline at end of file From 53bec43628653855f56ba515036315293fddf162 Mon Sep 17 00:00:00 2001 From: "stoyan.atanasoff@gmail.com" <> Date: Fri, 8 Feb 2013 08:54:34 +0000 Subject: [PATCH 079/180] jhgjgh --- StoyanAtanasoff.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php index 49b60952..eec471c1 100644 --- a/StoyanAtanasoff.php +++ b/StoyanAtanasoff.php @@ -1,3 +1,3 @@ -xcxdfx \ No newline at end of file From 8b9f46da69c3bda035ba8c5ffbaec733bddb32de Mon Sep 17 00:00:00 2001 From: "stoyan.atanasoff@gmail.com" <> Date: Fri, 8 Feb 2013 08:56:37 +0000 Subject: [PATCH 080/180] jkk --- StoyanAtanasoff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php index eec471c1..9325f8b4 100644 --- a/StoyanAtanasoff.php +++ b/StoyanAtanasoff.php @@ -1,3 +1,3 @@ \ No newline at end of file From 4599dc95ad041cff159101dd3b70aeb94ce12263 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 8 Feb 2013 09:01:38 +0000 Subject: [PATCH 081/180] test --- config/autoload/global.php | 2 +- config/autoload/local.php.stoyan | 8 +++ module/Album/src/Album/Model/Album.php | 76 +------------------------- 3 files changed, 12 insertions(+), 74 deletions(-) create mode 100644 config/autoload/local.php.stoyan diff --git a/config/autoload/global.php b/config/autoload/global.php index 1f3524c4..364f6fcb 100644 --- a/config/autoload/global.php +++ b/config/autoload/global.php @@ -19,7 +19,7 @@ return array( 'db' => array( 'driver' => 'Pdo', -// 'dsn' => 'mysql:dbname=wingman;host=wingman-db.my.phpcloud.com', + 'dsn' => 'mysql:dbname=zf2tutorial;host=localhost', 'driver_options' => array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' ), diff --git a/config/autoload/local.php.stoyan b/config/autoload/local.php.stoyan new file mode 100644 index 00000000..dfdf4f20 --- /dev/null +++ b/config/autoload/local.php.stoyan @@ -0,0 +1,8 @@ + array( + 'dsn' => 'mysql:dbname=wingman;host=wingman-db.my.phpcloud.com', + 'username' => 'wingman', + 'password' => 'area51', + ), +) \ No newline at end of file diff --git a/module/Album/src/Album/Model/Album.php b/module/Album/src/Album/Model/Album.php index dba9b501..dcf72cf9 100644 --- a/module/Album/src/Album/Model/Album.php +++ b/module/Album/src/Album/Model/Album.php @@ -1,86 +1,16 @@ id = (isset($data['id'])) ? $data['id'] : null; + $this->id = (isset($data['id'])) ? $data['id'] : null; $this->artist = (isset($data['artist'])) ? $data['artist'] : null; - $this->title = (isset($data['title'])) ? $data['title'] : null; - } - - // Add content to this method: - public function setInputFilter(InputFilterInterface $inputFilter) - { - throw new \Exception("Not used"); - } - - public function getInputFilter() - { - if (!$this->inputFilter) { - $inputFilter = new InputFilter(); - $factory = new InputFactory(); - - $inputFilter->add($factory->createInput(array( - 'name' => 'id', - 'required' => true, - 'filters' => array( - array('name' => 'Int'), - ), - ))); - - $inputFilter->add($factory->createInput(array( - 'name' => 'artist', - 'required' => true, - 'filters' => array( - array('name' => 'StripTags'), - array('name' => 'StringTrim'), - ), - 'validators' => array( - array( - 'name' => 'StringLength', - 'options' => array( - 'encoding' => 'UTF-8', - 'min' => 1, - 'max' => 100, - ), - ), - ), - ))); - - $inputFilter->add($factory->createInput(array( - 'name' => 'title', - 'required' => true, - 'filters' => array( - array('name' => 'StripTags'), - array('name' => 'StringTrim'), - ), - 'validators' => array( - array( - 'name' => 'StringLength', - 'options' => array( - 'encoding' => 'UTF-8', - 'min' => 1, - 'max' => 100, - ), - ), - ), - ))); - - $this->inputFilter = $inputFilter; - } - - return $this->inputFilter; + $this->title = (isset($data['title'])) ? $data['title'] : null; } } \ No newline at end of file From 503f04ec5bd8591a0eb6ae6b4dacb79bfbee7cda Mon Sep 17 00:00:00 2001 From: "stoyan.atanasoff@gmail.com" <> Date: Fri, 8 Feb 2013 09:02:38 +0000 Subject: [PATCH 082/180] ffffff --- StoyanAtanasoff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StoyanAtanasoff.php b/StoyanAtanasoff.php index 9325f8b4..67612d2a 100644 --- a/StoyanAtanasoff.php +++ b/StoyanAtanasoff.php @@ -1,3 +1,3 @@ \ No newline at end of file From 712be51ca6062e0fddc3c2518a5b8c6149ffbf56 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 8 Feb 2013 09:03:57 +0000 Subject: [PATCH 083/180] test --- config/autoload/global.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/config/autoload/global.php b/config/autoload/global.php index 364f6fcb..0c379f04 100644 --- a/config/autoload/global.php +++ b/config/autoload/global.php @@ -10,12 +10,12 @@ * control, so do not include passwords or other sensitive information in this * file. */ -/* + return array( // ... ); -*/ +/* return array( 'db' => array( 'driver' => 'Pdo', @@ -30,4 +30,5 @@ => 'Zend\Db\Adapter\AdapterServiceFactory', ), ), -); \ No newline at end of file +); +*/ \ No newline at end of file From fe0e7d2bf184cbc9697eeee6b7978803136cb72e Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 8 Feb 2013 09:06:56 +0000 Subject: [PATCH 084/180] test --- config/autoload/global.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/config/autoload/global.php b/config/autoload/global.php index 0c379f04..097b9911 100644 --- a/config/autoload/global.php +++ b/config/autoload/global.php @@ -10,12 +10,12 @@ * control, so do not include passwords or other sensitive information in this * file. */ - +/* return array( // ... ); +*/ -/* return array( 'db' => array( 'driver' => 'Pdo', @@ -31,4 +31,3 @@ ), ), ); -*/ \ No newline at end of file From 4bbbcd552a1f31248ce3c003b5378d5034225314 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 8 Feb 2013 09:08:49 +0000 Subject: [PATCH 085/180] test --- config/autoload/global.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/autoload/global.php b/config/autoload/global.php index 097b9911..19034292 100644 --- a/config/autoload/global.php +++ b/config/autoload/global.php @@ -19,7 +19,7 @@ return array( 'db' => array( 'driver' => 'Pdo', - 'dsn' => 'mysql:dbname=zf2tutorial;host=localhost', +// 'dsn' => 'mysql:dbname=zf2tutorial;host=localhost', 'driver_options' => array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' ), From 1ff1ae386bfe47aae4d328bc6174bb1b3da37b64 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 8 Feb 2013 09:10:25 +0000 Subject: [PATCH 086/180] test --- config/autoload/global.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/autoload/global.php b/config/autoload/global.php index 19034292..95a3e652 100644 --- a/config/autoload/global.php +++ b/config/autoload/global.php @@ -19,7 +19,7 @@ return array( 'db' => array( 'driver' => 'Pdo', -// 'dsn' => 'mysql:dbname=zf2tutorial;host=localhost', + 'dsn' => 'mysql:dbname=wingman;host=wingman-db.my.phpcloud.com', 'driver_options' => array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' ), From dec97d4c8e54b18e68185c0689b4fd3020ffa5e9 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 8 Feb 2013 09:25:48 +0000 Subject: [PATCH 087/180] test --- config/autoload/global.php | 4 +++- module/Album/src/Album/Controller/AlbumController.php | 2 +- module/Album/view/album/album/index.phtml | 3 +-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/config/autoload/global.php b/config/autoload/global.php index 95a3e652..28ed30a7 100644 --- a/config/autoload/global.php +++ b/config/autoload/global.php @@ -10,6 +10,7 @@ * control, so do not include passwords or other sensitive information in this * file. */ + /* return array( // ... @@ -19,7 +20,7 @@ return array( 'db' => array( 'driver' => 'Pdo', - 'dsn' => 'mysql:dbname=wingman;host=wingman-db.my.phpcloud.com', +// 'dsn' => 'mysql:dbname=zf2tutorial;host=localhost', 'driver_options' => array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' ), @@ -31,3 +32,4 @@ ), ), ); + diff --git a/module/Album/src/Album/Controller/AlbumController.php b/module/Album/src/Album/Controller/AlbumController.php index 4abd6231..e9ee0f15 100644 --- a/module/Album/src/Album/Controller/AlbumController.php +++ b/module/Album/src/Album/Controller/AlbumController.php @@ -31,7 +31,7 @@ public function deleteAction() { } - // module/Album/src/Album/Controller/AlbumController.php: +// module/Album/src/Album/Controller/AlbumController.php: public function getAlbumTable() { if (!$this->albumTable) { diff --git a/module/Album/view/album/album/index.phtml b/module/Album/view/album/album/index.phtml index 1a7710e8..e75f0a60 100644 --- a/module/Album/view/album/album/index.phtml +++ b/module/Album/view/album/album/index.phtml @@ -1,4 +1,3 @@ -

The view script index.phtml

headTitle($title); - + \ No newline at end of file From ee8264747c9f1df5c70a5e410382f888c6281b4d Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 8 Feb 2013 09:29:26 +0000 Subject: [PATCH 088/180] test --- .../src/Album/Controller/AlbumController.php | 18 +++++ module/Album/src/Album/Model/Album.php | 76 ++++++++++++++++++- 2 files changed, 91 insertions(+), 3 deletions(-) diff --git a/module/Album/src/Album/Controller/AlbumController.php b/module/Album/src/Album/Controller/AlbumController.php index e9ee0f15..272ca841 100644 --- a/module/Album/src/Album/Controller/AlbumController.php +++ b/module/Album/src/Album/Controller/AlbumController.php @@ -21,6 +21,24 @@ public function indexAction() // Add content to this method: public function addAction() { + $form = new AlbumForm(); + $form->get('submit')->setValue('Add'); + + $request = $this->getRequest(); + if ($request->isPost()) { + $album = new Album(); + $form->setInputFilter($album->getInputFilter()); + $form->setData($request->getPost()); + + if ($form->isValid()) { + $album->exchangeArray($form->getData()); + $this->getAlbumTable()->saveAlbum($album); + + // Redirect to list of albums + return $this->redirect()->toRoute('album'); + } + } + return array('form' => $form); } public function editAction() diff --git a/module/Album/src/Album/Model/Album.php b/module/Album/src/Album/Model/Album.php index dcf72cf9..dba9b501 100644 --- a/module/Album/src/Album/Model/Album.php +++ b/module/Album/src/Album/Model/Album.php @@ -1,16 +1,86 @@ id = (isset($data['id'])) ? $data['id'] : null; + $this->id = (isset($data['id'])) ? $data['id'] : null; $this->artist = (isset($data['artist'])) ? $data['artist'] : null; - $this->title = (isset($data['title'])) ? $data['title'] : null; + $this->title = (isset($data['title'])) ? $data['title'] : null; + } + + // Add content to this method: + public function setInputFilter(InputFilterInterface $inputFilter) + { + throw new \Exception("Not used"); + } + + public function getInputFilter() + { + if (!$this->inputFilter) { + $inputFilter = new InputFilter(); + $factory = new InputFactory(); + + $inputFilter->add($factory->createInput(array( + 'name' => 'id', + 'required' => true, + 'filters' => array( + array('name' => 'Int'), + ), + ))); + + $inputFilter->add($factory->createInput(array( + 'name' => 'artist', + 'required' => true, + 'filters' => array( + array('name' => 'StripTags'), + array('name' => 'StringTrim'), + ), + 'validators' => array( + array( + 'name' => 'StringLength', + 'options' => array( + 'encoding' => 'UTF-8', + 'min' => 1, + 'max' => 100, + ), + ), + ), + ))); + + $inputFilter->add($factory->createInput(array( + 'name' => 'title', + 'required' => true, + 'filters' => array( + array('name' => 'StripTags'), + array('name' => 'StringTrim'), + ), + 'validators' => array( + array( + 'name' => 'StringLength', + 'options' => array( + 'encoding' => 'UTF-8', + 'min' => 1, + 'max' => 100, + ), + ), + ), + ))); + + $this->inputFilter = $inputFilter; + } + + return $this->inputFilter; } } \ No newline at end of file From 5412a828836e122255de919ccfb8d99e293b20c1 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 8 Feb 2013 09:31:29 +0000 Subject: [PATCH 089/180] test --- module/Album/view/album/album/add.phtml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/module/Album/view/album/album/add.phtml b/module/Album/view/album/album/add.phtml index e410e880..ea0859a4 100644 --- a/module/Album/view/album/album/add.phtml +++ b/module/Album/view/album/album/add.phtml @@ -1,2 +1,19 @@

The view script add.phtml

+headTitle($title); +?> +

escapeHtml($title); ?>

+form; +$form->setAttribute('action', $this->url('album', array('action' => 'add'))); +$form->prepare(); + +echo $this->form()->openTag($form); +echo $this->formHidden($form->get('id')); +echo $this->formRow($form->get('title')); +echo $this->formRow($form->get('artist')); +echo $this->formSubmit($form->get('submit')); +echo $this->form()->closeTag(); From 6f98e4d73a4a3896dd7a97b66f11109f4fe381f4 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 8 Feb 2013 09:39:58 +0000 Subject: [PATCH 090/180] test1 --- .../src/Album/Controller/AlbumController.php | 53 +++++++++++++++++++ module/Album/src/Album/Model/Album.php | 6 +++ module/Album/view/album/album/delete.phtml | 28 +++++++++- module/Album/view/album/album/edit.phtml | 28 +++++++++- 4 files changed, 113 insertions(+), 2 deletions(-) diff --git a/module/Album/src/Album/Controller/AlbumController.php b/module/Album/src/Album/Controller/AlbumController.php index 272ca841..fcce00dd 100644 --- a/module/Album/src/Album/Controller/AlbumController.php +++ b/module/Album/src/Album/Controller/AlbumController.php @@ -41,12 +41,65 @@ public function addAction() return array('form' => $form); } + // Add content to this method: public function editAction() { + $id = (int) $this->params()->fromRoute('id', 0); + if (!$id) { + return $this->redirect()->toRoute('album', array( + 'action' => 'add' + )); + } + $album = $this->getAlbumTable()->getAlbum($id); + + $form = new AlbumForm(); + $form->bind($album); + $form->get('submit')->setAttribute('value', 'Edit'); + + $request = $this->getRequest(); + if ($request->isPost()) { + $form->setInputFilter($album->getInputFilter()); + $form->setData($request->getPost()); + + if ($form->isValid()) { + $this->getAlbumTable()->saveAlbum($form->getData()); + + // Redirect to list of albums + return $this->redirect()->toRoute('album'); + } + } + + return array( + 'id' => $id, + 'form' => $form, + ); } + // Add content to the following method: public function deleteAction() { + $id = (int) $this->params()->fromRoute('id', 0); + if (!$id) { + return $this->redirect()->toRoute('album'); + } + + $request = $this->getRequest(); + if ($request->isPost()) { + $del = $request->getPost('del', 'No'); + + if ($del == 'Yes') { + $id = (int) $request->getPost('id'); + $this->getAlbumTable()->deleteAlbum($id); + } + + // Redirect to list of albums + return $this->redirect()->toRoute('album'); + } + + return array( + 'id' => $id, + 'album' => $this->getAlbumTable()->getAlbum($id) + ); } // module/Album/src/Album/Controller/AlbumController.php: diff --git a/module/Album/src/Album/Model/Album.php b/module/Album/src/Album/Model/Album.php index dba9b501..f51eac2c 100644 --- a/module/Album/src/Album/Model/Album.php +++ b/module/Album/src/Album/Model/Album.php @@ -19,6 +19,12 @@ public function exchangeArray($data) $this->artist = (isset($data['artist'])) ? $data['artist'] : null; $this->title = (isset($data['title'])) ? $data['title'] : null; } + + // Add the following method: + public function getArrayCopy() + { + return get_object_vars($this); + } // Add content to this method: public function setInputFilter(InputFilterInterface $inputFilter) diff --git a/module/Album/view/album/album/delete.phtml b/module/Album/view/album/album/delete.phtml index 92991679..3d0bc6cd 100644 --- a/module/Album/view/album/album/delete.phtml +++ b/module/Album/view/album/album/delete.phtml @@ -1 +1,27 @@ -

The view script delete.phtml

\ No newline at end of file +

The view script delete.phtml

+ +headTitle($title); +?> +

escapeHtml($title); ?>

+ +

Are you sure that you want to delete + 'escapeHtml($album->title); ?>' by + 'escapeHtml($album->artist); ?>'? +

+url('album', array( + 'action' => 'delete', + 'id' => $this->id, +)); +?> +
+
+ + + +
+
\ No newline at end of file diff --git a/module/Album/view/album/album/edit.phtml b/module/Album/view/album/album/edit.phtml index 87526417..c5902a93 100644 --- a/module/Album/view/album/album/edit.phtml +++ b/module/Album/view/album/album/edit.phtml @@ -1 +1,27 @@ -

The view script edit.phtml

\ No newline at end of file +

The view script edit.phtml

+ +headTitle($title); +?> +

escapeHtml($title); ?>

+ +form; +$form->setAttribute('action', $this->url( + 'album', + array( + 'action' => 'edit', + 'id' => $this->id, + ) +)); +$form->prepare(); + +echo $this->form()->openTag($form); +echo $this->formHidden($form->get('id')); +echo $this->formRow($form->get('title')); +echo $this->formRow($form->get('artist')); +echo $this->formSubmit($form->get('submit')); +echo $this->form()->closeTag(); \ No newline at end of file From 83d3de20000503435882781a95665900a7df9665 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 8 Feb 2013 17:15:32 +0000 Subject: [PATCH 091/180] dsn in the global --- config/autoload/global.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/autoload/global.php b/config/autoload/global.php index 28ed30a7..6cfb0053 100644 --- a/config/autoload/global.php +++ b/config/autoload/global.php @@ -20,7 +20,7 @@ return array( 'db' => array( 'driver' => 'Pdo', -// 'dsn' => 'mysql:dbname=zf2tutorial;host=localhost', + 'dsn' => 'mysql:dbname=wingman;host=wingman-db.my.phpcloud.com', 'driver_options' => array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' ), From 82778d38013914c442c9d250d255d6037ce6d1d8 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Fri, 8 Feb 2013 17:37:40 +0000 Subject: [PATCH 092/180] global.php comented --- config/autoload/global.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/autoload/global.php b/config/autoload/global.php index 6cfb0053..aab0ae59 100644 --- a/config/autoload/global.php +++ b/config/autoload/global.php @@ -20,7 +20,7 @@ return array( 'db' => array( 'driver' => 'Pdo', - 'dsn' => 'mysql:dbname=wingman;host=wingman-db.my.phpcloud.com', +// 'dsn' => 'mysql:dbname=wingman;host=wingman-db.my.phpcloud.com', 'driver_options' => array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' ), From e79a49944682ed7a4659b45fe5488f0e87ec2943 Mon Sep 17 00:00:00 2001 From: zhgzhg Date: Fri, 8 Feb 2013 21:01:12 +0200 Subject: [PATCH 093/180] reconfiguration --- .gitattributes | 22 + .gitignore | 176 +++ .htaccess | 4 + LICENSE.txt | 27 + README.md | 35 + composer.json | 22 + composer.phar | Bin 0 -> 570295 bytes config/application.config.php | 16 + config/autoload/.gitignore | 3 + config/autoload/README.md | 8 + config/autoload/global.php | 32 + config/autoload/local.php.dist | 16 + data/cache/.gitignore | 2 + index.html | 67 + index.php | 11 + init_autoloader.php | 49 + layout.css | 77 ++ module/Album/Module.php | 49 + module/Album/autoload_classmap.php | 2 + module/Album/config/module.config.php | 34 + .../src/Album/Controller/AlbumController.php | 114 ++ module/Album/src/Album/Form/AlbumForm.php | 46 + module/Album/src/Album/Model/Album.php | 95 ++ module/Album/src/Album/Model/AlbumTable.php | 55 + module/Album/view/album/album/add.phtml | 17 + module/Album/view/album/album/delete.phtml | 24 + module/Album/view/album/album/edit.phtml | 24 + module/Album/view/album/album/index.phtml | 29 + module/Application/Module.php | 39 + module/Application/config/module.config.php | 93 ++ module/Application/language/ar_SY.po | 184 +++ module/Application/language/cs_CZ.po | 153 +++ module/Application/language/de_DE.po | 153 +++ module/Application/language/en_US.po | 153 +++ module/Application/language/es_ES.po | 111 ++ module/Application/language/fr_CA.po | 153 +++ module/Application/language/fr_FR.po | 153 +++ module/Application/language/it_IT.po | 154 +++ module/Application/language/ja_JP.po | 140 +++ module/Application/language/nl_NL.po | 153 +++ module/Application/language/pl_PL.po | 153 +++ module/Application/language/tr_TR.po | 153 +++ .../Controller/IndexController.php | 21 + .../view/application/index/index.phtml | 26 + module/Application/view/error/404.phtml | 61 + module/Application/view/error/index.phtml | 62 + module/Application/view/layout/layout.phtml | 57 + navcontainer.css | 121 ++ .../GyunerZeki.php | 9 + .../KrasimirTsvetanov.php | 8 + .../MargaritaKrushkova.php | 8 + .../MihailKopuschu.php | 8 + .../PetyaStavarova.php | 8 + .../StoyanCheresharov.php | 8 + projectContributorsPersonalData/Todor.php | 10 + .../VasilVasilev.php | 8 + .../VictorAtanassov.php | 8 + .../ZhelyanGuglev.php | 8 + .../martin_manov.php | 14 + .../paolashumanova.php | 8 + public/.htaccess | 7 + public/css/bootstrap-responsive.min.css | 3 + public/css/bootstrap.min.css | 610 +++++++++ public/css/style.css | 37 + public/images/favicon.ico | Bin 0 -> 1406 bytes public/images/zf2-logo.png | Bin 0 -> 738 bytes public/index.php | 12 + public/js/html5.js | 4 + public/js/jquery-1.7.2.min.js | 4 + standard_structure.css | 7 + typography.css | 8 + vendor/.gitignore | 5 + vendor/README.md | 1 + vendor/doctrine/common/.gitignore | 4 + vendor/doctrine/common/.gitmodules | 3 + vendor/doctrine/common/.travis.yml | 5 + vendor/doctrine/common/LICENSE | 504 ++++++++ vendor/doctrine/common/README.md | 12 + vendor/doctrine/common/UPGRADE_TO_2_1 | 39 + vendor/doctrine/common/UPGRADE_TO_2_2 | 61 + vendor/doctrine/common/build.properties | 6 + vendor/doctrine/common/build.xml | 59 + vendor/doctrine/common/composer.json | 21 + .../Common/Annotations/Annotation.php | 75 ++ .../Annotations/Annotation/Attribute.php | 47 + .../Annotations/Annotation/Attributes.php | 37 + .../Annotation/IgnoreAnnotation.php | 44 + .../Annotations/Annotation/Required.php | 33 + .../Common/Annotations/Annotation/Target.php | 105 ++ .../Annotations/AnnotationException.php | 111 ++ .../Common/Annotations/AnnotationReader.php | 303 +++++ .../Common/Annotations/AnnotationRegistry.php | 129 ++ .../Common/Annotations/CachedReader.php | 179 +++ .../Doctrine/Common/Annotations/DocLexer.php | 140 +++ .../Doctrine/Common/Annotations/DocParser.php | 891 +++++++++++++ .../Common/Annotations/FileCacheReader.php | 209 +++ .../Common/Annotations/IndexedReader.php | 94 ++ .../Doctrine/Common/Annotations/PhpParser.php | 203 +++ .../Doctrine/Common/Annotations/Reader.php | 35 + .../Annotations/SimpleAnnotationReader.php | 152 +++ .../lib/Doctrine/Common/Cache/ApcCache.php | 97 ++ .../lib/Doctrine/Common/Cache/ArrayCache.php | 96 ++ .../lib/Doctrine/Common/Cache/Cache.php | 102 ++ .../Doctrine/Common/Cache/CacheProvider.php | 188 +++ .../Doctrine/Common/Cache/MemcacheCache.php | 121 ++ .../Doctrine/Common/Cache/MemcachedCache.php | 124 ++ .../Doctrine/Common/Cache/WinCacheCache.php | 92 ++ .../lib/Doctrine/Common/Cache/XcacheCache.php | 110 ++ .../Doctrine/Common/Cache/ZendDataCache.php | 84 ++ .../lib/Doctrine/Common/ClassLoader.php | 262 ++++ .../Common/Collections/ArrayCollection.php | 447 +++++++ .../Common/Collections/Collection.php | 243 ++++ .../lib/Doctrine/Common/CommonException.php | 28 + .../common/lib/Doctrine/Common/Comparable.php | 47 + .../common/lib/Doctrine/Common/EventArgs.php | 69 + .../lib/Doctrine/Common/EventManager.php | 136 ++ .../lib/Doctrine/Common/EventSubscriber.php | 45 + .../common/lib/Doctrine/Common/Lexer.php | 266 ++++ .../Doctrine/Common/NotifyPropertyChanged.php | 45 + .../Persistence/AbstractManagerRegistry.php | 224 ++++ .../Common/Persistence/ConnectionRegistry.php | 63 + .../Persistence/Event/LifecycleEventArgs.php | 77 ++ .../Event/LoadClassMetadataEventArgs.php | 76 ++ .../Persistence/Event/ManagerEventArgs.php | 59 + .../Persistence/Event/OnClearEventArgs.php | 84 ++ .../Persistence/Event/PreUpdateEventArgs.php | 129 ++ .../Common/Persistence/ManagerRegistry.php | 112 ++ .../Mapping/AbstractClassMetadataFactory.php | 359 ++++++ .../Persistence/Mapping/ClassMetadata.php | 165 +++ .../Mapping/ClassMetadataFactory.php | 74 ++ .../Mapping/Driver/AnnotationDriver.php | 214 ++++ .../Mapping/Driver/DefaultFileLocator.php | 169 +++ .../Persistence/Mapping/Driver/FileDriver.php | 178 +++ .../Mapping/Driver/FileLocator.php | 69 + .../Mapping/Driver/MappingDriver.php | 56 + .../Mapping/Driver/MappingDriverChain.php | 125 ++ .../Persistence/Mapping/Driver/PHPDriver.php | 70 ++ .../Mapping/Driver/StaticPHPDriver.php | 131 ++ .../Mapping/Driver/SymfonyFileLocator.php | 198 +++ .../Persistence/Mapping/MappingException.php | 57 + .../Persistence/Mapping/ReflectionService.php | 80 ++ .../Mapping/RuntimeReflectionService.php | 102 ++ .../Mapping/StaticReflectionService.php | 107 ++ .../Common/Persistence/ObjectManager.php | 143 +++ .../Common/Persistence/ObjectManagerAware.php | 49 + .../Common/Persistence/ObjectRepository.php | 78 ++ .../Common/Persistence/PersistentObject.php | 233 ++++ .../lib/Doctrine/Common/Persistence/Proxy.php | 60 + .../Common/PropertyChangedListener.php | 48 + .../lib/Doctrine/Common/Util/ClassUtils.php | 103 ++ .../common/lib/Doctrine/Common/Util/Debug.php | 123 ++ .../lib/Doctrine/Common/Util/Inflector.php | 72 ++ .../common/lib/Doctrine/Common/Version.php | 55 + vendor/doctrine/common/phpunit.xml.dist | 31 + vendor/doctrine/common/tests/.gitignore | 3 + .../Common/Annotations/AbstractReaderTest.php | 538 ++++++++ .../Annotations/AnnotationReaderTest.php | 13 + .../Common/Annotations/CachedReaderTest.php | 56 + .../Tests/Common/Annotations/DocLexerTest.php | 27 + .../Common/Annotations/DocParserTest.php | 1118 +++++++++++++++++ .../Annotations/FileCacheReaderTest.php | 40 + .../Annotation/AnnotWithDefaultValue.php | 10 + .../Fixtures/Annotation/Autoload.php | 10 + .../Annotations/Fixtures/Annotation/Route.php | 11 + .../Fixtures/Annotation/Secure.php | 18 + .../Fixtures/Annotation/Template.php | 14 + .../Fixtures/Annotation/Version.php | 11 + .../Fixtures/AnnotationTargetAll.php | 14 + .../Fixtures/AnnotationTargetAnnotation.php | 14 + .../Fixtures/AnnotationTargetClass.php | 15 + .../Fixtures/AnnotationTargetMethod.php | 15 + .../AnnotationTargetPropertyMethod.php | 14 + .../Fixtures/AnnotationWithAttributes.php | 119 ++ .../AnnotationWithRequiredAttributes.php | 50 + ...ithRequiredAttributesWithoutContructor.php | 24 + .../AnnotationWithTargetSyntaxError.php | 11 + .../Fixtures/AnnotationWithVarType.php | 62 + .../Annotations/Fixtures/ClassDDC1660.php | 30 + ...assWithAnnotationWithTargetSyntaxError.php | 21 + .../ClassWithAnnotationWithVarType.php | 31 + .../ClassWithFullyQualifiedUseStatements.php | 11 + ...lassWithInvalidAnnotationTargetAtClass.php | 17 + ...assWithInvalidAnnotationTargetAtMethod.php | 20 + ...sWithInvalidAnnotationTargetAtProperty.php | 24 + .../ClassWithValidAnnotationTarget.php | 41 + .../Annotations/Fixtures/Controller.php | 300 +++++ ...erentNamespacesPerFileWithClassAsFirst.php | 15 + ...ferentNamespacesPerFileWithClassAsLast.php | 15 + ...EqualNamespacesPerFileWithClassAsFirst.php | 13 + .../EqualNamespacesPerFileWithClassAsLast.php | 12 + ...lobalNamespacesPerFileWithClassAsFirst.php | 12 + ...GlobalNamespacesPerFileWithClassAsLast.php | 12 + .../InvalidAnnotationUsageButIgnoredClass.php | 14 + .../Fixtures/InvalidAnnotationUsageClass.php | 10 + .../Fixtures/MultipleClassesInFile.php | 9 + .../MultipleImportsInUseStatement.php | 10 + .../NamespaceAndClassCommentedOut.php | 20 + .../NamespaceWithClosureDeclaration.php | 15 + .../Fixtures/NamespacedSingleClassLOC1000.php | 1009 +++++++++++++++ .../Annotations/Fixtures/NoAnnotation.php | 5 + .../Fixtures/NonNamespacedClass.php | 10 + .../Fixtures/SingleClassLOC1000.php | 1006 +++++++++++++++ .../Annotations/Fixtures/TestInterface.php | 13 + .../Common/Annotations/PerformanceTest.php | 194 +++ .../Common/Annotations/PhpParserTest.php | 179 +++ .../SimpleAnnotationReaderTest.php | 97 ++ .../Common/Annotations/Ticket/DCOM55Test.php | 65 + .../Annotations/Ticket/DCOM58Entity.php | 8 + .../Common/Annotations/Ticket/DCOM58Test.php | 112 ++ .../Common/Annotations/TopLevelAnnotation.php | 8 + .../Tests/Common/Cache/ApcCacheTest.php | 20 + .../Tests/Common/Cache/ArrayCacheTest.php | 13 + .../Doctrine/Tests/Common/Cache/CacheTest.php | 87 ++ .../Tests/Common/Cache/MemcacheCacheTest.php | 38 + .../Tests/Common/Cache/MemcachedCacheTest.php | 40 + .../Tests/Common/Cache/WinCacheCacheTest.php | 20 + .../Tests/Common/Cache/XcacheCacheTest.php | 20 + .../Tests/Common/Cache/ZendDataCacheTest.php | 20 + .../Doctrine/Tests/Common/ClassLoaderTest.php | 45 + .../Common/ClassLoaderTest/ClassA.class.php | 6 + .../Common/ClassLoaderTest/ClassB.class.php | 6 + .../Common/ClassLoaderTest/ClassC.class.php | 6 + .../Tests/Common/ClassLoaderTest/ClassD.php | 5 + .../Common/Collections/CollectionTest.php | 195 +++ .../Tests/Common/DoctrineExceptionTest.php | 0 .../Tests/Common/EventManagerTest.php | 88 ++ .../Persistence/Mapping/ChainDriverTest.php | 94 ++ .../Mapping/ClassMetadataFactoryTest.php | 134 ++ .../Mapping/DefaultFileLocatorTest.php | 90 ++ .../Persistence/Mapping/FileDriverTest.php | 142 +++ .../Persistence/Mapping/PHPDriverTest.php | 18 + .../Mapping/RuntimeReflectionServiceTest.php | 70 ++ .../Mapping/StaticPHPDriverTest.php | 35 + .../Mapping/StaticReflectionServiceTest.php | 70 ++ .../Mapping/SymfonyFileLocatorTest.php | 88 ++ .../Persistence/Mapping/_files/TestEntity.php | 3 + .../Persistence/Mapping/_files/global.yml | 1 + .../Persistence/Mapping/_files/stdClass.yml | 1 + .../Persistence/PersistentObjectTest.php | 247 ++++ .../Tests/Common/Util/ClassUtilsTest.php | 100 ++ .../Doctrine/Tests/Common/Util/DebugTest.php | 27 + .../tests/Doctrine/Tests/DoctrineTestCase.php | 10 + .../common/tests/Doctrine/Tests/TestInit.php | 31 + .../common/tests/NativePhpunitTask.php | 246 ++++ vendor/doctrine/common/tests/README.markdown | 27 + 245 files changed, 21836 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .htaccess create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 composer.json create mode 100644 composer.phar create mode 100644 config/application.config.php create mode 100644 config/autoload/.gitignore create mode 100644 config/autoload/README.md create mode 100644 config/autoload/global.php create mode 100644 config/autoload/local.php.dist create mode 100644 data/cache/.gitignore create mode 100644 index.html create mode 100644 index.php create mode 100644 init_autoloader.php create mode 100644 layout.css create mode 100644 module/Album/Module.php create mode 100644 module/Album/autoload_classmap.php create mode 100644 module/Album/config/module.config.php create mode 100644 module/Album/src/Album/Controller/AlbumController.php create mode 100644 module/Album/src/Album/Form/AlbumForm.php create mode 100644 module/Album/src/Album/Model/Album.php create mode 100644 module/Album/src/Album/Model/AlbumTable.php create mode 100644 module/Album/view/album/album/add.phtml create mode 100644 module/Album/view/album/album/delete.phtml create mode 100644 module/Album/view/album/album/edit.phtml create mode 100644 module/Album/view/album/album/index.phtml create mode 100644 module/Application/Module.php create mode 100644 module/Application/config/module.config.php create mode 100644 module/Application/language/ar_SY.po create mode 100644 module/Application/language/cs_CZ.po create mode 100644 module/Application/language/de_DE.po create mode 100644 module/Application/language/en_US.po create mode 100644 module/Application/language/es_ES.po create mode 100644 module/Application/language/fr_CA.po create mode 100644 module/Application/language/fr_FR.po create mode 100644 module/Application/language/it_IT.po create mode 100644 module/Application/language/ja_JP.po create mode 100644 module/Application/language/nl_NL.po create mode 100644 module/Application/language/pl_PL.po create mode 100644 module/Application/language/tr_TR.po create mode 100644 module/Application/src/Application/Controller/IndexController.php create mode 100644 module/Application/view/application/index/index.phtml create mode 100644 module/Application/view/error/404.phtml create mode 100644 module/Application/view/error/index.phtml create mode 100644 module/Application/view/layout/layout.phtml create mode 100644 navcontainer.css create mode 100644 projectContributorsPersonalData/GyunerZeki.php create mode 100644 projectContributorsPersonalData/KrasimirTsvetanov.php create mode 100644 projectContributorsPersonalData/MargaritaKrushkova.php create mode 100644 projectContributorsPersonalData/MihailKopuschu.php create mode 100644 projectContributorsPersonalData/PetyaStavarova.php create mode 100644 projectContributorsPersonalData/StoyanCheresharov.php create mode 100644 projectContributorsPersonalData/Todor.php create mode 100644 projectContributorsPersonalData/VasilVasilev.php create mode 100644 projectContributorsPersonalData/VictorAtanassov.php create mode 100644 projectContributorsPersonalData/ZhelyanGuglev.php create mode 100644 projectContributorsPersonalData/martin_manov.php create mode 100644 projectContributorsPersonalData/paolashumanova.php create mode 100644 public/.htaccess create mode 100644 public/css/bootstrap-responsive.min.css create mode 100644 public/css/bootstrap.min.css create mode 100644 public/css/style.css create mode 100644 public/images/favicon.ico create mode 100644 public/images/zf2-logo.png create mode 100644 public/index.php create mode 100644 public/js/html5.js create mode 100644 public/js/jquery-1.7.2.min.js create mode 100644 standard_structure.css create mode 100644 typography.css create mode 100644 vendor/.gitignore create mode 100644 vendor/README.md create mode 100644 vendor/doctrine/common/.gitignore create mode 100644 vendor/doctrine/common/.gitmodules create mode 100644 vendor/doctrine/common/.travis.yml create mode 100644 vendor/doctrine/common/LICENSE create mode 100644 vendor/doctrine/common/README.md create mode 100644 vendor/doctrine/common/UPGRADE_TO_2_1 create mode 100644 vendor/doctrine/common/UPGRADE_TO_2_2 create mode 100644 vendor/doctrine/common/build.properties create mode 100644 vendor/doctrine/common/build.xml create mode 100644 vendor/doctrine/common/composer.json create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/CommonException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Comparable.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventManager.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Lexer.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Version.php create mode 100644 vendor/doctrine/common/phpunit.xml.dist create mode 100644 vendor/doctrine/common/tests/.gitignore create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/CachedReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Autoload.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Route.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Secure.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetAll.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetPropertyMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithAttributes.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithTargetSyntaxError.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithVarType.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithAnnotationWithTargetSyntaxError.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithAnnotationWithVarType.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithFullyQualifiedUseStatements.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtProperty.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithValidAnnotationTarget.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Controller.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/EqualNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/EqualNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/GlobalNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/GlobalNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/InvalidAnnotationUsageButIgnoredClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/InvalidAnnotationUsageClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/MultipleClassesInFile.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/MultipleImportsInUseStatement.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespaceAndClassCommentedOut.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespaceWithClosureDeclaration.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespacedSingleClassLOC1000.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NonNamespacedClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/SingleClassLOC1000.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PerformanceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Test.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/CacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassB.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassC.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassD.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/CollectionTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/TestInit.php create mode 100644 vendor/doctrine/common/tests/NativePhpunitTask.php create mode 100644 vendor/doctrine/common/tests/README.markdown diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..412eeda7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..e55edd12 --- /dev/null +++ b/.gitignore @@ -0,0 +1,176 @@ +local.php +*.local.php + +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.vspscc +.builds +*.dotCover + +## TODO: If you have NuGet Package Restore enabled, uncomment this +#packages/ + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf + +# Visual Studio profiler +*.psess +*.vsp + +# ReSharper is a .NET coding add-in +_ReSharper* + +# Installshield output folder +[Ee]xpress + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish + +# Others +[Bb]in +[Oo]bj +sql +TestResults +*.Cache +ClientBin +stylecop.* +~$* +*.dbmdl +Generated_Code #added for RIA/Silverlight projects + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML + + + +############ +## Windows +############ + +# Windows image file caches +Thumbs.db + +# Folder config file +Desktop.ini + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist +build +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg + +# Mac crap +.DS_Store + +nbproject +._* +.~lock.* +.buildpath +.DS_Store +.idea +.project +.settings +composer.lock diff --git a/.htaccess b/.htaccess new file mode 100644 index 00000000..912ca125 --- /dev/null +++ b/.htaccess @@ -0,0 +1,4 @@ + + Order allow,deny + Deny from all + diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..36e97601 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,27 @@ +Copyright (c) 2005-2012, Zend Technologies USA, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Zend Technologies USA, Inc. nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..da6898de --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +This is a sample PHP project + +ZendSkeletonApplication +======================= + +Introduction +------------ +This is a simple, skeleton application using the ZF2 MVC layer and module +systems. This application is meant to be used as a starting place for those +looking to get their feet wet with ZF2. + + +Installation +------------ + +Using Composer (recommended) +---------------------------- +The recommended way to get a working copy of this project is to clone the repository +and use composer to install dependencies: + + cd my/project/dir + git clone git://github.com/zendframework/ZendSkeletonApplication.git + cd ZendSkeletonApplication + php composer.phar install + +Using Git submodules +-------------------- +Alternatively, you can install using native git submodules: + + git clone git://github.com/zendframework/ZendSkeletonApplication.git --recursive + +Virtual Host +------------ +Afterwards, set up a virtual host to point to the public/ directory of the +project and you should be ready to go! diff --git a/composer.json b/composer.json new file mode 100644 index 00000000..b70734ed --- /dev/null +++ b/composer.json @@ -0,0 +1,22 @@ +{ + "name": "zendframework/skeleton-application", + "description": "Skeleton Application for ZF2", + "license": "BSD-3-Clause", + "keywords": [ + "framework", + "zf2" + ], + "homepage": "http://framework.zend.com/", + "repositories": [ + { + "type": "composer", + "url": "http://packages.zendframework.com/" + } + ], + "require": { + "php": ">=5.3.3", + "zendframework/zendframework": "2.*", + "zendframework/zendservice-recaptcha": "2.*", + "doctrine/common": ">=2.1" + } +} diff --git a/composer.phar b/composer.phar new file mode 100644 index 0000000000000000000000000000000000000000..48edaa6149f3581df05a06f283f27ad50ff879de GIT binary patch literal 570295 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 literal 0 HcmV?d00001 diff --git a/config/application.config.php b/config/application.config.php new file mode 100644 index 00000000..bf1446de --- /dev/null +++ b/config/application.config.php @@ -0,0 +1,16 @@ + array( + 'Application', + 'Album', + ), + 'module_listener_options' => array( + 'config_glob_paths' => array( + 'config/autoload/{,*.}{global,local}.php', + ), + 'module_paths' => array( + './module', + './vendor', + ), + ), +); diff --git a/config/autoload/.gitignore b/config/autoload/.gitignore new file mode 100644 index 00000000..1113f6db --- /dev/null +++ b/config/autoload/.gitignore @@ -0,0 +1,3 @@ +#uncomment these for public use: +local.php +*.local.php \ No newline at end of file diff --git a/config/autoload/README.md b/config/autoload/README.md new file mode 100644 index 00000000..4e504db0 --- /dev/null +++ b/config/autoload/README.md @@ -0,0 +1,8 @@ +About this directory: +===================== + +By default, this application is configured to load all configs in +`./config/autoload/{,*.}{global,local}.php`. Doing this provides a +location for a developer to drop in configuration override files provided by +modules, as well as cleanly provide individual, application-wide config files +for things like database connections, etc. diff --git a/config/autoload/global.php b/config/autoload/global.php new file mode 100644 index 00000000..647ac5c1 --- /dev/null +++ b/config/autoload/global.php @@ -0,0 +1,32 @@ + array( + 'driver' => 'Pdo', +// 'dsn' => 'mysql:dbname=fmipu;host=perkoz-db.my.phpcloud.com', + 'driver_options' => array( + PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' + ), + ), + 'service_manager' => array( + 'factories' => array( + 'Zend\Db\Adapter\Adapter' + => 'Zend\Db\Adapter\AdapterServiceFactory', + ), + ), + + // ... + +); diff --git a/config/autoload/local.php.dist b/config/autoload/local.php.dist new file mode 100644 index 00000000..7862eba7 --- /dev/null +++ b/config/autoload/local.php.dist @@ -0,0 +1,16 @@ + + + + FMI + + + +
+
+ +
+
+
+

Content

+
+
+ +
+
+
+

Advertisements

+
+
+ +
+
+ + + \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 00000000..bc3b876e --- /dev/null +++ b/index.php @@ -0,0 +1,11 @@ + + + Hello World + + + Hello World from FMI

'; ?> + Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> + Hello World, Aleksander Aleksandrov


email:aleksaander_aleksandrov@abv.bg'; ?> + + + diff --git a/init_autoloader.php b/init_autoloader.php new file mode 100644 index 00000000..08a0045e --- /dev/null +++ b/init_autoloader.php @@ -0,0 +1,49 @@ +add('Zend', $zf2Path . '/Zend'); + } else { + include $zf2Path . '/Zend/Loader/AutoloaderFactory.php'; + Zend\Loader\AutoloaderFactory::factory(array( + 'Zend\Loader\StandardAutoloader' => array( + 'autoregister_zf' => true + ) + )); + } +} + +if (!class_exists('Zend\Loader\AutoloaderFactory')) { + throw new RuntimeException('Unable to load ZF2. Run `php composer.phar install` or define a ZF2_PATH environment variable.'); +} diff --git a/layout.css b/layout.css new file mode 100644 index 00000000..df9830eb --- /dev/null +++ b/layout.css @@ -0,0 +1,77 @@ +@CHARSET "UTF-8"; + +body, html{ + margin: 0; + padding: 0; +} + +body { + text-align: center; + background: yellow; +} + +#wrap { + width: 80%; /* 960px; */ + margin: auto; + text-align: left; +} + +#header { + position: relative; + top: 0; + left: 0; + width:100%; + height: 100px; + background: green; +} + +#footer { + clear: both; + width:100%; + height: 60px; + background: cyan; +} + +#mainBody { + float: left; + width: 80%; + background: red; +} + +#content { + float: right; + width: 80%; + min-height: 300px; + background: brown; +} + +#navSide { + float: left; + width: 20%; + display: block; +} + +#add { + float: right; + width: 20%; + /* display: none; */ + background: blue; +} + +#wrapInner { + width: 100%; + margin: auto; +} + +#navTop { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + /* height: 30px; */ + text-align: center; +} + +.inside { + padding: 5px; +} diff --git a/module/Album/Module.php b/module/Album/Module.php new file mode 100644 index 00000000..1f67b2d1 --- /dev/null +++ b/module/Album/Module.php @@ -0,0 +1,49 @@ + array( + __DIR__ . '/autoload_classmap.php', + ), + 'Zend\Loader\StandardAutoloader' => array( + 'namespaces' => array( + __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, + ), + ), + ); + } + + public function getConfig() + { + return include __DIR__ . '/config/module.config.php'; + } + + // Add this method: + public function getServiceConfig() + { + return array( + 'factories' => array( + 'Album\Model\AlbumTable' => function($sm) { + $tableGateway = $sm->get('AlbumTableGateway'); + $table = new AlbumTable($tableGateway); + return $table; + }, + 'AlbumTableGateway' => function ($sm) { + $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); + $resultSetPrototype = new ResultSet(); + $resultSetPrototype->setArrayObjectPrototype(new Album()); + return new TableGateway('album', $dbAdapter, null, $resultSetPrototype); + }, + ), + ); + } +} diff --git a/module/Album/autoload_classmap.php b/module/Album/autoload_classmap.php new file mode 100644 index 00000000..dad330e6 --- /dev/null +++ b/module/Album/autoload_classmap.php @@ -0,0 +1,2 @@ + array( + 'invokables' => array( + 'Album\Controller\Album' => 'Album\Controller\AlbumController', + ), + ), + + // The following section is new and should be added to your file + 'router' => array( + 'routes' => array( + 'album' => array( + 'type' => 'segment', + 'options' => array( + 'route' => '/album[/:action][/:id]', + 'constraints' => array( + 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', + 'id' => '[0-9]+', + ), + 'defaults' => array( + 'controller' => 'Album\Controller\Album', + 'action' => 'index', + ), + ), + ), + ), + ), + + 'view_manager' => array( + 'template_path_stack' => array( + 'album' => __DIR__ . '/../view', + ), + ), +); \ No newline at end of file diff --git a/module/Album/src/Album/Controller/AlbumController.php b/module/Album/src/Album/Controller/AlbumController.php new file mode 100644 index 00000000..759e6dbc --- /dev/null +++ b/module/Album/src/Album/Controller/AlbumController.php @@ -0,0 +1,114 @@ + $this->getAlbumTable()->fetchAll(), + )); + } + + public function addAction() + { + $form = new AlbumForm(); + $form->get('submit')->setValue('Add'); + + $request = $this->getRequest(); + if ($request->isPost()) { + $album = new Album(); + $form->setInputFilter($album->getInputFilter()); + $form->setData($request->getPost()); + + if ($form->isValid()) { + $album->exchangeArray($form->getData()); + $this->getAlbumTable()->saveAlbum($album); + + // Redirect to list of albums + return $this->redirect()->toRoute('album'); + } + } + return array('form' => $form); + } + + + public function editAction() + { + $id = (int) $this->params()->fromRoute('id', 0); + if (!$id) { + return $this->redirect()->toRoute('album', array( + 'action' => 'add' + )); + } + $album = $this->getAlbumTable()->getAlbum($id); + + $form = new AlbumForm(); + $form->bind($album); + $form->get('submit')->setAttribute('value', 'Edit'); + + $request = $this->getRequest(); + if ($request->isPost()) { + $form->setInputFilter($album->getInputFilter()); + $form->setData($request->getPost()); + + if ($form->isValid()) { + $this->getAlbumTable()->saveAlbum($form->getData()); + + // Redirect to list of albums + return $this->redirect()->toRoute('album'); + } + } + + return array( + 'id' => $id, + 'form' => $form, + ); + } + + public function deleteAction() + { + $id = (int) $this->params()->fromRoute('id', 0); + if (!$id) { + return $this->redirect()->toRoute('album'); + } + + $request = $this->getRequest(); + if ($request->isPost()) { + $del = $request->getPost('del', 'No'); + + if ($del == 'Yes') { + $id = (int) $request->getPost('id'); + $this->getAlbumTable()->deleteAlbum($id); + } + + // Redirect to list of albums + return $this->redirect()->toRoute('album'); + } + + return array( + 'id' => $id, + 'album' => $this->getAlbumTable()->getAlbum($id) + ); + } + + public function getAlbumTable() + { + if (!$this->albumTable) + { + $sm = $this->getServiceLocator(); + $this->albumTable = $sm->get('Album\Model\AlbumTable'); + } + return $this->albumTable; + } + } + + diff --git a/module/Album/src/Album/Form/AlbumForm.php b/module/Album/src/Album/Form/AlbumForm.php new file mode 100644 index 00000000..511a1804 --- /dev/null +++ b/module/Album/src/Album/Form/AlbumForm.php @@ -0,0 +1,46 @@ +setAttribute('method', 'post'); + $this->add(array( + 'name' => 'id', + 'attributes' => array( + 'type' => 'hidden', + ), + )); + $this->add(array( + 'name' => 'artist', + 'attributes' => array( + 'type' => 'text', + ), + 'options' => array( + 'label' => 'Artist', + ), + )); + $this->add(array( + 'name' => 'title', + 'attributes' => array( + 'type' => 'text', + ), + 'options' => array( + 'label' => 'Title', + ), + )); + $this->add(array( + 'name' => 'submit', + 'attributes' => array( + 'type' => 'submit', + 'value' => 'Go', + 'id' => 'submitbutton', + ), + )); + } +} \ No newline at end of file diff --git a/module/Album/src/Album/Model/Album.php b/module/Album/src/Album/Model/Album.php new file mode 100644 index 00000000..c255d2ac --- /dev/null +++ b/module/Album/src/Album/Model/Album.php @@ -0,0 +1,95 @@ +id = (isset($data['id'])) ? $data['id'] : null; + $this->artist = (isset($data['artist'])) ? $data['artist'] : null; + $this->title = (isset($data['title'])) ? $data['title'] : null; + } + + // Add the following method: + public function getArrayCopy() + { + return get_object_vars($this); + } + + + // Add content to this method: + public function setInputFilter(InputFilterInterface $inputFilter) + { + throw new \Exception("Not used"); + } + + public function getInputFilter() + { + if (!$this->inputFilter) { + $inputFilter = new InputFilter(); + $factory = new InputFactory(); + + $inputFilter->add($factory->createInput(array( + 'name' => 'id', + 'required' => true, + 'filters' => array( + array('name' => 'Int'), + ), + ))); + + $inputFilter->add($factory->createInput(array( + 'name' => 'artist', + 'required' => true, + 'filters' => array( + array('name' => 'StripTags'), + array('name' => 'StringTrim'), + ), + 'validators' => array( + array( + 'name' => 'StringLength', + 'options' => array( + 'encoding' => 'UTF-8', + 'min' => 1, + 'max' => 100, + ), + ), + ), + ))); + + $inputFilter->add($factory->createInput(array( + 'name' => 'title', + 'required' => true, + 'filters' => array( + array('name' => 'StripTags'), + array('name' => 'StringTrim'), + ), + 'validators' => array( + array( + 'name' => 'StringLength', + 'options' => array( + 'encoding' => 'UTF-8', + 'min' => 1, + 'max' => 100, + ), + ), + ), + ))); + + $this->inputFilter = $inputFilter; + } + + return $this->inputFilter; + } +} + + diff --git a/module/Album/src/Album/Model/AlbumTable.php b/module/Album/src/Album/Model/AlbumTable.php new file mode 100644 index 00000000..90f178c0 --- /dev/null +++ b/module/Album/src/Album/Model/AlbumTable.php @@ -0,0 +1,55 @@ +tableGateway = $tableGateway; + } + + public function fetchAll() + { + $resultSet = $this->tableGateway->select(); + return $resultSet; + } + + public function getAlbum($id) + { + $id = (int) $id; + $rowset = $this->tableGateway->select(array('id' => $id)); + $row = $rowset->current(); + if (!$row) { + throw new \Exception("Could not find row $id"); + } + return $row; + } + + public function saveAlbum(Album $album) + { + $data = array( + 'artist' => $album->artist, + 'title' => $album->title, + ); + + $id = (int)$album->id; + if ($id == 0) { + $this->tableGateway->insert($data); + } else { + if ($this->getAlbum($id)) { + $this->tableGateway->update($data, array('id' => $id)); + } else { + throw new \Exception('Form id does not exist'); + } + } + } + + public function deleteAlbum($id) + { + $this->tableGateway->delete(array('id' => $id)); + } +} \ No newline at end of file diff --git a/module/Album/view/album/album/add.phtml b/module/Album/view/album/album/add.phtml new file mode 100644 index 00000000..1b6ab194 --- /dev/null +++ b/module/Album/view/album/album/add.phtml @@ -0,0 +1,17 @@ +headTitle($title); +?> +

escapeHtml($title); ?>

+form; +$form->setAttribute('action', $this->url('album', array('action' => 'add'))); +$form->prepare(); + +echo $this->form()->openTag($form); +echo $this->formHidden($form->get('id')); +echo $this->formRow($form->get('title')); +echo $this->formRow($form->get('artist')); +echo $this->formSubmit($form->get('submit')); +echo $this->form()->closeTag(); \ No newline at end of file diff --git a/module/Album/view/album/album/delete.phtml b/module/Album/view/album/album/delete.phtml new file mode 100644 index 00000000..795877f3 --- /dev/null +++ b/module/Album/view/album/album/delete.phtml @@ -0,0 +1,24 @@ +headTitle($title); +?> +

escapeHtml($title); ?>

+ +

Are you sure that you want to delete + 'escapeHtml($album->title); ?>' by + 'escapeHtml($album->artist); ?>'? +

+url('album', array( + 'action' => 'delete', + 'id' => $this->id, +)); +?> +
+
+ + + +
+
\ No newline at end of file diff --git a/module/Album/view/album/album/edit.phtml b/module/Album/view/album/album/edit.phtml new file mode 100644 index 00000000..896da0fc --- /dev/null +++ b/module/Album/view/album/album/edit.phtml @@ -0,0 +1,24 @@ +headTitle($title); +?> +

escapeHtml($title); ?>

+ +form; +$form->setAttribute('action', $this->url( + 'album', + array( + 'action' => 'edit', + 'id' => $this->id, + ) +)); +$form->prepare(); + +echo $this->form()->openTag($form); +echo $this->formHidden($form->get('id')); +echo $this->formRow($form->get('title')); +echo $this->formRow($form->get('artist')); +echo $this->formSubmit($form->get('submit')); +echo $this->form()->closeTag(); \ No newline at end of file diff --git a/module/Album/view/album/album/index.phtml b/module/Album/view/album/album/index.phtml new file mode 100644 index 00000000..f5038267 --- /dev/null +++ b/module/Album/view/album/album/index.phtml @@ -0,0 +1,29 @@ +headTitle($title); +?> +

escapeHtml($title); ?>

+

+ Add new album +

+ + + + + + + + + + + + + +getApplication()->getServiceManager()->get('translator'); + $eventManager = $e->getApplication()->getEventManager(); + $moduleRouteListener = new ModuleRouteListener(); + $moduleRouteListener->attach($eventManager); + } + + public function getConfig() + { + return include __DIR__ . '/config/module.config.php'; + } + + public function getAutoloaderConfig() + { + return array( + 'Zend\Loader\StandardAutoloader' => array( + 'namespaces' => array( + __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, + ), + ), + ); + } +} diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php new file mode 100644 index 00000000..33ec4449 --- /dev/null +++ b/module/Application/config/module.config.php @@ -0,0 +1,93 @@ + array( + 'routes' => array( + 'home' => array( + 'type' => 'Zend\Mvc\Router\Http\Literal', + 'options' => array( + 'route' => '/', + 'defaults' => array( + + 'controller' => 'Album\Controller\Album', + 'controller' => 'Application\Controller\Index', + 'action' => 'index', + ), + ), + ), + // The following is a route to simplify getting started creating + // new controllers and actions without needing to create a new + // module. Simply drop new controllers in, and you can access them + // using the path /application/:controller/:action + 'application' => array( + 'type' => 'Literal', + 'options' => array( + 'route' => '/application', + 'defaults' => array( + '__NAMESPACE__' => 'Application\Controller', + 'controller' => 'Index', + 'action' => 'index', + ), + ), + 'may_terminate' => true, + 'child_routes' => array( + 'default' => array( + 'type' => 'Segment', + 'options' => array( + 'route' => '/[:controller[/:action]]', + 'constraints' => array( + 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', + 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', + ), + 'defaults' => array( + ), + ), + ), + ), + ), + ), + ), + 'service_manager' => array( + 'factories' => array( + 'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory', + ), + ), + 'translator' => array( + 'locale' => 'en_US', + 'translation_file_patterns' => array( + array( + 'type' => 'gettext', + 'base_dir' => __DIR__ . '/../language', + 'pattern' => '%s.mo', + ), + ), + ), + 'controllers' => array( + 'invokables' => array( + 'Application\Controller\Index' => 'Application\Controller\IndexController' + ), + ), + 'view_manager' => array( + 'display_not_found_reason' => true, + 'display_exceptions' => true, + 'doctype' => 'HTML5', + 'not_found_template' => 'error/404', + 'exception_template' => 'error/index', + 'template_map' => array( + 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', + 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', + 'error/404' => __DIR__ . '/../view/error/404.phtml', + 'error/index' => __DIR__ . '/../view/error/index.phtml', + ), + 'template_path_stack' => array( + __DIR__ . '/../view', + ), + ), +); diff --git a/module/Application/language/ar_SY.po b/module/Application/language/ar_SY.po new file mode 100644 index 00000000..4e0565a7 --- /dev/null +++ b/module/Application/language/ar_SY.po @@ -0,0 +1,184 @@ +# +# tawfek daghistani , 2012. +# Tawfek Daghistani , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-07 13:58+0300\n" +"Last-Translator: Tawfek Daghistani \n" +"Language-Team: Arabic <>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: English\n" +"X-Poedit-Country: UNITED STATES\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +#: ../view/layout/layout.phtml:6 ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "الصفحة الرئيسية" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "جميع الحقوق محفوظة" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "أهلا بك في %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "" +"Congratulations! You have successfully installed the %sZF2 Skeleton " +"Application%s. You are currently running Zend Framework version %s. This " +"skeleton can serve as a simple starting point for you to begin building your " +"application on ZF2." +msgstr "" +"تهانينا! لقد قمت بتنصيب %sZF2 Skeleton Application%s . أنت الآن تستخدم مكتبة " +"زيند الإصدار %s . هذا التطبيق يمكن أن يكون لك نقطة بداية سهلة في بناء " +"برامجك الخاصة على مكتبة زيند " + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "اشتق مكتبة زيند على GitHub " + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "تابع أخر التطورات" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "" +"Zend Framework 2 is under active development. If you are interested in " +"following the development of ZF2, there is a special ZF2 portal on the " +"official Zend Framework website which provides links to the ZF2 %swiki%s, " +"%sdev blog%s, %sissue tracker%s, and much more. This is a great resource for " +"staying up to date with the latest developments!" +msgstr "" +"مكتبة زيند تخضع للتطوير المستمر , إذا كان لديك الرغبة في متابعة التطورات , " +"بإمكانك تصفح الموقع الرسمي للمكتبة الذي يحتوي على روابط إلى %swiki%s, %sdev " +"blog%s, %sissue tracker%s, ,و المزيد . هذه مصادر رائعة لمتابعة أخر التطورات" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "بوابة التطوير الخاصة ب زيند" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "تعرف على الإضافات" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "" +"The community is working on developing a community site to serve as a " +"repository and gallery for ZF2 modules. The project is available %son GitHub" +"%s. The site is currently live and currently contains a list of some of the " +"modules already available for ZF2." +msgstr "" +"المجتمع البرمجي يعمل على تطوير موقع خاص به ليكون كمصدر و معرض لإضافات ZF2 . " +"هذا المشروع موجود على %son GitHub%s . هذا الموقع يخضع للتطوير المستمر و " +"يحتوي على قائمة من الإضافات الخاصة ب ZF2 " + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "إكتشف إضافات ZF2 " + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "الدعم و المساعدة " + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "" +"If you need any help or support while developing with ZF2, you may reach us " +"via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or " +"feedback you may have regarding the beta releases. Alternatively, you may " +"subscribe and post questions to the %smailing lists%s." +msgstr "" +"إذا كنت تريد الحصول على دعم فني أو مساعدة في تطوير ZF2 , بإمكانك التواصل عبر " +"IRC: %s#zftalk.2 on Freenode%s. نحن نريد أن نسمع منك المزيد من الأسئلة , " +"الأراء و الملاحظات على النسخة التجربية من المكتبة , أو بإمكانك الإشتراك و " +"التفاعل أو وضع الأسئلة في القائمة البريدية %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "تواصل معنا في IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "حصل خطأ ما " + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "مزيد من المعلومات" + +#: ../view/error/index.phtml:11 ../view/error/index.phtml:35 +msgid "File" +msgstr "ملف" + +#: ../view/error/index.phtml:15 ../view/error/index.phtml:39 +msgid "Message" +msgstr "الرسالة" + +#: ../view/error/index.phtml:19 ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "تفاصيل الخطأ" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "الأخطاء السابقة" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "لايوجد خطأ" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "حصل خطأ 404 , الصفحة غير موجودة" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "المتحكم المطلوب غير قادر على إجابة الطلب" + +#: ../view/error/404.phtml:13 +msgid "" +"The requested controller could not be mapped to an existing controller class." +msgstr "لا يمكن ربط المتحكم المطلوب بأي من المتحكمات الموجودة حالياًَ" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "المتحكم المطلوب غير قادر على الإجابة " + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "الرابط المطلوب غير معرف لدى الموجه" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "لا يمكنني التحديد لماذا حصل الخطأ 404 في هذا الوقت " + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "المتحكم " + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "يوصل إلى %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "خطأ برمجي" diff --git a/module/Application/language/cs_CZ.po b/module/Application/language/cs_CZ.po new file mode 100644 index 00000000..2485e2d6 --- /dev/null +++ b/module/Application/language/cs_CZ.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-06 13:05+0100\n" +"Last-Translator: David Lukas \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Czech\n" +"X-Poedit-Country: CZECH REPUBLIC\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton aplikace" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Úvod" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Všechna práva vyhrazena." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Vítejte v %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Blahopřejeme! Úspěšně jste nainstalovali %sZF2 Skeleton Application%s. Právě používáte Zend Framework verze %s. Tato kostra aplikace vám poslouží jako jednoduchý výchozí bod, ze kterého můžete vyjít při tvorbě vlastní aplikace nad ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 na GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Sledujte vývoj" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 je aktivně vyvíjen. Chcete-li sledovat vývoj ZF2, máte na oficiálních webových stránkách Zend Framework k dispozici zvláštní portál ZF2, na kterém najdete odkazy na ZF2 %swiki%s, %svývojářský blog%s, %sissue tracker%s a mnoho dalšího. Tento portál je skvělý zdroj aktuálních informací o nejnovějším vývoji!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Vývojářský portál ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Objevte Moduly" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Komunita pracuje na vývoji komunitního webu, který bude sloužit jako archiv a galerie modulů ZF2. Tento projekt je dostupný %sna GitHub%s. Web je aktuálně v provozu a obsahuje seznam některých již dostupných modulů ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Prozkoumejte Moduly ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Pomoc & Podpora" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Budete-li při vývoji se ZF2 potřebovat jakoukoli pomoc nebo podporu, můžete nás zastihnout přes IRC: %s#zftalk.2 na Freenode%s. Budeme rádi za jakékoli vaše otázky nebo připomínky týkající se beta verzí. Případně se také můžete přihlásit k odběru a posílat otázky na naše %se-mailové distribuční seznamy%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Ozvěte se nám na IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Vyskytla se chyba" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Další informace" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Soubor" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Zpráva" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Trasování zásobníku (Stack trace)" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Předchozí výjimky" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Žádná výjimka není k dispozici" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Vyskytla se chyba 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Požadovaný controller nemohl vyřídit požadavek." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Požadovaný controller se nepodařilo namapovat na žádnou existující třídu controlleru." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Požadovaný controller nepodporuje vyřízení (controller not dispatchable)." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "S požadovaným URL nebyla při směrování (routing) nalezena shoda." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Momentálně nedokážeme určit, proč byla vygenerována chyba 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "je mapován na %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Výjimka" + diff --git a/module/Application/language/de_DE.po b/module/Application/language/de_DE.po new file mode 100644 index 00000000..0de15400 --- /dev/null +++ b/module/Application/language/de_DE.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 23:45-0700\n" +"PO-Revision-Date: 2012-07-06 08:18-0700\n" +"Last-Translator: Evan Coury \n" +"Language-Team: ZF Contributors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Startseite" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Alle Rechte vorbehalten." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Willkommen zu dem %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Herzlichen Glückwunsch! Sie haben die %sZF2 Skeleton Application%s erfolgreich installiert und benutzen gerade die Version %s des Zend Frameworks. Dieses Gerüst kann Ihnen als Einstiegspunkt, für Ihre weitere Entwicklung, basierend auf dem Zend Framework 2, dienen." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 auf GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Folge der Entwicklung" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Das Zend Framework 2 wird z.Z. aktiv weiterentwickelt. Sollten Sie daran interessiert sein, die Entwicklung von ZF2 zu verfolgen, so bietet Ihnen die offizielle Webseite einen eigens für das Zend Framework 2 eingerichteten Bereich, auf der Sie Verlinkungen zum ZF2 %sWiki%s, %sEntwickler Blog%s, einem %sFehlerverfolgungssystem%s und noch vielem mehr finden. Dieser Bereich ist eine hervorragende Quelle um stets aktuell zu bleiben." + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Entwickler Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Entdecken Sie Module" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Die Community arbeitet momentan an einer Community Seite, welche als Galerie für ZF2 Module dient. Dieses Projekt ist %sauf GitHub%s verfügbar. Die Webseite ist bereits Online und enthält eine Liste mit schon veröffentlichten Modulen für das Zend Framework 2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Erkunden Sie ZF2 Module" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Hilfe & Support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Sollten Sie Hilfe jeglicher Art bei der Entwicklung mit dem Zend Framework 2 benötigen, kontaktieren Sie uns doch einfach über das IRC: %s#zftalk.2 on Freenode%s. Wir freuen uns darauf, Ihnen bei Ihren Fragen zu helfen oder aber auch Ihre Meinung bezüglich der Beta Versionen zu hören. Alternativ können Sie auch die %smailing lists%s abonnieren und Ihre Fragen dort stellen." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Schreiben Sie uns im IRC an" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Ein Fehler ist aufgetreten" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Zusätzliche Information" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Datei" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Meldung" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stapelüberwachung" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Vorherige Ausnahme" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Es ist keine Ausnahme verfügbar" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Es trat ein 404 Fehler auf" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Der angeforderte Controller war nicht in der Lage die Anfrage zu verarbeiten." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Der angeforderte Controller konnte keiner Controller Klasse zugeordnet werden." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Der angeforderte Controller ist nicht aufrufbar." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Für die angeforderte URL konnte keine Übereinstimmung gefunden werden." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Zu diesem Zeitpunkt ist es uns nicht möglich zu bestimmen, warum ein 404 Fehler aufgetreten ist." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "wird aufgelöst in %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Ausnahme" + diff --git a/module/Application/language/en_US.po b/module/Application/language/en_US.po new file mode 100644 index 00000000..c1f203bf --- /dev/null +++ b/module/Application/language/en_US.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-05 22:17-0700\n" +"Last-Translator: Evan Coury \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: English\n" +"X-Poedit-Country: UNITED STATES\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "" + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "" + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "" + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "" + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "" + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "" + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "" + diff --git a/module/Application/language/es_ES.po b/module/Application/language/es_ES.po new file mode 100644 index 00000000..5170d3ce --- /dev/null +++ b/module/Application/language/es_ES.po @@ -0,0 +1,111 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-06 19:07+0100\n" +"PO-Revision-Date: 2012-07-06 19:09+0100\n" +"Last-Translator: Adolfo Abegg \n" +"Language-Team: ZF Contributors \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: Spanish\n" +"X-Poedit-Country: SPAIN\n" +"X-Poedit-SearchPath-0: ..\n" + +msgid "Skeleton Application" +msgstr "Aplicación Esqueleto" + +msgid "Home" +msgstr "Inicio" + +msgid "All rights reserved." +msgstr "Todos los derechos reservados" + +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenido al %sZend Framework 2%s" + +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "¡Felicitaciones! Haz instalado correctamente el %sla aplicación esqueleto del ZF2%s. Estás corriendo la versión %s del Zend Framework. Este esqueleto te servirá como un punto de inicio sencillo para empezar a construir tu aplicación con el ZF2." + +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Hacer un Fork del Zend Framework 2 en GitHub" + +msgid "Follow Development" +msgstr "Seguir el Desarrollo" + +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "El Zend Framework 2 está en pleno desarrollo. Si estás interesado en seguir el desarrollo del ZF2, existe un portal especial para el ZF2 en el sitio web oficial del Zend Framework el cual provee enlaces %sa la Wiki%s, %sal Blog de desarrollo%s, %sal issue tracker%s y mucho más. Este es un gran recurso para mantenerte al día con los últimos avances en el desarrollo!" + +msgid "ZF2 Development Portal" +msgstr "Portal de Desarrollo del ZF2" + +msgid "Discover Modules" +msgstr "Descubre Módulos" + +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La comunidad está trabajando en el desarrollo de una web comunitaria que servirá de repositorio y galería de los módulos del ZF2. El proyecto está disponible %sen GitHub%s. El sitio web está en línea y actualmente posee una lista de algunos módulos que ya están disponibles para el ZF2." + +msgid "Explore ZF2 Modules" +msgstr "Explora los módulos del ZF2" + +msgid "Help & Support" +msgstr "Ayuda & Soporte" + +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si necesitas alguna ayuda o soporte mientras estás desarrollando con el ZF2, puedes encontrarnos via IRC: %s#zftalk.2 en Freenode%s. Nos encantaría leer tus preguntas o cualquier feedback que puedas tener en relación a los lanzamientos de las versiones beta. También puedes subscribirte y enviar preguntas %sa la lista de correos%s" + +msgid "Ping us on IRC" +msgstr "Escríbenos en el IRC" + +msgid "An error occurred" +msgstr "Ha ocurrido un error" + +msgid "Additional information" +msgstr "Información adicional" + +msgid "File" +msgstr "Archivo" + +msgid "Message" +msgstr "Mensaje" + +msgid "Stack trace" +msgstr "Seguimiento de la pila (stack trace)" + +msgid "Previous exceptions" +msgstr "Excepciones anteriores" + +msgid "No Exception available" +msgstr "No hay ninguna Excepción disponible." + +msgid "A 404 error occurred" +msgstr "Ha ocurrido un error 404" + +msgid "The requested controller was unable to dispatch the request." +msgstr "El controlador solicitado no pudo ejecutar la petición." + +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "El controlador solicitado no se pudo mapear con una clase de controlador existente." + +msgid "The requested controller was not dispatchable." +msgstr "El controlador solicitado no es ejecutable." + +msgid "The requested URL could not be matched by routing." +msgstr "El ruteador no ha encontrado la ruta para la URL solicitada." + +msgid "We cannot determine at this time why a 404 was generated." +msgstr "No pudimos determinar por qué un error 404 ha sido generado." + +msgid "Controller" +msgstr "Controller" + +msgid "resolves to %s" +msgstr "se resuelve a %s" + +msgid "Exception" +msgstr "Excepción" + diff --git a/module/Application/language/fr_CA.po b/module/Application/language/fr_CA.po new file mode 100644 index 00000000..979261af --- /dev/null +++ b/module/Application/language/fr_CA.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-06 01:46-0500\n" +"PO-Revision-Date: 2012-07-06 02:08-0500\n" +"Last-Translator: EBB Dev \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: CANADA\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Une erreur 404 est survenue" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Le contrôleur demandé n'a pas pu acheminer la requête." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Le contrôleur demandé ne correspond pas à une classe contrôleur existante." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Le contrôleur demandé ne peut être acheminé." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "L'URL demandée n'a pas pu trouver de route correspondante." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nous ne pouvons pas déterminer pour le moment pourquoi une 404 a été générée." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Contrôleur" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "résout en %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exception" + +#: ../view/error/404.phtml:55 +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +msgid "Stack trace" +msgstr "Pile d'exécution" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Une erreur est survenue" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informations complémentaires" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Fichier" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Message" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Exceptions précédentes" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Aucune exception disponible" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenue dans %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Félicitations ! Vous avez installé %sZF2 Skeleton Application%s avec succès. Vous utilisez actuellement Zend Framework version %s. Cette structure peut vous servir comme point de départ simple pour démarrer la construction de votre application avec ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Faites un Fork de Zend Framework 2 sur GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Suivre le développement" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 est en cours de développement. Si vous êtes intéressé pour suivre l'évolution de ZF2, il existe un portail dédié à ZF2 sur le site officiel Zend Framework qui propose des liens vers le %swiki%s ZF2, le %sblogue de dev%s, le %ssuivi des problèmes%s, et bien plus encore. Il s'agit d'une excellente ressource pour rester à jour sur les dernières évolutions !" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portail sur le développement de ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Découvrez les modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La communauté travaille sur le développement d'un site communautaire avec l'objectif de servir de dépôt et de galerie pour les modules ZF2. Le projet est disponible %ssur GitHub%s. Le site est déjà en ligne, et contient une liste non exhaustive des modules déjà disponibles pour ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Explorer les modules ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aide & support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si vous avez besoin d'aide ou de soutient en développant avec ZF2, vous pouvez nous joindre sur IRC : %s#zftalk.2 sur Freenode%s. Nous aimerions connaître vos questions ou les commentaires que vous pourriez avoir au sujet des versions beta. Sinon, vous pouvez vous abonner, et poser des questions sur la %sliste de diffusion%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Rejoignez-nous sur IRC" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Accueil" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tous droits réservés." + diff --git a/module/Application/language/fr_FR.po b/module/Application/language/fr_FR.po new file mode 100644 index 00000000..49f89d92 --- /dev/null +++ b/module/Application/language/fr_FR.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:32-0700\n" +"PO-Revision-Date: 2012-07-05 23:36-0700\n" +"Last-Translator: Evan Coury \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: FRANCE\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Accueil" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tous droits réservés." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenue dans le %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Félicitations ! Vous avez installé avec succès le %sZF2 Skeleton Application%s. Vous utilisez actuellement Zend Framework version %s. Cette structure peut vous servir comme un point de départ simple pour démarrer la construction de votre application avec ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Faites un Fork de Zend Framework 2 sur GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Suivre le développement" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 est en cours de développement. Si vous êtes intéressé pour suivre l'évolution de ZF2, il existe un portail dédié à ZF2 sur le site officiel Zend Framework qui propose des liens vers le %swiki%s ZF2, %sdev blog%s, %ssuivi des problèmes%s, et bien plus encore. Il s'agit d'une excellente ressource pour rester à jour sur les dernières évolutions !" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portail sur le développement de ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Découvrez les modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La communauté travaille sur le développement d'un site communautaire avec l'objectif de servir de dépôt et de galerie pour les modules ZF2. Le projet est disponible %ssur GitHub%s. Le site est déjà en ligne, et contient une liste non exhaustive des modules déjà disponibles pour ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Explorer les modules ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aide & support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si vous avez besoin d'aide ou de support en développant avec ZF2, vous pouvez nous joindre sur IRC : %s#zftalk.2 sur Freenode%s. Nous aimerions avoir vos questions ou vos commentaires que vous pourriez avoir au sujet des versions bêta. Sinon, vous pouvez vous abonner, et poser des questions sur la %sliste de diffusion%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Rejoignez-nous sur IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Une erreur est survenue" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informations complémentaires" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Fichier" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Message" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Pile d'exécution" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Exceptions précédentes" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Aucune exception disponible" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Une erreur 404 est survenue" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Le contrôleur demandé n'a pas pu dispatcher la requête." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Le contrôleur demandé ne correspond pas à une classe existante de contrôleur." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Le contrôleur demandé n'est pas dispatchable." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "L'URL demandée n'a pas pu trouver de route correspondante." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nous ne pouvons pas déterminer pour le moment pourquoi une 404 a été générée." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Contrôleur" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "résout en %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exception" + diff --git a/module/Application/language/it_IT.po b/module/Application/language/it_IT.po new file mode 100644 index 00000000..6c1759c8 --- /dev/null +++ b/module/Application/language/it_IT.po @@ -0,0 +1,154 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 23:45-0700\n" +"PO-Revision-Date: 2012-07-12 22:14+0100\n" +"Last-Translator: Marco Pivetta \n" +"Language-Team: ZF Contributors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,-1,5,-1,-1,-1\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Pagina iniziale" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tutti i diritti sono riservati." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Benvenuto in %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Congratulazioni! Hai appena installato con successo %sZF2 Skeleton Application%s e stai utilizzando la versione %s di Zend Framework. Questa struttura può servirti come semplice punto di riferimento per iniziare a costruire un'applicazione basata su ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Crea un fork di Zend Framework 2 su GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Segui lo sviluppo" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 è in forte sviluppo. Se sei interessato a seguire lo sviluppo di ZF2, è presente un portale che fornisce link al %swiki%s, al %sdev blog%s, all'%sissue tracker%s e a molto altro riguardo a ZF2. Il Portale è un'ottima risorsa per rimanere aggiornati con gli ultimi sviluppi!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portale sullo sviluppo di ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Scopri i Moduli" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La community sta lavorando allo sviluppo di un sito che deve servire come raccolta e gallery di Moduli per ZF2. Il progetto è disponibile %son Github%s. Il sito è visitabile e al momento contiene una lista di alcuni dei Moduli già disponibili per ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Esplora i Moduli di ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aiuto & Supporto" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Qualora ti servisse aiuto o supporto mentre sviluppi con ZF2, puoi contattarci tramite IRC: %s#zftalk.2 on Freenode%s. Ci piacerebbe moltissimo ricevere le tue domande o qualunque feedback tu possa avere riguardo alle beta release. In alternativa, puoi iscriverti e inviare domande alla %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Contattaci su IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Si è verificato un errore" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informazioni aggiuntive" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "File" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Messaggio" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Eccezioni precedenti" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Non è disponibile alcuna eccezione" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Si è verificato un errore 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Il controller richiesto non è stato in grado di elaborare la richiesta." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Non è stato possibile mappare il controller richiesto ad una classe di tipo controller." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Il controller richiesto non è un oggetto dispatchable." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Non è stato possibile effettuare il match dell'indirizzo richiesto tramite routing." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "In questo momento non siamo in grado di determinare perchè sia stato generato un 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "viene risolto in %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Eccezione" + diff --git a/module/Application/language/ja_JP.po b/module/Application/language/ja_JP.po new file mode 100644 index 00000000..d6a953ee --- /dev/null +++ b/module/Application/language/ja_JP.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 19:30-0700\n" +"PO-Revision-Date: 2012-07-15 08:20+0900\n" +"Last-Translator: sasezaki \n" +"Language-Team: Japanese\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Japanese\n" +"X-Poedit-Country: Japan\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "%sZend Framework 2%s へようこそ" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "おめでとうございます! %sZF2 Skeleton Application%s のインストールに成功しました。 あなたは Zend Framework version %s を動作させています。このスケルトンはZF2上でのアプリケーション構築を始めるためにシンプルなスタートポイントを提供します。" + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "GitHub で Zend Framework 2 をフォーク" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "開発を追う" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 は鋭意開発中です。ZF2の開発進行にご関心がおありでしょうか、Zend Framework公式ウェブサイト上ではZF2特別ポータルがあり、 %swiki%s、 %sdev blog%s、 %sissue tracker%s、 などのZF2関連のものを提供しています。最新の開発状況に追随するためのすばらしいリソースです。" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 開発ポータル" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "モジュールを見つける" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "コミュニティーはZF2モジュールのためのリポジトリとギャラリーを提供するコミュニティーサイトを開発中です。プロジェクトは %s GitHub%s で利用可能です。サイトは現在運営されており、ZF2ですでに利用可能なモジュールのリストを持っています。" + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "ZF2モジュールを探す" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "ヘルプとサポート" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "ZF2 で開発中に何らかのお手伝いやサポートが必要な場合、IRC を通じて私たちと連絡することができます。: %s#zftalk.2 on Freenode%s ベータ版についてあなたが抱えるかもしれない質問やフィードバックを何でも聞きたいと望みます。あるいは、%smailing lists%s を購読したり質問をポストしたりできます。" + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "IRC で呼び出す" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "エラーが発生しました" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "追加の情報" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "ファイル" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "メッセージ" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "スタックトレース" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "前の例外" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "例外が利用できません" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "404エラーが発生しました" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "要求されたコントローラはリクエストをディスパッチできませんでした。" + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "要求されたコントローラは存在するコントローラクラスにマッピングできませんでした。" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "要求されたコントローラはディスパッチ不可能でした。" + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "要求されたURLはルーティングにマッチしませんでした。" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "404が生成された理由について現時点で判断できません。" + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "コントローラ" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "%s に解決" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "例外" + diff --git a/module/Application/language/nl_NL.po b/module/Application/language/nl_NL.po new file mode 100644 index 00000000..fa97eae1 --- /dev/null +++ b/module/Application/language/nl_NL.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-24 12:48+0100\n" +"Last-Translator: Walter Tamboer\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Dutch\n" +"X-Poedit-Country: NETHERLANDS\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Applicatie Fundering" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Home" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Alle rechten voorbehouden." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Welkom bij %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Gefeliciteerd! Je hebt de %sZF2 Applicatie Fundering%s succesvol geinstalleerd. Je gebruikt Zend Framework versie %s. Deze fundering biedt je een startpunt om je ZF2 applicatie op voort te bouwen." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 op GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Volg de Ontwikkeling" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 wordt actief ontwikkeld. Als je interesse hebt in het volgen van deze ontwikkelingen dan kun je de ZF2 portaal bezoeken op de officiële website van Zend Framework. Daar staan links naar de ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s en nog veel meer. Het is het perfecte middel om up-to-date te blijven met de ontwikkelingen." + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Ontwikkelaars Portaal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Ontdek Modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "De community werkt aan een eigen community website die dient als een bewaarplaats en galerij voor ZF2 modules. Het project is beschikbaar %sop GitHub%s. De site staat op dit moment live en bevat een lijst met modules die op dit moment beschikbaar zijn voor ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Verken ZF2 Modules" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Hulp & Support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Als je hulp nodig hebt tijdens het ontwikkelen met ZF2, dan kun je ons bereiken via IRC: %s#zftalk.2 op Freenode%s. We beantwoorde met alle liefde je vragen en zouden graag feedback krijgen betreffende de beta releases. Je kunt je ook abonneren op de %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Ping ons via IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Er is een fout opgetreden" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Additionele informatie" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Bestand" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Bericht" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stack trace" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Vorige excepties" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Geen exceptie beschikbaar" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "De pagina kon niet worden gevonden." + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "De opgevraagde controller kon deze aanvraag niet verwerken." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Er is geen mapping beschikbaar voor de opgevraagde controller." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "De opgevraagde controller is niet bruikbaar (dispatchable)." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Er is geen route gevonden die overeenkomt met de opgevraagde URL." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "We kunnen op dit moment niet achterhalen waarom de pagina niet kon worden gevonden." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "verwijst naar %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exceptie" + diff --git a/module/Application/language/pl_PL.po b/module/Application/language/pl_PL.po new file mode 100644 index 00000000..16fcc675 --- /dev/null +++ b/module/Application/language/pl_PL.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-28 20:33+0100\n" +"Last-Translator: Łukasz Rodziewicz \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Polish\n" +"X-Poedit-Country: POLAND\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Szkielet Aplikacji" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Strona startowa" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Wszelkie prawa zastrzeżone." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Witaj w %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Gratulacje! Z powodzeniem zainstalowałeś %sZF2 Skeleton Application%s. Aktualnie używasz Zend Framework w wersji %s. Ten szkielet może służyć jak prosty punkt startowy do budowy Twoich aplikacji na ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Forkuj Zend Framework 2 na GitHub'e" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Śledź prace programistyczne" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 jest w trakcie aktywnych prac programistycznych. Jeśli jesteś zainteresowany śledzeniem jego rozwoju, istnieje specialny portal ZF2 na oficjalnej stronie Zend Framework na którym dostępne są linki do ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, oraz wiele więcej. Jest to świetne miejsce by śledzić najnowsze zmiany!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Development Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Odkryj Moduły" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Społeczność pracuje nad stworzeniem społecznościowego serwisu który posłuży jako repozytorium i galeria dla modułów ZF2. Projekt wkrótce będzie dostępny na %son GitHub%s. Ta strona jest aktualnie online i udostępnia listę niektórych modułów dostępnych dla ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Odkryj Moduły ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Pomoc & Wsparcie" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Jeśli potrzebujesz jakiejkolwiek pomocy lub wsparcia podczas programowania na ZF2, możesz skontaktować się z nami via IRC: %s#zftalk.2 w sieci Freenode%s. Z przyjemnością wysłuchamy wszelkich pytań lub sugestii które możesz mieć odnoście wydań beta. Alternatywnie, możesz zapisać się i wysłać pytanie na %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Wyślij nam wiadomość na IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Wystąpił błąd" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Dodatkowe informacje" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Plik" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Komunikat" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stack trace" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Poprzedni wyjątek" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Brak dostępnego wyjątku" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Wystąpił błąd 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Żądany kontroler nie mógł zmapować żądania." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Żądany kontroler nie mógł być zmapowany na isteniejącą klasę kontrolera." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Żądany kontroler nie mógł zostać zmapowany." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Żądany adres URL nie mógł zostać powiązany z routing'iem." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nie możemy określić tym razem dlaczego wygenerowano błąd 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Kontroler" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "rozwiązuje na %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Wyjątek" + diff --git a/module/Application/language/tr_TR.po b/module/Application/language/tr_TR.po new file mode 100644 index 00000000..5fbdbd7a --- /dev/null +++ b/module/Application/language/tr_TR.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-06 13:19+0200\n" +"Last-Translator: H.H.G. multistore \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Turkish\n" +"X-Poedit-Country: TURKEY\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Anasayfa" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tüm haklar saklıdır." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "%sZend Framework 2%s'a hoş geldiniz" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Tebrikler! %sZF2 Skeleton Application%s'u başarıyla yüklediniz. Şu anda Zend Framework %s sürüm ile çalışıyorsunuz. Bu iskelet ZF2 üzerinde uygulama oluşturmak için basit bir başlangıç ​​noktası olarak hizmet verebilir." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Zend Framework 2'yi GitHub'da fork edin" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Gelişimi izleyin" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 aktif geliştirilmektedir. Eğer ZF2'nin gelişimi ile ilgileniyorsanız, ZF2 için resmi Zend Framework websitesinde özel portal mevcut, orada ZF2 %swiki%s'ye, %sDEV blog%s'a, %ssorun takibi%s'ne bağlantılarını ve çok daha fazlasını sunar. Bu son gelişmeler ile güncel kalmak için büyük bir kaynaktır!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Development Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Modülleri keşfedin" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Topluluk ZF2 modülleri için bir depo ve galeri olarak hizmet edecek bir topluluk sitesi geliştirme üzerinde çalışıyor. Proje %sGitHub%s'da mevcut. Site şu anda canlı ve ZF2 için bazı mevcut modüllerin listesini içerir." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "ZF2 Modüllerini keşfedin" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Yardım & Destek" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "ZF2 ile geliştirirken herhangi yardım veya desteğe ihtiyacınız varsa, bize IRC: %sFreenode #zftalk.2%s üzerinden ulaşabilirsiniz. Beta sürümleri ile ilgili olabilecek herhangi bir sorunuzu ya da yorumlarınızı duymak isteriz. Alternatif olarak %smailing listelerine%s abone olup sorularınızı sorabilirsiniz." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "IRC bizi pingleyin" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "An error occurred" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Ek bilgiler" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Klasör" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Mesaj" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Denetleyici" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Önceki istisnalar" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "İstisna yok" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Bir 404 hatası oluştu" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Talep edilen denetleyici işlemi işlemesi mümkün değildir." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Talep edilen denetleyiciye uygun denetleyici sınıfı tahsis edilemedi." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Talep edilen denetleyici çağrılabilir değildir." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "İstenen URL yönlendirmede tahsis edilemedi" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Neden 404 hatasının oluştuğunu şu an belirleyemiyoruz." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Denetleyici" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "Buraya çözümlenir: %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "İstisna" + diff --git a/module/Application/src/Application/Controller/IndexController.php b/module/Application/src/Application/Controller/IndexController.php new file mode 100644 index 00000000..a1aafaee --- /dev/null +++ b/module/Application/src/Application/Controller/IndexController.php @@ -0,0 +1,21 @@ + +

translate('Welcome to %sZend Framework 2%s'), '', '') ?>

+

translate('Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2.'), '', '', \Zend\Version\Version::VERSION) ?>

+

translate('Fork Zend Framework 2 on GitHub') ?> »

+ + +
+ +
+

translate('Follow Development') ?>

+

translate('Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!'), '', '', '', '', '', '') ?>

+

translate('ZF2 Development Portal') ?> »

+
+ +
+

translate('Discover Modules') ?>

+

translate('The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2.'), '', '') ?>

+

translate('Explore ZF2 Modules') ?> »

+
+ +
+

translate('Help & Support') ?>

+

translate('If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We\'d love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s.'), '', '', '', '') ?>

+

translate('Ping us on IRC') ?> »

+
+
diff --git a/module/Application/view/error/404.phtml b/module/Application/view/error/404.phtml new file mode 100644 index 00000000..3edd37a8 --- /dev/null +++ b/module/Application/view/error/404.phtml @@ -0,0 +1,61 @@ +

translate('A 404 error occurred') ?>

+

message ?>

+ +reason) && $this->reason): ?> + +reason) { + case 'error-controller-cannot-dispatch': + $reasonMessage = $this->translate('The requested controller was unable to dispatch the request.'); + break; + case 'error-controller-not-found': + $reasonMessage = $this->translate('The requested controller could not be mapped to an existing controller class.'); + break; + case 'error-controller-invalid': + $reasonMessage = $this->translate('The requested controller was not dispatchable.'); + break; + case 'error-router-no-match': + $reasonMessage = $this->translate('The requested URL could not be matched by routing.'); + break; + default: + $reasonMessage = $this->translate('We cannot determine at this time why a 404 was generated.'); + break; +} +?> + +

+ + + +controller) && $this->controller): ?> + +
+
translate('Controller') ?>:
+
escapeHtml($this->controller) ?> +controller_class) + && $this->controller_class + && $this->controller_class != $this->controller +) { + echo '(' . sprintf($this->translate('resolves to %s'), $this->escapeHtml($this->controller_class)) . ')'; +} +?> +
+
+ + + +exception) && $this->exception): ?> + +

translate('Exception') ?>:

+ +

escapeHtml($this->exception->getMessage()) ?>

+ +

translate('Stack trace') ?>:

+ +
+exception->getTraceAsString() ?>
+
+ + diff --git a/module/Application/view/error/index.phtml b/module/Application/view/error/index.phtml new file mode 100644 index 00000000..5165cd8e --- /dev/null +++ b/module/Application/view/error/index.phtml @@ -0,0 +1,62 @@ +

translate('An error occurred') ?>

+

message ?>

+ +display_exceptions) && $this->display_exceptions): ?> + +exception) && $this->exception instanceof Exception): ?> +
+

translate('Additional information') ?>:

+

exception); ?>

+
+
translate('File') ?>:
+
+
exception->getFile() ?>:exception->getLine() ?>
+
+
translate('Message') ?>:
+
+
exception->getMessage() ?>
+
+
translate('Stack trace') ?>:
+
+
exception->getTraceAsString() ?>
+
+
+exception->getPrevious(); + if ($e) : +?> +
+

translate('Previous exceptions') ?>:

+
    + +
  • +

    +
    +
    translate('File') ?>:
    +
    +
    getFile() ?>:getLine() ?>
    +
    +
    translate('Message') ?>:
    +
    +
    getMessage() ?>
    +
    +
    translate('Stack trace') ?>:
    +
    +
    getTraceAsString() ?>
    +
    +
    +
  • + getPrevious(); + endwhile; + ?> +
+ + + + +

translate('No Exception available') ?>

+ + + + diff --git a/module/Application/view/layout/layout.phtml b/module/Application/view/layout/layout.phtml new file mode 100644 index 00000000..d5af45f6 --- /dev/null +++ b/module/Application/view/layout/layout.phtml @@ -0,0 +1,57 @@ +doctype(); ?> + + + + + headTitle('ZF2 '. $this->translate('Skeleton Application'))->setSeparator(' - ')->setAutoEscape(false) ?> + + headMeta()->appendName('viewport', 'width=device-width, initial-scale=1.0') ?> + + + headLink(array('rel' => 'shortcut icon', 'type' => 'image/vnd.microsoft.icon', 'href' => $this->basePath() . '/images/favicon.ico')) + ->prependStylesheet($this->basePath() . '/css/bootstrap-responsive.min.css') + ->prependStylesheet($this->basePath() . '/css/style.css') + ->prependStylesheet($this->basePath() . '/css/bootstrap.min.css') ?> + + + headScript()->prependFile($this->basePath() . '/js/html5.js', 'text/javascript', array('conditional' => 'lt IE 9',)) + ->prependFile($this->basePath() . '/js/jquery-1.7.2.min.js') ?> + + + + + + + +
+ + content; ?> + +
+ +
+

© 2005 - 2012 by Zend Technologies Ltd. translate('All rights reserved.') ?>

+
+ +
+ + inlineScript() ?> + + diff --git a/navcontainer.css b/navcontainer.css new file mode 100644 index 00000000..56c1e7d6 --- /dev/null +++ b/navcontainer.css @@ -0,0 +1,121 @@ +/*In order to make it work in IE we need to load also */ +/* */ +#navcontainer { +/* background:url(../images/menu_bg.jpg); */ +} + +#navcontainer ul { + padding: 0; + margin: 0; + list-style: none; + overflow: visible; + z-index: 5; +} + +#navcontainer a { + display:block; +/* color:#000000; */ + text-align:center; + text-decoration: none; + font-size: 10pt; /*12px = 9pt*/ + width: 90px; + height: 51px; + padding-top:20px; + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; +/* background: yellow; */ +} + +#navcontainer a:visited { +/* color:#000000; */ +} + +#navcontainer a:hover { +/* background:green url(../images/menu-bg-hvr.gif) no-repeat scroll 0 0; */ +/* background: transparent url("../images/nav_center_hover.png") repeat-x scroll 0 0; */ + background: white url("../images/nav_center_hover.png") repeat-x scroll 0 0; + color:#954a04; +} + +/* Active Menus */ +ul li.active a{ +/* color:#000; */ +} + +ul li.active a:visited { +/* color:#000; */ +} + +ul li.active a:hover { +/* color:#000; */ +} + +/*If we need different settings for the pop-up menus*/ +#navcontainer li ul a { + display:block; +/* color:#000000; */ + text-align:center; + text-decoration: none; + font-size: 10pt; + width: 120px; /* auto; */ + height: 30px; /* auto; */ + padding-top:15px; + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; +/* border-top: 1px solid #aaaaaa; */ + border-bottom: 1px solid #aaaaaa; + background: #eeeeee; /* Here you change the background color of the popup menu*/ +} + +#navcontainer li ul a:visited { +/* color:#000000; */ +} + +#navcontainer li ul a:hover { + background:#aaaaaa; /* url(../images/menu-bg-hvr.gif); */ + color:#954a04; +} +/* End of popup menu*/ + +/* this makes the menu to become horizontal */ +#navcontainer li { + float: left; + width: 95px; +} + +/* for the next level we move it to the right "indent" Controls how far right are the next menus +Bigger number more right +the longest situation was margin: -1em 0 0 8em; - it was working for ALL LEVELS PERFECT +-2.2em 0 0 8em; the first number controls the vertila position bigger negative numbers higher will be the next level +*/ +#navcontainer li ul { /* the first number moves the second level up verticaly and down, thest number moves left right horizontaly*/ + margin: -0.8em 0 0 0; + } +#navcontainer li ul ul { + margin: -2.5em 0 0 8.5em; + } +#navcontainer li ul ul ul{ + margin: -2.5em 0 0 8.5em; + } + #navcontainer li ul ul ul ul{ + margin: -2.5em 0 0 8.5em; + } + #navcontainer li ul ul ul ul ul{ + margin: -2.5em 0 0 8.5em; + } + +/* We starting to hide them now this moves the lists very far left*/ + #navcontainer li ul { + position: absolute; + width: 10em; + left: -999em; +} + +#navcontainer li:hover ul ul, #navcontainer li:hover ul ul ul, #navcontainer li:hover ul ul ul ul, #navcontainer li.sfhover ul ul, #navcontainer li.sfhover ul ul ul, #navcontainer li.sfhover ul ul ul ul { + left: -999em; +} + +/* this brings the list back Can be done only with one expression + this and the javascript is for IE The java script attaches class sfhover to li*/ +#navcontainer li:hover ul, #navcontainer li li:hover ul, #navcontainer li li li:hover ul, #navcontainer li li li li:hover ul, #navcontainer li.sfhover ul, #navcontainer li li.sfhover ul, #navcontainer li li li.sfhover ul, #navcontainer li li li li.sfhover ul { + left: auto; + z-index: 1000; +} \ No newline at end of file diff --git a/projectContributorsPersonalData/GyunerZeki.php b/projectContributorsPersonalData/GyunerZeki.php new file mode 100644 index 00000000..a19d7246 --- /dev/null +++ b/projectContributorsPersonalData/GyunerZeki.php @@ -0,0 +1,9 @@ + + + PHP Test + + + Hello World Gyuner Zeki!

'; ?> + + + diff --git a/projectContributorsPersonalData/KrasimirTsvetanov.php b/projectContributorsPersonalData/KrasimirTsvetanov.php new file mode 100644 index 00000000..32b6fbbb --- /dev/null +++ b/projectContributorsPersonalData/KrasimirTsvetanov.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Krasimir Tsvetanov! kraseza@gmail.com

'; ?> + + \ No newline at end of file diff --git a/projectContributorsPersonalData/MargaritaKrushkova.php b/projectContributorsPersonalData/MargaritaKrushkova.php new file mode 100644 index 00000000..94a256c6 --- /dev/null +++ b/projectContributorsPersonalData/MargaritaKrushkova.php @@ -0,0 +1,8 @@ + + + PHP Test + + + I am Margarita Krushkova

'; ?> + + \ No newline at end of file diff --git a/projectContributorsPersonalData/MihailKopuschu.php b/projectContributorsPersonalData/MihailKopuschu.php new file mode 100644 index 00000000..435a694d --- /dev/null +++ b/projectContributorsPersonalData/MihailKopuschu.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> + + \ No newline at end of file diff --git a/projectContributorsPersonalData/PetyaStavarova.php b/projectContributorsPersonalData/PetyaStavarova.php new file mode 100644 index 00000000..1e74060a --- /dev/null +++ b/projectContributorsPersonalData/PetyaStavarova.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Petya Stavarova, petyast92@gmail.com

'; ?> + + \ No newline at end of file diff --git a/projectContributorsPersonalData/StoyanCheresharov.php b/projectContributorsPersonalData/StoyanCheresharov.php new file mode 100644 index 00000000..782a3047 --- /dev/null +++ b/projectContributorsPersonalData/StoyanCheresharov.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World Stoyan Cheresharov! cheresharov@hotmail.com

'; ?> + + \ No newline at end of file diff --git a/projectContributorsPersonalData/Todor.php b/projectContributorsPersonalData/Todor.php new file mode 100644 index 00000000..10333db1 --- /dev/null +++ b/projectContributorsPersonalData/Todor.php @@ -0,0 +1,10 @@ + + + PHP Test + + + Hello from Todor

'; ?> + Този проект може да бъде разгледан на адрес: fmi-project-todor.eu01.aws.af.cm + Публично резозитори(форк): git@github.com:asdator/fmi.git + + \ No newline at end of file diff --git a/projectContributorsPersonalData/VasilVasilev.php b/projectContributorsPersonalData/VasilVasilev.php new file mode 100644 index 00000000..0723efb0 --- /dev/null +++ b/projectContributorsPersonalData/VasilVasilev.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Vasil Vasilev vasil.georgiev.34@gmail.com

'; ?> + + \ No newline at end of file diff --git a/projectContributorsPersonalData/VictorAtanassov.php b/projectContributorsPersonalData/VictorAtanassov.php new file mode 100644 index 00000000..917318b1 --- /dev/null +++ b/projectContributorsPersonalData/VictorAtanassov.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello from Victor Atanassov

'; ?> + + \ No newline at end of file diff --git a/projectContributorsPersonalData/ZhelyanGuglev.php b/projectContributorsPersonalData/ZhelyanGuglev.php new file mode 100644 index 00000000..2f73bf32 --- /dev/null +++ b/projectContributorsPersonalData/ZhelyanGuglev.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Zhelyan Guglev!!! E-mail: jelian_g@mail.bg

'; ?> + + diff --git a/projectContributorsPersonalData/martin_manov.php b/projectContributorsPersonalData/martin_manov.php new file mode 100644 index 00000000..ae688f8e --- /dev/null +++ b/projectContributorsPersonalData/martin_manov.php @@ -0,0 +1,14 @@ + + + PHP Test + + + Martin Manov - matrixatp.martin@gmail.com

+ Здравейте, + имах малко проблеми с изпращането до GitHub. + Първо трябваше да отида до Git->Merge. След това Commit продължаваше да не работи, но успешно направих Push. + Дано това да може да помогне на останалите, ако има затруднения. + Поздрави + '; ?> + + \ No newline at end of file diff --git a/projectContributorsPersonalData/paolashumanova.php b/projectContributorsPersonalData/paolashumanova.php new file mode 100644 index 00000000..60b55c81 --- /dev/null +++ b/projectContributorsPersonalData/paolashumanova.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Paola Shumanova email: paolaaa7@abv.bg

'; ?> + + \ No newline at end of file diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 00000000..10d71d77 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,7 @@ +RewriteEngine On +RewriteCond %{REQUEST_FILENAME} -s [OR] +RewriteCond %{REQUEST_FILENAME} -l [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteBase /fmi +RewriteRule ^.*$ - [NC,L] +RewriteRule ^.*$ index.php [NC,L] diff --git a/public/css/bootstrap-responsive.min.css b/public/css/bootstrap-responsive.min.css new file mode 100644 index 00000000..bc3f2ab7 --- /dev/null +++ b/public/css/bootstrap-responsive.min.css @@ -0,0 +1,3 @@ + +.hidden{display:none;visibility:hidden;} +@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:768px){.container{width:auto;padding:0 20px;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;}}@media (min-width:768px) and (max-width:980px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .span1{width:42px;} .span2{width:104px;} .span3{width:166px;} .span4{width:228px;} .span5{width:290px;} .span6{width:352px;} .span7{width:414px;} .span8{width:476px;} .span9{width:538px;} .span10{width:600px;} .span11{width:662px;} .span12,.container{width:724px;} .offset1{margin-left:82px;} .offset2{margin-left:144px;} .offset3{margin-left:206px;} .offset4{margin-left:268px;} .offset5{margin-left:330px;} .offset6{margin-left:392px;} .offset7{margin-left:454px;} .offset8{margin-left:516px;} .offset9{margin-left:578px;} .offset10{margin-left:640px;} .offset11{margin-left:702px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.801104972%;} .row-fluid .span2{width:14.364640883%;} .row-fluid .span3{width:22.928176794%;} .row-fluid .span4{width:31.491712705%;} .row-fluid .span5{width:40.055248616%;} .row-fluid .span6{width:48.618784527%;} .row-fluid .span7{width:57.182320438000005%;} .row-fluid .span8{width:65.74585634900001%;} .row-fluid .span9{width:74.30939226%;} .row-fluid .span10{width:82.87292817100001%;} .row-fluid .span11{width:91.436464082%;} .row-fluid .span12{width:99.999999993%;} input.span1,textarea.span1,.uneditable-input.span1{width:32px;} input.span2,textarea.span2,.uneditable-input.span2{width:94px;} input.span3,textarea.span3,.uneditable-input.span3{width:156px;} input.span4,textarea.span4,.uneditable-input.span4{width:218px;} input.span5,textarea.span5,.uneditable-input.span5{width:280px;} input.span6,textarea.span6,.uneditable-input.span6{width:342px;} input.span7,textarea.span7,.uneditable-input.span7{width:404px;} input.span8,textarea.span8,.uneditable-input.span8{width:466px;} input.span9,textarea.span9,.uneditable-input.span9{width:528px;} input.span10,textarea.span10,.uneditable-input.span10{width:590px;} input.span11,textarea.span11,.uneditable-input.span11{width:652px;} input.span12,textarea.span12,.uneditable-input.span12{width:714px;}}@media (max-width:980px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .span1{width:70px;} .span2{width:170px;} .span3{width:270px;} .span4{width:370px;} .span5{width:470px;} .span6{width:570px;} .span7{width:670px;} .span8{width:770px;} .span9{width:870px;} .span10{width:970px;} .span11{width:1070px;} .span12,.container{width:1170px;} .offset1{margin-left:130px;} .offset2{margin-left:230px;} .offset3{margin-left:330px;} .offset4{margin-left:430px;} .offset5{margin-left:530px;} .offset6{margin-left:630px;} .offset7{margin-left:730px;} .offset8{margin-left:830px;} .offset9{margin-left:930px;} .offset10{margin-left:1030px;} .offset11{margin-left:1130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.982905983%;} .row-fluid .span2{width:14.529914530000001%;} .row-fluid .span3{width:23.076923077%;} .row-fluid .span4{width:31.623931624%;} .row-fluid .span5{width:40.170940171000005%;} .row-fluid .span6{width:48.717948718%;} .row-fluid .span7{width:57.264957265%;} .row-fluid .span8{width:65.81196581200001%;} .row-fluid .span9{width:74.358974359%;} .row-fluid .span10{width:82.905982906%;} .row-fluid .span11{width:91.45299145300001%;} .row-fluid .span12{width:100%;} input.span1,textarea.span1,.uneditable-input.span1{width:60px;} input.span2,textarea.span2,.uneditable-input.span2{width:160px;} input.span3,textarea.span3,.uneditable-input.span3{width:260px;} input.span4,textarea.span4,.uneditable-input.span4{width:360px;} input.span5,textarea.span5,.uneditable-input.span5{width:460px;} input.span6,textarea.span6,.uneditable-input.span6{width:560px;} input.span7,textarea.span7,.uneditable-input.span7{width:660px;} input.span8,textarea.span8,.uneditable-input.span8{width:760px;} input.span9,textarea.span9,.uneditable-input.span9{width:860px;} input.span10,textarea.span10,.uneditable-input.span10{width:960px;} input.span11,textarea.span11,.uneditable-input.span11{width:1060px;} input.span12,textarea.span12,.uneditable-input.span12{width:1160px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}} diff --git a/public/css/bootstrap.min.css b/public/css/bootstrap.min.css new file mode 100644 index 00000000..b01f92e6 --- /dev/null +++ b/public/css/bootstrap.min.css @@ -0,0 +1,610 @@ +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} +audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} +audio:not([controls]){display:none;} +html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} +a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +a:hover,a:active{outline:0;} +sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} +sup{top:-0.5em;} +sub{bottom:-0.25em;} +img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;} +button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} +button,input{*overflow:visible;line-height:normal;} +button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} +button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} +input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} +input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} +textarea{overflow:auto;vertical-align:top;} +body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;} +a{color:#0088cc;text-decoration:none;} +a:hover{color:#005580;text-decoration:underline;} +.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} +.row:after{clear:both;} +[class*="span"]{float:left;margin-left:20px;} +.span1{width:60px;} +.span2{width:140px;} +.span3{width:220px;} +.span4{width:300px;} +.span5{width:380px;} +.span6{width:460px;} +.span7{width:540px;} +.span8{width:620px;} +.span9{width:700px;} +.span10{width:780px;} +.span11{width:860px;} +.span12,.container{width:940px;} +.offset1{margin-left:100px;} +.offset2{margin-left:180px;} +.offset3{margin-left:260px;} +.offset4{margin-left:340px;} +.offset5{margin-left:420px;} +.offset6{margin-left:500px;} +.offset7{margin-left:580px;} +.offset8{margin-left:660px;} +.offset9{margin-left:740px;} +.offset10{margin-left:820px;} +.offset11{margin-left:900px;} +.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} +.row-fluid:after{clear:both;} +.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;} +.row-fluid>[class*="span"]:first-child{margin-left:0;} +.row-fluid .span1{width:6.382978723%;} +.row-fluid .span2{width:14.89361702%;} +.row-fluid .span3{width:23.404255317%;} +.row-fluid .span4{width:31.914893614%;} +.row-fluid .span5{width:40.425531911%;} +.row-fluid .span6{width:48.93617020799999%;} +.row-fluid .span7{width:57.446808505%;} +.row-fluid .span8{width:65.95744680199999%;} +.row-fluid .span9{width:74.468085099%;} +.row-fluid .span10{width:82.97872339599999%;} +.row-fluid .span11{width:91.489361693%;} +.row-fluid .span12{width:99.99999998999999%;} +.container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";} +.container:after{clear:both;} +.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";} +.container-fluid:after{clear:both;} +p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;} +.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;} +h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;} +h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;} +h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;} +h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;} +h4,h5,h6{line-height:18px;} +h4{font-size:14px;}h4 small{font-size:12px;} +h5{font-size:12px;} +h6{font-size:11px;color:#999999;text-transform:uppercase;} +.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;} +.page-header h1{line-height:1;} +ul,ol{padding:0;margin:0 0 9px 25px;} +ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} +ul{list-style:disc;} +ol{list-style:decimal;} +li{line-height:18px;} +ul.unstyled{margin-left:0;list-style:none;} +dl{margin-bottom:18px;} +dt,dd{line-height:18px;} +dt{font-weight:bold;} +dd{margin-left:9px;} +hr{margin:18px 0;border:0;border-top:1px solid #e5e5e5;border-bottom:1px solid #ffffff;} +strong{font-weight:bold;} +em{font-style:italic;} +.muted{color:#999999;} +abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;} +blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;} +blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} +blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} +q:before,q:after,blockquote:before,blockquote:after{content:"";} +address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;} +small{font-size:100%;} +cite{font-style:normal;} +code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} +pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;}pre.prettyprint{margin-bottom:18px;} +pre code{padding:0;background-color:transparent;} +form{margin:0 0 18px;} +fieldset{padding:0;margin:0;border:0;} +legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;} +label,input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;} +label{display:block;margin-bottom:5px;color:#333333;} +input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.uneditable-textarea{width:auto;height:auto;} +label input,label textarea,label select{display:block;} +input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:0;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +input[type="file"]{padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;} +select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;} +select{width:220px;background-color:#ffffff;} +select[multiple],select[size]{height:auto;} +input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +textarea{height:auto;} +input[type="hidden"]{display:none;} +.radio,.checkbox{padding-left:18px;} +.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;} +.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} +.radio.inline,.checkbox.inline{display:inline-block;margin-bottom:0;vertical-align:middle;} +.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} +.controls>.radio.inline:first-child,.controls>.checkbox.inline:first-child{padding-top:0;} +input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;} +input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;} +input[type="file"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.input-mini{width:60px;} +.input-small{width:90px;} +.input-medium{width:150px;} +.input-large{width:210px;} +.input-xlarge{width:270px;} +.input-xxlarge{width:530px;} +input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;} +input.span1,textarea.span1,.uneditable-input.span1{width:50px;} +input.span2,textarea.span2,.uneditable-input.span2{width:130px;} +input.span3,textarea.span3,.uneditable-input.span3{width:210px;} +input.span4,textarea.span4,.uneditable-input.span4{width:290px;} +input.span5,textarea.span5,.uneditable-input.span5{width:370px;} +input.span6,textarea.span6,.uneditable-input.span6{width:450px;} +input.span7,textarea.span7,.uneditable-input.span7{width:530px;} +input.span8,textarea.span8,.uneditable-input.span8{width:610px;} +input.span9,textarea.span9,.uneditable-input.span9{width:690px;} +input.span10,textarea.span10,.uneditable-input.span10{width:770px;} +input.span11,textarea.span11,.uneditable-input.span11{width:850px;} +input.span12,textarea.span12,.uneditable-input.span12{width:930px;} +input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;} +.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} +.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;} +.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} +.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} +.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;} +.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} +.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} +.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;} +.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} +input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} +.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;} +.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} +:-moz-placeholder{color:#999999;} +::-webkit-input-placeholder{color:#999999;} +.help-block{margin-top:5px;margin-bottom:0;color:#999999;} +.help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;} +.input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";} +.input-prepend:after,.input-append:after{clear:both;} +.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;} +.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;} +.input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;} +.input-prepend .add-on{*margin-top:1px;} +.input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-append .uneditable-input{border-right-color:#ccc;} +.input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;} +.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;} +.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input{display:inline-block;margin-bottom:0;} +.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;} +.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;} +.control-group{margin-bottom:9px;} +.form-horizontal legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;} +.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";} +.form-horizontal .control-group:after{clear:both;} +.form-horizontal .control-group>label{float:left;width:140px;padding-top:5px;text-align:right;} +.form-horizontal .controls{margin-left:160px;} +.form-horizontal .form-actions{padding-left:160px;} +table{max-width:100%;border-collapse:collapse;border-spacing:0;} +.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;border-top:1px solid #ddd;} +.table th{font-weight:bold;vertical-align:bottom;} +.table td{vertical-align:top;} +.table thead:first-child tr th,.table thead:first-child tr td{border-top:0;} +.table tbody+tbody{border-top:2px solid #ddd;} +.table-condensed th,.table-condensed td{padding:4px 5px;} +.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;} +.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} +.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;} +.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;} +.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;} +.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;} +.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} +table .span1{float:none;width:44px;margin-left:0;} +table .span2{float:none;width:124px;margin-left:0;} +table .span3{float:none;width:204px;margin-left:0;} +table .span4{float:none;width:284px;margin-left:0;} +table .span5{float:none;width:364px;margin-left:0;} +table .span6{float:none;width:444px;margin-left:0;} +table .span7{float:none;width:524px;margin-left:0;} +table .span8{float:none;width:604px;margin-left:0;} +table .span9{float:none;width:684px;margin-left:0;} +table .span10{float:none;width:764px;margin-left:0;} +table .span11{float:none;width:844px;margin-left:0;} +table .span12{float:none;width:924px;margin-left:0;} +[class^="icon-"]{display:inline-block;width:14px;height:14px;vertical-align:text-top;background-image:url(../img/glyphicons-halflings.png);background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child{*margin-left:0;} +.icon-white{background-image:url(../img/glyphicons-halflings-white.png);} +.icon-glass{background-position:0 0;} +.icon-music{background-position:-24px 0;} +.icon-search{background-position:-48px 0;} +.icon-envelope{background-position:-72px 0;} +.icon-heart{background-position:-96px 0;} +.icon-star{background-position:-120px 0;} +.icon-star-empty{background-position:-144px 0;} +.icon-user{background-position:-168px 0;} +.icon-film{background-position:-192px 0;} +.icon-th-large{background-position:-216px 0;} +.icon-th{background-position:-240px 0;} +.icon-th-list{background-position:-264px 0;} +.icon-ok{background-position:-288px 0;} +.icon-remove{background-position:-312px 0;} +.icon-zoom-in{background-position:-336px 0;} +.icon-zoom-out{background-position:-360px 0;} +.icon-off{background-position:-384px 0;} +.icon-signal{background-position:-408px 0;} +.icon-cog{background-position:-432px 0;} +.icon-trash{background-position:-456px 0;} +.icon-home{background-position:0 -24px;} +.icon-file{background-position:-24px -24px;} +.icon-time{background-position:-48px -24px;} +.icon-road{background-position:-72px -24px;} +.icon-download-alt{background-position:-96px -24px;} +.icon-download{background-position:-120px -24px;} +.icon-upload{background-position:-144px -24px;} +.icon-inbox{background-position:-168px -24px;} +.icon-play-circle{background-position:-192px -24px;} +.icon-repeat{background-position:-216px -24px;} +.icon-refresh{background-position:-240px -24px;} +.icon-list-alt{background-position:-264px -24px;} +.icon-lock{background-position:-287px -24px;} +.icon-flag{background-position:-312px -24px;} +.icon-headphones{background-position:-336px -24px;} +.icon-volume-off{background-position:-360px -24px;} +.icon-volume-down{background-position:-384px -24px;} +.icon-volume-up{background-position:-408px -24px;} +.icon-qrcode{background-position:-432px -24px;} +.icon-barcode{background-position:-456px -24px;} +.icon-tag{background-position:0 -48px;} +.icon-tags{background-position:-25px -48px;} +.icon-book{background-position:-48px -48px;} +.icon-bookmark{background-position:-72px -48px;} +.icon-print{background-position:-96px -48px;} +.icon-camera{background-position:-120px -48px;} +.icon-font{background-position:-144px -48px;} +.icon-bold{background-position:-167px -48px;} +.icon-italic{background-position:-192px -48px;} +.icon-text-height{background-position:-216px -48px;} +.icon-text-width{background-position:-240px -48px;} +.icon-align-left{background-position:-264px -48px;} +.icon-align-center{background-position:-288px -48px;} +.icon-align-right{background-position:-312px -48px;} +.icon-align-justify{background-position:-336px -48px;} +.icon-list{background-position:-360px -48px;} +.icon-indent-left{background-position:-384px -48px;} +.icon-indent-right{background-position:-408px -48px;} +.icon-facetime-video{background-position:-432px -48px;} +.icon-picture{background-position:-456px -48px;} +.icon-pencil{background-position:0 -72px;} +.icon-map-marker{background-position:-24px -72px;} +.icon-adjust{background-position:-48px -72px;} +.icon-tint{background-position:-72px -72px;} +.icon-edit{background-position:-96px -72px;} +.icon-share{background-position:-120px -72px;} +.icon-check{background-position:-144px -72px;} +.icon-move{background-position:-168px -72px;} +.icon-step-backward{background-position:-192px -72px;} +.icon-fast-backward{background-position:-216px -72px;} +.icon-backward{background-position:-240px -72px;} +.icon-play{background-position:-264px -72px;} +.icon-pause{background-position:-288px -72px;} +.icon-stop{background-position:-312px -72px;} +.icon-forward{background-position:-336px -72px;} +.icon-fast-forward{background-position:-360px -72px;} +.icon-step-forward{background-position:-384px -72px;} +.icon-eject{background-position:-408px -72px;} +.icon-chevron-left{background-position:-432px -72px;} +.icon-chevron-right{background-position:-456px -72px;} +.icon-plus-sign{background-position:0 -96px;} +.icon-minus-sign{background-position:-24px -96px;} +.icon-remove-sign{background-position:-48px -96px;} +.icon-ok-sign{background-position:-72px -96px;} +.icon-question-sign{background-position:-96px -96px;} +.icon-info-sign{background-position:-120px -96px;} +.icon-screenshot{background-position:-144px -96px;} +.icon-remove-circle{background-position:-168px -96px;} +.icon-ok-circle{background-position:-192px -96px;} +.icon-ban-circle{background-position:-216px -96px;} +.icon-arrow-left{background-position:-240px -96px;} +.icon-arrow-right{background-position:-264px -96px;} +.icon-arrow-up{background-position:-289px -96px;} +.icon-arrow-down{background-position:-312px -96px;} +.icon-share-alt{background-position:-336px -96px;} +.icon-resize-full{background-position:-360px -96px;} +.icon-resize-small{background-position:-384px -96px;} +.icon-plus{background-position:-408px -96px;} +.icon-minus{background-position:-433px -96px;} +.icon-asterisk{background-position:-456px -96px;} +.icon-exclamation-sign{background-position:0 -120px;} +.icon-gift{background-position:-24px -120px;} +.icon-leaf{background-position:-48px -120px;} +.icon-fire{background-position:-72px -120px;} +.icon-eye-open{background-position:-96px -120px;} +.icon-eye-close{background-position:-120px -120px;} +.icon-warning-sign{background-position:-144px -120px;} +.icon-plane{background-position:-168px -120px;} +.icon-calendar{background-position:-192px -120px;} +.icon-random{background-position:-216px -120px;} +.icon-comment{background-position:-240px -120px;} +.icon-magnet{background-position:-264px -120px;} +.icon-chevron-up{background-position:-288px -120px;} +.icon-chevron-down{background-position:-313px -119px;} +.icon-retweet{background-position:-336px -120px;} +.icon-shopping-cart{background-position:-360px -120px;} +.icon-folder-close{background-position:-384px -120px;} +.icon-folder-open{background-position:-408px -120px;} +.icon-resize-vertical{background-position:-432px -119px;} +.icon-resize-horizontal{background-position:-456px -118px;} +.dropdown{position:relative;} +.dropdown-toggle{*margin-bottom:-3px;} +.dropdown-toggle:active,.open .dropdown-toggle{outline:0;} +.caret{display:inline-block;width:0;height:0;text-indent:-99999px;*text-indent:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"\2193";} +.dropdown .caret{margin-top:8px;margin-left:2px;} +.dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);} +.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;max-width:220px;_width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.bottom-up{top:auto;bottom:100%;margin-bottom:2px;} +.dropdown-menu .divider{height:1px;margin:5px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;} +.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#555555;white-space:nowrap;} +.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;} +.dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);} +.dropdown.open .dropdown-menu{display:block;} +.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} +.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;} +.collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;} +.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;} +.btn{display:inline-block;padding:4px 10px 4px;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#fafafa;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;*margin-left:.3em;}.btn:first-child{*margin-left:0;} +.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} +.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;color:rgba(0, 0, 0, 0.5);outline:0;} +.btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.btn-large .icon{margin-top:1px;} +.btn-small{padding:5px 9px;font-size:11px;line-height:16px;} +.btn-small .icon{margin-top:-1px;} +.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;} +.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active{color:rgba(255, 255, 255, 0.75);} +.btn-primary{background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-ms-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(top, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0044cc;} +.btn-primary:active,.btn-primary.active{background-color:#003399 \9;} +.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;} +.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} +.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;} +.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} +.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;} +.btn-success:active,.btn-success.active{background-color:#408140 \9;} +.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;} +.btn-info:active,.btn-info.active{background-color:#24748c \9;} +button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} +button.btn.large,input[type="submit"].btn.large{*padding-top:7px;*padding-bottom:7px;} +button.btn.small,input[type="submit"].btn.small{*padding-top:3px;*padding-bottom:3px;} +.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";} +.btn-group:after{clear:both;} +.btn-group:first-child{*margin-left:0;} +.btn-group+.btn-group{margin-left:5px;} +.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;} +.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} +.btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} +.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} +.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;} +.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} +.btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:5px;*padding-bottom:5px;} +.btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);} +.btn .caret{margin-top:7px;margin-left:0;} +.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);} +.btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret{border-top-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);} +.btn-small .caret{margin-top:4px;} +.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.alert,.alert-heading{color:#c09853;} +.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;} +.alert-success{background-color:#dff0d8;border-color:#d6e9c6;} +.alert-success,.alert-success .alert-heading{color:#468847;} +.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;} +.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading{color:#b94a48;} +.alert-info{background-color:#d9edf7;border-color:#bce8f1;} +.alert-info,.alert-info .alert-heading{color:#3a87ad;} +.alert-block{padding-top:14px;padding-bottom:14px;} +.alert-block>p,.alert-block>ul{margin-bottom:0;} +.alert-block p+p{margin-top:5px;} +.nav{margin-left:0;margin-bottom:18px;list-style:none;} +.nav>li>a{display:block;} +.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} +.nav-list{padding-left:14px;padding-right:14px;margin-bottom:0;} +.nav-list>li>a,.nav-list .nav-header{display:block;padding:3px 15px;margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} +.nav-list .nav-header{font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-transform:uppercase;} +.nav-list>li+.nav-header{margin-top:9px;} +.nav-list .active>a,.nav-list .active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} +.nav-list [class^="icon-"]{margin-right:2px;} +.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";} +.nav-tabs:after,.nav-pills:after{clear:both;} +.nav-tabs>li,.nav-pills>li{float:left;} +.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} +.nav-tabs{border-bottom:1px solid #ddd;} +.nav-tabs>li{margin-bottom:-1px;} +.nav-tabs>li>a{padding-top:9px;padding-bottom:9px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} +.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} +.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.nav-pills .active>a,.nav-pills .active>a:hover{color:#ffffff;background-color:#0088cc;} +.nav-stacked>li{float:none;} +.nav-stacked>li>a{margin-right:0;} +.nav-tabs.nav-stacked{border-bottom:0;} +.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} +.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} +.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} +.nav-pills.nav-stacked>li>a{margin-bottom:3px;} +.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} +.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;} +.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;margin-top:6px;} +.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;} +.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;} +.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;} +.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} +.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;opacity:1;filter:alpha(opacity=100);} +.tabs-stacked .open>a:hover{border-color:#999999;} +.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";} +.tabbable:after{clear:both;} +.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;} +.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} +.tab-content>.active,.pill-content>.active{display:block;} +.tabs-below .nav-tabs{border-top:1px solid #ddd;} +.tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;} +.tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} +.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;} +.tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;} +.tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} +.tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} +.tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} +.tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} +.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} +.tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} +.tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} +.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} +.navbar{overflow:visible;margin-bottom:18px;} +.navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);} +.btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;} +.btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;} +.btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} +.btn-navbar .icon-bar+.icon-bar{margin-top:3px;} +.nav-collapse.collapse{height:auto;} +.navbar .brand:hover{text-decoration:none;} +.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;} +.navbar .navbar-text{margin-bottom:0;line-height:40px;color:#999999;}.navbar .navbar-text a:hover{color:#ffffff;background-color:transparent;} +.navbar .btn,.navbar .btn-group{margin-top:5px;} +.navbar .btn-group .btn{margin-top:0;} +.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";} +.navbar-form:after{clear:both;} +.navbar-form input,.navbar-form select{display:inline-block;margin-top:5px;margin-bottom:0;} +.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} +.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} +.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;color:rgba(255, 255, 255, 0.75);background:#666;background:rgba(255, 255, 255, 0.3);border:1px solid #111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query :-moz-placeholder{color:#eeeeee;} +.navbar-search .search-query::-webkit-input-placeholder{color:#eeeeee;} +.navbar-search .search-query:hover{color:#ffffff;background-color:#999999;background-color:rgba(255, 255, 255, 0.5);} +.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} +.navbar-fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030;} +.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} +.navbar .nav.pull-right{float:right;} +.navbar .nav>li{display:block;float:left;} +.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} +.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;} +.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;background-color:rgba(0, 0, 0, 0.5);} +.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;} +.navbar .nav.pull-right{margin-left:10px;margin-right:0;} +.navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} +.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} +.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;} +.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);} +.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;} +.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;} +.navbar .nav.pull-right .dropdown-menu{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before{left:auto;right:12px;} +.navbar .nav.pull-right .dropdown-menu:after{left:auto;right:13px;} +.breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;} +.breadcrumb .divider{padding:0 5px;color:#999999;} +.breadcrumb .active a{color:#333333;} +.pagination{height:36px;margin:18px 0;} +.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} +.pagination li{display:inline;} +.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;} +.pagination a:hover,.pagination .active a{background-color:#f5f5f5;} +.pagination .active a{color:#999999;cursor:default;} +.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;} +.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.pagination-centered{text-align:center;} +.pagination-right{text-align:right;} +.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";} +.pager:after{clear:both;} +.pager li{display:inline;} +.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} +.pager a:hover{text-decoration:none;background-color:#f5f5f5;} +.pager .next a{float:right;} +.pager .previous a{float:left;} +.modal-open .dropdown-menu{z-index:2050;} +.modal-open .dropdown.open{*z-index:2050;} +.modal-open .popover{z-index:2060;} +.modal-open .tooltip{z-index:2070;} +.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} +.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} +.modal{position:fixed;top:50%;left:50%;z-index:1050;max-height:500px;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} +.modal.fade.in{top:50%;} +.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} +.modal-body{padding:15px;} +.modal-footer{padding:14px 15px 15px;margin-bottom:0;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";} +.modal-footer:after{clear:both;} +.modal-footer .btn{float:right;margin-left:5px;margin-bottom:0;} +.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} +.tooltip.top{margin-top:-2px;} +.tooltip.right{margin-left:2px;} +.tooltip.bottom{margin-top:2px;} +.tooltip.left{margin-left:-2px;} +.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.tooltip-arrow{position:absolute;width:0;height:0;} +.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;} +.popover.right{margin-left:5px;} +.popover.bottom{margin-top:5px;} +.popover.left{margin-left:-5px;} +.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.popover .arrow{position:absolute;width:0;height:0;} +.popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);} +.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;} +.popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;} +.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";} +.thumbnails:after{clear:both;} +.thumbnails>li{float:left;margin:0 0 18px 20px;} +.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);} +a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} +.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} +.thumbnail .caption{padding:9px;} +.label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.label-important{background-color:#b94a48;} +.label-warning{background-color:#f89406;} +.label-success{background-color:#468847;} +.label-info{background-color:#3a87ad;} +@-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} +.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} +.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} +.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);} +.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);} +.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);} +.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.accordion{margin-bottom:18px;} +.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.accordion-heading{border-bottom:0;} +.accordion-heading .accordion-toggle{display:block;padding:8px 15px;} +.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} +.carousel{position:relative;margin-bottom:18px;line-height:1;} +.carousel-inner{overflow:hidden;width:100%;position:relative;} +.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;} +.carousel .item>img{display:block;line-height:1;} +.carousel .active,.carousel .next,.carousel .prev{display:block;} +.carousel .active{left:0;} +.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;} +.carousel .next{left:100%;} +.carousel .prev{left:-100%;} +.carousel .next.left,.carousel .prev.right{left:0;} +.carousel .active.left{left:-100%;} +.carousel .active.right{left:100%;} +.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} +.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} +.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);} +.carousel-caption h4,.carousel-caption p{color:#ffffff;} +.hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;} +.hero-unit p{font-size:18px;font-weight:200;line-height:27px;} +.pull-right{float:right;} +.pull-left{float:left;} +.hide{display:none;} +.show{display:block;} +.invisible{visibility:hidden;} diff --git a/public/css/style.css b/public/css/style.css new file mode 100644 index 00000000..28af8659 --- /dev/null +++ b/public/css/style.css @@ -0,0 +1,37 @@ +body { + padding-top: 60px; + padding-bottom: 40px; +} + +.zf-green { + color: #68b604; +} + +.btn-success { + background-color: #57a900; + background-image: -moz-linear-gradient(top, #70d900, #57a900); + background-image: -ms-linear-gradient(top, #70d900, #57a900); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#70d900), to(#57a900)); + background-image: -webkit-linear-gradient(top, #70d900, #57a900); + background-image: -o-linear-gradient(top, #70d900, #57a900); + background-image: linear-gradient(top, #70d900, #57a900); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#70d900', endColorstr='#57a900', GradientType=0); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #57a900; +} + +.btn-success:active, .btn-success.active { + background-color: #57a900; +} + +div.container a.brand { + background: url("../images/zf2-logo.png") no-repeat scroll 0 10px transparent; + margin-left: 0; + padding: 8px 20px 12px 40px; +} diff --git a/public/images/favicon.ico b/public/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..17f119909ffcba66c8a48cba1050d724ab0a51aa GIT binary patch literal 1406 zcmeH{u@S;B3`L(4!_kq77D~2&f)%m@8>CIi3Rxj5&{O4(F&KaWl5ZuLa4BgmpX9H9 z`YL`QaC$|7#dQTcp`$WT2c=`93TJ2EqV#>w00001b5ch_0Itp) z=>Px#24YJ`L;!yP_W%GgN~tse000SaNLh0L04^f{04^f|c%?sf00007bV*G`2iyV+ z0u~zPmpWDe00Lr3L_t(I%azo>i(FL{2k_6yUMCTM712~SHnN3^LXZ#>#6mD{K>q+S zX(BTq2r-aC&_W?)Kx6SHAYz+Fn|-UGg{D#q@kj43WQ(W}QBZutvDmjev$Joqn*)z` zx!n6b_xnBHb7I_-lIg1mkJx`4z((?5a5tV$o(yi!+&@Tx2+;xVFVZx_aXf%ea3pTw zz=& z*KA7NE5{=1(-GdEtJD{D)gIf$xG8VowH+1R9lzF9d;hp8Cvg#v;TN1QJ&Es)a4EB6 zlK#nXw&z@AdSR|r`@17O)2%PzXt!R)mC_@{hd3M|rRdt~`z5`4L;AAE*sb(4E>DKr zcVERJ{Dg0?5({kJiSSaU?AW|pSMAxQrfkZjWC_xn=92RG&mP?K#vF4 za9gH`@MmYF>p7EgOP%X=)!yiw{*-V5$C87=q2#_v)&Aa-_&C;awXWJ1OP6>h_%s*lEe?=BYch#lx|Y3run(); diff --git a/public/js/html5.js b/public/js/html5.js new file mode 100644 index 00000000..6692336c --- /dev/null +++ b/public/js/html5.js @@ -0,0 +1,4 @@ +// iepp v2.1pre @jon_neal & @aFarkas github.com/aFarkas/iepp +// html5shiv @rem remysharp.com/html5-enabling-script +// Dual licensed under the MIT or GPL Version 2 licenses +/*@cc_on(function(a,b){function r(a){var b=-1;while(++b").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
TitleArtist 
escapeHtml($album->title);?>escapeHtml($album->artist);?> + Edit + Delete +
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( +a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f +.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); diff --git a/standard_structure.css b/standard_structure.css new file mode 100644 index 00000000..0c3b59cb --- /dev/null +++ b/standard_structure.css @@ -0,0 +1,7 @@ +@import url("layout.css"); +@import url("navcontainer.css"); +@import url("typography.css"); +/* +@import url("custom.css"); +@import url("tables.css"); +*/ diff --git a/typography.css b/typography.css new file mode 100644 index 00000000..bd09d875 --- /dev/null +++ b/typography.css @@ -0,0 +1,8 @@ +@font-face { + font-family: "Trebuchet MS"; + src: url("../fonts/trebuc.ttf"); +} + +body { + font: normal normal normal 9pt/105% "Trebuchet MS", Arial, Helvetica, sans-serif; /*"Trebuchet MS",*/ +} \ No newline at end of file diff --git a/vendor/.gitignore b/vendor/.gitignore new file mode 100644 index 00000000..4578c85a --- /dev/null +++ b/vendor/.gitignore @@ -0,0 +1,5 @@ +!.gitignore +.composer +composer +zendframework +autoload.php diff --git a/vendor/README.md b/vendor/README.md new file mode 100644 index 00000000..52144c94 --- /dev/null +++ b/vendor/README.md @@ -0,0 +1 @@ +This vendor/ directory is where third-party modules should be installed. diff --git a/vendor/doctrine/common/.gitignore b/vendor/doctrine/common/.gitignore new file mode 100644 index 00000000..fb5e79d6 --- /dev/null +++ b/vendor/doctrine/common/.gitignore @@ -0,0 +1,4 @@ +build/ +logs/ +reports/ +dist/ diff --git a/vendor/doctrine/common/.gitmodules b/vendor/doctrine/common/.gitmodules new file mode 100644 index 00000000..51f08435 --- /dev/null +++ b/vendor/doctrine/common/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/vendor/doctrine-build-common"] + path = lib/vendor/doctrine-build-common + url = git://github.com/doctrine/doctrine-build-common.git diff --git a/vendor/doctrine/common/.travis.yml b/vendor/doctrine/common/.travis.yml new file mode 100644 index 00000000..4464d4f7 --- /dev/null +++ b/vendor/doctrine/common/.travis.yml @@ -0,0 +1,5 @@ +language: php + +php: + - 5.3 + - 5.4 diff --git a/vendor/doctrine/common/LICENSE b/vendor/doctrine/common/LICENSE new file mode 100644 index 00000000..1c03f74b --- /dev/null +++ b/vendor/doctrine/common/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/vendor/doctrine/common/README.md b/vendor/doctrine/common/README.md new file mode 100644 index 00000000..c63f7627 --- /dev/null +++ b/vendor/doctrine/common/README.md @@ -0,0 +1,12 @@ +# Doctrine Common + +[![Build Status](https://secure.travis-ci.org/doctrine/common.png)](http://travis-ci.org/doctrine/common) + +The Doctrine Common project is a library that provides extensions to core PHP functionality. + +## More resources: + +* [Website](http://www.doctrine-project.org) +* [Documentation](http://www.doctrine-project.org/projects/common/current/docs/en) +* [Issue Tracker](http://www.doctrine-project.org/jira/browse/DCOM) +* [Downloads](http://github.com/doctrine/common/downloads) diff --git a/vendor/doctrine/common/UPGRADE_TO_2_1 b/vendor/doctrine/common/UPGRADE_TO_2_1 new file mode 100644 index 00000000..891a2e5c --- /dev/null +++ b/vendor/doctrine/common/UPGRADE_TO_2_1 @@ -0,0 +1,39 @@ +This document details all the possible changes that you should investigate when updating +your project from Doctrine Common 2.0.x to 2.1 + +## AnnotationReader changes + +The annotation reader was heavily refactored between 2.0 and 2.1-RC1. In theory the operation of the new reader should be backwards compatible, but it has to be setup differently to work that way: + + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\'); + // new code necessary starting here + $reader->setIgnoreNotImportedAnnotations(true); + $reader->setEnableParsePhpImports(false); + $reader = new \Doctrine\Common\Annotations\CachedReader( + new \Doctrine\Common\Annotations\IndexedReader($reader), new ArrayCache() + ); + +## Annotation Base class or @Annotation + +Beginning after 2.1-RC2 you have to either extend ``Doctrine\Common\Annotations\Annotation`` or add @Annotation to your annotations class-level docblock, otherwise the class will simply be ignored. + +## Removed methods on AnnotationReader + +* AnnotationReader::setAutoloadAnnotations() +* AnnotationReader::getAutoloadAnnotations() +* AnnotationReader::isAutoloadAnnotations() + +## AnnotationRegistry + +Autoloading through the PHP autoloader is removed from the 2.1 AnnotationReader. Instead you have to use the global AnnotationRegistry for loading purposes: + + \Doctrine\Common\Annotations\AnnotationRegistry::registerFile($fileWithAnnotations); + \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespace($namespace, $dirs = null); + \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespaces($namespaces); + \Doctrine\Common\Annotations\AnnotationRegistry::registerLoader($callable); + +The $callable for registering a loader accepts a class as first and only parameter and must try to silently autoload it. On success true has to be returned. +The registerAutoloadNamespace function registers a PSR-0 compatible silent autoloader for all classes with the given namespace in the given directories. +If null is passed as directory the include path will be used. + diff --git a/vendor/doctrine/common/UPGRADE_TO_2_2 b/vendor/doctrine/common/UPGRADE_TO_2_2 new file mode 100644 index 00000000..1d93a131 --- /dev/null +++ b/vendor/doctrine/common/UPGRADE_TO_2_2 @@ -0,0 +1,61 @@ +This document details all the possible changes that you should investigate when +updating your project from Doctrine Common 2.1 to 2.2: + +## Annotation Changes + +- AnnotationReader::setIgnoreNotImportedAnnotations has been removed, you need to + add ignore annotation names which are supposed to be ignored via + AnnotationReader::addGlobalIgnoredName + +- AnnotationReader::setAutoloadAnnotations was deprecated by the AnnotationRegistry + in 2.1 and has been removed in 2.2 + +- AnnotationReader::setEnableParsePhpImports was added to ease transition to the new + annotation mechanism in 2.1 and is removed in 2.2 + +- AnnotationReader::isParsePhpImportsEnabled is removed (see above) + +- AnnotationReader::setDefaultAnnotationNamespace was deprecated in favor of explicit + configuration in 2.1 and will be removed in 2.2 (for isolated projects where you + have full-control over _all_ available annotations, we offer a dedicated reader + class ``SimpleAnnotationReader``) + +- AnnotationReader::setAnnotationCreationFunction was deprecated in 2.1 and will be + removed in 2.2. We only offer two creation mechanisms which cannot be changed + anymore to allow the same reader instance to work with all annotations regardless + of which library they are coming from. + +- AnnotationReader::setAnnotationNamespaceAlias was deprecated in 2.1 and will be + removed in 2.2 (see setDefaultAnnotationNamespace) + +- If you use a class as annotation which has not the @Annotation marker in it's + class block, we will now throw an exception instead of silently ignoring it. You + can however still achieve the previous behavior using the @IgnoreAnnotation, or + AnnotationReader::addGlobalIgnoredName (the exception message will contain detailed + instructions when you run into this problem). + +## Cache Changes + +- Renamed old AbstractCache to CacheProvider + +- Dropped the support to the following functions of all cache providers: + + - CacheProvider::deleteByWildcard + + - CacheProvider::deleteByRegEx + + - CacheProvider::deleteByPrefix + + - CacheProvider::deleteBySuffix + +- CacheProvider::deleteAll will not remove ALL entries, it will only mark them as invalid + +- CacheProvider::flushAll will remove ALL entries, namespaced or not + +- Added support to MemcachedCache + +- Added support to WincacheCache + +## ClassLoader Changes + +- ClassLoader::fileExistsInIncludePath() no longer exists. Use the native stream_resolve_include_path() PHP function \ No newline at end of file diff --git a/vendor/doctrine/common/build.properties b/vendor/doctrine/common/build.properties new file mode 100644 index 00000000..ff311a45 --- /dev/null +++ b/vendor/doctrine/common/build.properties @@ -0,0 +1,6 @@ +# Project Name +project.name=DoctrineCommon + +# Version class and file +project.version_class = Doctrine\Common\Version +project.version_file = lib/Doctrine/Common/Version.php diff --git a/vendor/doctrine/common/build.xml b/vendor/doctrine/common/build.xml new file mode 100644 index 00000000..71a9a500 --- /dev/null +++ b/vendor/doctrine/common/build.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DoctrineCommon + Doctrine Common PHP Extensions + pear.doctrine-project.org + The Doctrine Common package contains shared code between the other packages. + + + + + LGPL + + + - + + + + + + + diff --git a/vendor/doctrine/common/composer.json b/vendor/doctrine/common/composer.json new file mode 100644 index 00000000..f995f6c6 --- /dev/null +++ b/vendor/doctrine/common/composer.json @@ -0,0 +1,21 @@ +{ + "name": "doctrine/common", + "type": "library","version":"2.2.3", + "description": "Common Library for Doctrine projects", + "keywords": ["collections", "spl", "eventmanager", "annotations", "persistence"], + "homepage": "http://www.doctrine-project.org", + "license": "LGPL", + "authors": [ + {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"}, + {"name": "Roman Borschel", "email": "roman@code-factory.org"}, + {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"}, + {"name": "Jonathan Wage", "email": "jonwage@gmail.com"}, + {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"} + ], + "require": { + "php": ">=5.3.2" + }, + "autoload": { + "psr-0": { "Doctrine\\Common": "lib/" } + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php new file mode 100644 index 00000000..62512522 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php @@ -0,0 +1,75 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Annotations class + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class Annotation +{ + /** + * Value property. Common among all derived classes. + * + * @var string + */ + public $value; + + /** + * Constructor + * + * @param array $data Key-value for properties to be defined in this class + */ + public final function __construct(array $data) + { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + /** + * Error handler for unknown property accessor in Annotation class. + * + * @param string $name Unknown property name + */ + public function __get($name) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } + + /** + * Error handler for unknown property mutator in Annotation class. + * + * @param string $name Unkown property name + * @param mixed $value Property value + */ + public function __set($name, $value) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php new file mode 100644 index 00000000..21597b14 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php @@ -0,0 +1,47 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the attribute type during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attribute +{ + /** + * @var string + */ + public $name; + + /** + * @var string + */ + public $type; + + /** + * @var boolean + */ + public $required = false; +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php new file mode 100644 index 00000000..6e314be4 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php @@ -0,0 +1,37 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the types of all declared attributes during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attributes +{ + /** + * @var array + */ + public $value; +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php new file mode 100644 index 00000000..1b2b20ac --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php @@ -0,0 +1,44 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser to ignore specific + * annotations during the parsing process. + * + * @Annotation + * @author Johannes M. Schmitt + */ +final class IgnoreAnnotation +{ + public $names; + + public function __construct(array $values) + { + if (is_string($values['value'])) { + $values['value'] = array($values['value']); + } + if (!is_array($values['value'])) { + throw new \RuntimeException(sprintf('@IgnoreAnnotation expects either a string name, or an array of strings, but got %s.', json_encode($values['value']))); + } + + $this->names = $values['value']; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php new file mode 100644 index 00000000..7b89a022 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php @@ -0,0 +1,33 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check if that attribute is required during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Required +{ +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php new file mode 100644 index 00000000..c41896ad --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php @@ -0,0 +1,105 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the annotation target during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Target +{ + const TARGET_CLASS = 1; + const TARGET_METHOD = 2; + const TARGET_PROPERTY = 4; + const TARGET_ANNOTATION = 8; + const TARGET_ALL = 15; + + /** + * @var array + */ + private static $map = array( + 'ALL' => self::TARGET_ALL, + 'CLASS' => self::TARGET_CLASS, + 'METHOD' => self::TARGET_METHOD, + 'PROPERTY' => self::TARGET_PROPERTY, + 'ANNOTATION' => self::TARGET_ANNOTATION, + ); + + /** + * @var array + */ + public $value; + + /** + * Targets as bitmask. + * + * @var integer + */ + public $targets; + + /** + * Literal target declaration. + * + * @var integer + */ + public $literal; + + /** + * Annotation construct + * + * @param array $values + */ + public function __construct(array $values) + { + if (!isset($values['value'])){ + $values['value'] = null; + } + if (is_string($values['value'])){ + $values['value'] = array($values['value']); + } + if (!is_array($values['value'])){ + throw new \InvalidArgumentException( + sprintf('@Target expects either a string value, or an array of strings, "%s" given.', + is_object($values['value']) ? get_class($values['value']) : gettype($values['value']) + ) + ); + } + + $bitmask = 0; + foreach ($values['value'] as $literal) { + if(!isset(self::$map[$literal])){ + throw new \InvalidArgumentException( + sprintf('Invalid Target "%s". Available targets: [%s]', + $literal, implode(', ', array_keys(self::$map))) + ); + } + $bitmask += self::$map[$literal]; + } + + $this->targets = $bitmask; + $this->value = $values['value']; + $this->literal = implode(', ', $this->value); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php new file mode 100644 index 00000000..fdc1913a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php @@ -0,0 +1,111 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Description of AnnotationException + * + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class AnnotationException extends \Exception +{ + /** + * Creates a new AnnotationException describing a Syntax error. + * + * @param string $message Exception message + * @return AnnotationException + */ + public static function syntaxError($message) + { + return new self('[Syntax Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing a Semantical error. + * + * @param string $message Exception message + * @return AnnotationException + */ + public static function semanticalError($message) + { + return new self('[Semantical Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing an error which occurred during + * the creation of the annotation. + * + * @since 2.2 + * @param string $message + * @return AnnotationException + */ + public static function creationError($message) + { + return new self('[Creation Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing an type error of an attribute. + * + * @since 2.2 + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * @param mixed $actual + * @return AnnotationException + */ + public static function typeError($attributeName, $annotationName, $context, $expected, $actual) + { + return new self(sprintf( + '[Type Error] Attribute "%s" of @%s declared on %s expects %s, but got %s.', + $attributeName, + $annotationName, + $context, + $expected, + is_object($actual) ? 'an instance of '.get_class($actual) : gettype($actual) + )); + } + + /** + * Creates a new AnnotationException describing an required error of an attribute. + * + * @since 2.2 + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * @return AnnotationException + */ + public static function requiredError($attributeName, $annotationName, $context, $expected) + { + return new self(sprintf( + '[Type Error] Attribute "%s" of @%s declared on %s expects %s. This value should not be null.', + $attributeName, + $annotationName, + $context, + $expected + )); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php new file mode 100644 index 00000000..be87728b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php @@ -0,0 +1,303 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\IgnoreAnnotation; +use Doctrine\Common\Annotations\Annotation\Target; +use Closure; +use ReflectionClass; +use ReflectionMethod; +use ReflectionProperty; + +/** + * A reader for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +final class AnnotationReader implements Reader +{ + /** + * Global map for imports. + * + * @var array + */ + private static $globalImports = array( + 'ignoreannotation' => 'Doctrine\Common\Annotations\Annotation\IgnoreAnnotation', + ); + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names are case sensitive. + * + * @var array + */ + private static $globalIgnoredNames = array( + 'access'=> true, 'author'=> true, 'copyright'=> true, 'deprecated'=> true, + 'example'=> true, 'ignore'=> true, 'internal'=> true, 'link'=> true, 'see'=> true, + 'since'=> true, 'tutorial'=> true, 'version'=> true, 'package'=> true, + 'subpackage'=> true, 'name'=> true, 'global'=> true, 'param'=> true, + 'return'=> true, 'staticvar'=> true, 'category'=> true, 'staticVar'=> true, + 'static'=> true, 'var'=> true, 'throws'=> true, 'inheritdoc'=> true, + 'inheritDoc'=> true, 'license'=> true, 'todo'=> true, 'deprecated'=> true, + 'deprec'=> true, 'author'=> true, 'property' => true, 'method' => true, + 'abstract'=> true, 'exception'=> true, 'magic' => true, 'api' => true, + 'final'=> true, 'filesource'=> true, 'throw' => true, 'uses' => true, + 'usedby'=> true, 'private' => true, 'Annotation' => true, 'override' => true, + 'codeCoverageIgnore' => true, 'codeCoverageIgnoreStart' => true, 'codeCoverageIgnoreEnd' => true, + 'Required' => true, 'Attribute' => true, 'Attributes' => true, + 'Target' => true, 'SuppressWarnings' => true, + 'ingroup' => true, 'code' => true, 'endcode' => true, + 'package_version' => true, + ); + + /** + * Add a new annotation to the globally ignored annotation names with regard to exception handling. + * + * @param string $name + */ + static public function addGlobalIgnoredName($name) + { + self::$globalIgnoredNames[$name] = true; + } + + /** + * Annotations Parser + * + * @var Doctrine\Common\Annotations\DocParser + */ + private $parser; + + /** + * Annotations Parser used to collect parsing metadata + * + * @var Doctrine\Common\Annotations\DocParser + */ + private $preParser; + + /** + * PHP Parser used to collect imports. + * + * @var Doctrine\Common\Annotations\PhpParser + */ + private $phpParser; + + /** + * In-memory cache mechanism to store imported annotations per class. + * + * @var array + */ + private $imports = array(); + + /** + * In-memory cache mechanism to store ignored annotations per class. + * + * @var array + */ + private $ignoredAnnotationNames = array(); + + /** + * Constructor. + * + * Initializes a new AnnotationReader. + */ + public function __construct() + { + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/IgnoreAnnotation.php'); + + $this->parser = new DocParser; + + $this->preParser = new DocParser; + $this->preParser->setImports(self::$globalImports); + $this->preParser->setIgnoreNotImportedAnnotations(true); + + $this->phpParser = new PhpParser; + } + + /** + * Gets the annotations applied to a class. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @return array An array of Annotations. + */ + public function getClassAnnotations(ReflectionClass $class) + { + $this->parser->setTarget(Target::TARGET_CLASS); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($class->getDocComment(), 'class ' . $class->getName()); + } + + /** + * Gets a class annotation. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getClassAnnotation(ReflectionClass $class, $annotationName) + { + $annotations = $this->getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets the annotations applied to a property. + * + * @param ReflectionProperty $property The ReflectionProperty of the property + * from which the annotations should be read. + * @return array An array of Annotations. + */ + public function getPropertyAnnotations(ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + $this->parser->setTarget(Target::TARGET_PROPERTY); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($property->getDocComment(), $context); + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets the annotations applied to a method. + * + * @param ReflectionMethod $property The ReflectionMethod of the method from which + * the annotations should be read. + * @return array An array of Annotations. + */ + public function getMethodAnnotations(ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + $this->parser->setTarget(Target::TARGET_METHOD); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($method->getDocComment(), $context); + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Returns the ignored annotations for the given class. + * + * @param ReflectionClass $class + * @return array + */ + private function getIgnoredAnnotationNames(ReflectionClass $class) + { + if (isset($this->ignoredAnnotationNames[$name = $class->getName()])) { + return $this->ignoredAnnotationNames[$name]; + } + $this->collectParsingMetadata($class); + + return $this->ignoredAnnotationNames[$name]; + } + + private function getImports(ReflectionClass $class) + { + if (isset($this->imports[$name = $class->getName()])) { + return $this->imports[$name]; + } + $this->collectParsingMetadata($class); + + return $this->imports[$name]; + } + + /** + * Collects parsing metadata for a given class + * + * @param ReflectionClass $class + */ + private function collectParsingMetadata(ReflectionClass $class) + { + $ignoredAnnotationNames = self::$globalIgnoredNames; + + $annotations = $this->preParser->parse($class->getDocComment(), 'class '.$class->name); + foreach ($annotations as $annotation) { + if ($annotation instanceof IgnoreAnnotation) { + foreach ($annotation->names AS $annot) { + $ignoredAnnotationNames[$annot] = true; + } + } + } + + $name = $class->getName(); + $this->imports[$name] = array_merge( + self::$globalImports, + $this->phpParser->parseClass($class), + array('__NAMESPACE__' => $class->getNamespaceName()) + ); + $this->ignoredAnnotationNames[$name] = $ignoredAnnotationNames; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php new file mode 100644 index 00000000..60b00f51 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php @@ -0,0 +1,129 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +final class AnnotationRegistry +{ + /** + * A map of namespaces to use for autoloading purposes based on a PSR-0 convention. + * + * Contains the namespace as key and an array of directories as value. If the value is NULL + * the include path is used for checking for the corresponding file. + * + * This autoloading mechanism does not utilize the PHP autoloading but implements autoloading on its own. + * + * @var array + */ + static private $autoloadNamespaces = array(); + + /** + * A map of autoloader callables. + * + * @var array + */ + static private $loaders = array(); + + static public function reset() + { + self::$autoloadNamespaces = array(); + self::$loaders = array(); + } + + static public function registerFile($file) + { + require_once $file; + } + + /** + * Add a namespace with one or many directories to look for files or null for the include path. + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param string $namespace + * @param string|array|null $dirs + */ + static public function registerAutoloadNamespace($namespace, $dirs = null) + { + self::$autoloadNamespaces[$namespace] = $dirs; + } + + /** + * Register multiple namespaces + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param array $namespaces + */ + static public function registerAutoloadNamespaces(array $namespaces) + { + self::$autoloadNamespaces = array_merge(self::$autoloadNamespaces, $namespaces); + } + + /** + * Register an autoloading callabale for annotations, much like spl_autoload_register(). + * + * NOTE: These class loaders HAVE to be silent when a class was not found! + * IMPORTANT: Loaders have to return true if they loaded a class that could contain the searched annotation class. + * + * @param callabale $callabale + */ + static public function registerLoader($callabale) + { + if (!is_callable($callabale)) { + throw new \InvalidArgumentException("A callable is expected in AnnotationRegistry::registerLoader()."); + } + self::$loaders[] = $callabale; + } + + /** + * Autoload an annotation class silently. + * + * @param string $class + * @return void + */ + static public function loadAnnotationClass($class) + { + foreach (self::$autoloadNamespaces AS $namespace => $dirs) { + if (strpos($class, $namespace) === 0) { + $file = str_replace("\\", DIRECTORY_SEPARATOR, $class) . ".php"; + if ($dirs === null) { + if ($path = stream_resolve_include_path($file)) { + require $path; + return true; + } + } else { + foreach((array)$dirs AS $dir) { + if (file_exists($dir . DIRECTORY_SEPARATOR . $file)) { + require $dir . DIRECTORY_SEPARATOR . $file; + return true; + } + } + } + } + } + + foreach (self::$loaders AS $loader) { + if (call_user_func($loader, $class) === true) { + return true; + } + } + return false; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php new file mode 100644 index 00000000..6ea47c6a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php @@ -0,0 +1,179 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Cache\Cache; + +/** + * A cache aware annotation reader. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + */ +final class CachedReader implements Reader +{ + private static $CACHE_SALT = '@[Annot]'; + + /** + * @var Reader + */ + private $delegate; + + /** + * @var Cache + */ + private $cache; + + /** + * @var boolean + */ + private $debug; + + /** + * @var array + */ + private $loadedAnnotations; + + /** + * @param Reader $reader + * @param Cache $cache + */ + public function __construct(Reader $reader, Cache $cache, $debug = false) + { + $this->delegate = $reader; + $this->cache = $cache; + $this->debug = $debug; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $cacheKey = $class->getName() . self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getClassAnnotations($class); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $cacheKey = $class->getName().'$'.$property->getName().self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getPropertyAnnotations($property); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $cacheKey = $class->getName().'#'.$method->getName().self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getMethodAnnotations($method); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = array(); + } + + private function isCacheFresh($cacheKey, \ReflectionClass $class) + { + if (false === $filename = $class->getFilename()) { + return true; + } + + return $this->cache->fetch('[C]'.$cacheKey) >= filemtime($filename); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php new file mode 100644 index 00000000..c6223e36 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php @@ -0,0 +1,140 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Lexer; + +/** + * Simple lexer for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +final class DocLexer extends Lexer +{ + const T_NONE = 1; + const T_IDENTIFIER = 2; + const T_INTEGER = 3; + const T_STRING = 4; + const T_FLOAT = 5; + + const T_AT = 101; + const T_CLOSE_CURLY_BRACES = 102; + const T_CLOSE_PARENTHESIS = 103; + const T_COMMA = 104; + const T_EQUALS = 105; + const T_FALSE = 106; + const T_NAMESPACE_SEPARATOR = 107; + const T_OPEN_CURLY_BRACES = 108; + const T_OPEN_PARENTHESIS = 109; + const T_TRUE = 110; + const T_NULL = 111; + const T_COLON = 112; + + /** + * @inheritdoc + */ + protected function getCatchablePatterns() + { + return array( + '[a-z_][a-z0-9_:]*', + '(?:[+-]?[0-9]+(?:[\.][0-9]+)*)(?:[eE][+-]?[0-9]+)?', + '"(?:[^"]|"")*"', + ); + } + + /** + * @inheritdoc + */ + protected function getNonCatchablePatterns() + { + return array('\s+', '\*+', '(.)'); + } + + /** + * @inheritdoc + */ + protected function getType(&$value) + { + $type = self::T_NONE; + + // Checking numeric value + if (is_numeric($value)) { + return (strpos($value, '.') !== false || stripos($value, 'e') !== false) + ? self::T_FLOAT : self::T_INTEGER; + } + + if ($value[0] === '"') { + $value = str_replace('""', '"', substr($value, 1, strlen($value) - 2)); + + return self::T_STRING; + } else { + switch (strtolower($value)) { + case '@': + return self::T_AT; + + case ',': + return self::T_COMMA; + + case '(': + return self::T_OPEN_PARENTHESIS; + + case ')': + return self::T_CLOSE_PARENTHESIS; + + case '{': + return self::T_OPEN_CURLY_BRACES; + + case '}': + return self::T_CLOSE_CURLY_BRACES; + + case '=': + return self::T_EQUALS; + + case '\\': + return self::T_NAMESPACE_SEPARATOR; + + case 'true': + return self::T_TRUE; + + case 'false': + return self::T_FALSE; + + case 'null': + return self::T_NULL; + + case ':': + return self::T_COLON; + + default: + if (ctype_alpha($value[0]) || $value[0] === '_') { + return self::T_IDENTIFIER; + } + + break; + } + } + + return $type; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php new file mode 100644 index 00000000..9d16b176 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php @@ -0,0 +1,891 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Closure; +use ReflectionClass; +use Doctrine\Common\Annotations\Annotation\Target; +use Doctrine\Common\Annotations\Annotation\Attribute; +use Doctrine\Common\Annotations\Annotation\Attributes; + +/** + * A parser for docblock annotations. + * + * It is strongly discouraged to change the default annotation parsing process. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +final class DocParser +{ + /** + * An array of all valid tokens for a class name. + * + * @var array + */ + private static $classIdentifiers = array(DocLexer::T_IDENTIFIER, DocLexer::T_TRUE, DocLexer::T_FALSE, DocLexer::T_NULL); + + /** + * The lexer. + * + * @var Doctrine\Common\Annotations\DocLexer + */ + private $lexer; + + /** + * Current target context + * + * @var string + */ + private $target; + + /** + * Doc Parser used to collect annotation target + * + * @var Doctrine\Common\Annotations\DocParser + */ + private static $metadataParser; + + /** + * Flag to control if the current annotation is nested or not. + * + * @var boolean + */ + private $isNestedAnnotation = false; + + /** + * Hashmap containing all use-statements that are to be used when parsing + * the given doc block. + * + * @var array + */ + private $imports = array(); + + /** + * This hashmap is used internally to cache results of class_exists() + * look-ups. + * + * @var array + */ + private $classExists = array(); + + /** + * Whether annotations that have not been imported should be ignored. + * + * @var boolean + */ + private $ignoreNotImportedAnnotations = false; + + /** + * An array of default namespaces if operating in simple mode. + * + * @var array + */ + private $namespaces = array(); + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names must be the raw names as used in the class, not the fully qualified + * class names. + * + * @var array + */ + private $ignoredAnnotationNames = array(); + + /** + * @var string + */ + private $context = ''; + + /** + * Hash-map for caching annotation metadata + * @var array + */ + private static $annotationMetadata = array( + 'Doctrine\Common\Annotations\Annotation\Target' => array( + 'is_annotation' => true, + 'has_constructor' => true, + 'properties' => array(), + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'attribute_types' => array( + 'value' => array( + 'required' => false, + 'type' =>'array', + 'array_type'=>'string', + 'value' =>'array' + ) + ), + ), + 'Doctrine\Common\Annotations\Annotation\Attribute' => array( + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_ANNOTATION', + 'targets' => Target::TARGET_ANNOTATION, + 'default_property' => 'name', + 'properties' => array( + 'name' => 'name', + 'type' => 'type', + 'required' => 'required' + ), + 'attribute_types' => array( + 'value' => array( + 'required' => true, + 'type' =>'string', + 'value' =>'string' + ), + 'type' => array( + 'required' =>true, + 'type' =>'string', + 'value' =>'string' + ), + 'required' => array( + 'required' =>false, + 'type' =>'boolean', + 'value' =>'boolean' + ) + ), + ), + 'Doctrine\Common\Annotations\Annotation\Attributes' => array( + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'properties' => array( + 'value' => 'value' + ), + 'attribute_types' => array( + 'value' => array( + 'type' =>'array', + 'required' =>true, + 'array_type'=>'Doctrine\Common\Annotations\Annotation\Attribute', + 'value' =>'array' + ) + ), + ), + ); + + /** + * Hash-map for handle types declaration + * + * @var array + */ + private static $typeMap = array( + 'float' => 'double', + 'bool' => 'boolean', + // allow uppercase Boolean in honor of George Boole + 'Boolean' => 'boolean', + 'int' => 'integer', + ); + + /** + * Constructs a new DocParser. + */ + public function __construct() + { + $this->lexer = new DocLexer; + } + + /** + * Sets the annotation names that are ignored during the parsing process. + * + * The names are supposed to be the raw names as used in the class, not the + * fully qualified class names. + * + * @param array $names + */ + public function setIgnoredAnnotationNames(array $names) + { + $this->ignoredAnnotationNames = $names; + } + + public function setIgnoreNotImportedAnnotations($bool) + { + $this->ignoreNotImportedAnnotations = (Boolean) $bool; + } + + /** + * Sets the default namespaces. + * @param array $namespaces + */ + public function addNamespace($namespace) + { + if ($this->imports) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + $this->namespaces[] = $namespace; + } + + public function setImports(array $imports) + { + if ($this->namespaces) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + $this->imports = $imports; + } + + /** + * Sets current target context as bitmask. + * + * @param integer $target + */ + public function setTarget($target) + { + $this->target = $target; + } + + /** + * Parses the given docblock string for annotations. + * + * @param string $input The docblock string to parse. + * @param string $context The parsing context. + * @return array Array of annotations. If no annotations are found, an empty array is returned. + */ + public function parse($input, $context = '') + { + if (false === $pos = strpos($input, '@')) { + return array(); + } + + // also parse whatever character is before the @ + if ($pos > 0) { + $pos -= 1; + } + + $this->context = $context; + $this->lexer->setInput(trim(substr($input, $pos), '* /')); + $this->lexer->moveNext(); + + return $this->Annotations(); + } + + /** + * Attempts to match the given token with the current lookahead token. + * If they match, updates the lookahead token; otherwise raises a syntax error. + * + * @param int Token type. + * @return bool True if tokens match; false otherwise. + */ + private function match($token) + { + if ( ! $this->lexer->isNextToken($token) ) { + $this->syntaxError($this->lexer->getLiteral($token)); + } + + return $this->lexer->moveNext(); + } + + /** + * Attempts to match the current lookahead token with any of the given tokens. + * + * If any of them matches, this method updates the lookahead token; otherwise + * a syntax error is raised. + * + * @param array $tokens + * @return bool + */ + private function matchAny(array $tokens) + { + if ( ! $this->lexer->isNextTokenAny($tokens)) { + $this->syntaxError(implode(' or ', array_map(array($this->lexer, 'getLiteral'), $tokens))); + } + + return $this->lexer->moveNext(); + } + + /** + * Generates a new syntax error. + * + * @param string $expected Expected string. + * @param array $token Optional token. + * @throws SyntaxException + */ + private function syntaxError($expected, $token = null) + { + if ($token === null) { + $token = $this->lexer->lookahead; + } + + $message = "Expected {$expected}, got "; + + if ($this->lexer->lookahead === null) { + $message .= 'end of string'; + } else { + $message .= "'{$token['value']}' at position {$token['position']}"; + } + + if (strlen($this->context)) { + $message .= ' in ' . $this->context; + } + + $message .= '.'; + + throw AnnotationException::syntaxError($message); + } + + /** + * Attempt to check if a class exists or not. This never goes through the PHP autoloading mechanism + * but uses the {@link AnnotationRegistry} to load classes. + * + * @param string $fqcn + * @return boolean + */ + private function classExists($fqcn) + { + if (isset($this->classExists[$fqcn])) { + return $this->classExists[$fqcn]; + } + + // first check if the class already exists, maybe loaded through another AnnotationReader + if (class_exists($fqcn, false)) { + return $this->classExists[$fqcn] = true; + } + + // final check, does this class exist? + return $this->classExists[$fqcn] = AnnotationRegistry::loadAnnotationClass($fqcn); + } + + /** + * Collects parsing metadata for a given annotation class + * + * @param string $name The annotation name + */ + private function collectAnnotationMetadata($name) + { + if (self::$metadataParser == null){ + self::$metadataParser = new self(); + self::$metadataParser->setTarget(Target::TARGET_CLASS); + self::$metadataParser->setIgnoreNotImportedAnnotations(true); + self::$metadataParser->setImports(array( + 'target' => 'Doctrine\Common\Annotations\Annotation\Target', + 'attribute' => 'Doctrine\Common\Annotations\Annotation\Attribute', + 'attributes' => 'Doctrine\Common\Annotations\Annotation\Attributes' + )); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Target.php'); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attribute.php'); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attributes.php'); + } + + $class = new \ReflectionClass($name); + $docComment = $class->getDocComment(); + + // Sets default values for annotation metadata + $metadata = array( + 'default_property' => null, + 'has_constructor' => (null !== $constructor = $class->getConstructor()) && $constructor->getNumberOfParameters() > 0, + 'properties' => array(), + 'property_types' => array(), + 'attribute_types' => array(), + 'targets_literal' => null, + 'targets' => Target::TARGET_ALL, + 'is_annotation' => false !== strpos($docComment, '@Annotation'), + ); + + // verify that the class is really meant to be an annotation + if ($metadata['is_annotation']) { + foreach (self::$metadataParser->parse($docComment, 'class @' . $name) as $annotation) { + if ($annotation instanceof Target) { + $metadata['targets'] = $annotation->targets; + $metadata['targets_literal'] = $annotation->literal; + + } elseif ($annotation instanceof Attributes) { + foreach ($annotation->value as $attrib) { + // handle internal type declaration + $type = isset(self::$typeMap[$attrib->type]) ? self::$typeMap[$attrib->type] : $attrib->type; + + // handle the case if the property type is mixed + if ('mixed' !== $type) { + // Checks if the property has array + if (false !== $pos = strpos($type, '<')) { + $arrayType = substr($type, $pos+1, -1); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$attrib->name]['array_type'] = $arrayType; + } + + $metadata['attribute_types'][$attrib->name]['type'] = $type; + $metadata['attribute_types'][$attrib->name]['value'] = $attrib->type; + $metadata['attribute_types'][$attrib->name]['required'] = $attrib->required; + } + } + } + } + + // if not has a constructor will inject values into public properties + if (false === $metadata['has_constructor']) { + // collect all public properties + foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) { + $metadata['properties'][$property->name] = $property->name; + + // checks if the property has @var annotation + if ((false !== $propertyComment = $property->getDocComment()) + && false !== strpos($propertyComment, '@var') + && preg_match('/@var\s+([^\s]+)/',$propertyComment, $matches)) { + // literal type declaration + $value = $matches[1]; + + // handle internal type declaration + $type = isset(self::$typeMap[$value]) ? self::$typeMap[$value] : $value; + + // handle the case if the property type is mixed + if ('mixed' !== $type) { + // Checks if the property has @var array annotation + if (false !== $pos = strpos($type, '<')) { + $arrayType = substr($type, $pos+1, -1); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$property->name]['array_type'] = $arrayType; + } + + $metadata['attribute_types'][$property->name]['type'] = $type; + $metadata['attribute_types'][$property->name]['value'] = $value; + $metadata['attribute_types'][$property->name]['required'] = false !== strpos($propertyComment, '@Required'); + } + } + } + + // choose the first property as default property + $metadata['default_property'] = reset($metadata['properties']); + } + } + + self::$annotationMetadata[$name] = $metadata; + } + + /** + * Annotations ::= Annotation {[ "*" ]* [Annotation]}* + * + * @return array + */ + private function Annotations() + { + $annotations = array(); + + while (null !== $this->lexer->lookahead) { + if (DocLexer::T_AT !== $this->lexer->lookahead['type']) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is preceded by non-catchable pattern + if (null !== $this->lexer->token && $this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value'])) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is followed by either a namespace separator, or + // an identifier token + if ((null === $peek = $this->lexer->glimpse()) + || (DocLexer::T_NAMESPACE_SEPARATOR !== $peek['type'] && !in_array($peek['type'], self::$classIdentifiers, true)) + || $peek['position'] !== $this->lexer->lookahead['position'] + 1) { + $this->lexer->moveNext(); + continue; + } + + $this->isNestedAnnotation = false; + if (false !== $annot = $this->Annotation()) { + $annotations[] = $annot; + } + } + + return $annotations; + } + + /** + * Annotation ::= "@" AnnotationName ["(" [Values] ")"] + * AnnotationName ::= QualifiedName | SimpleName + * QualifiedName ::= NameSpacePart "\" {NameSpacePart "\"}* SimpleName + * NameSpacePart ::= identifier | null | false | true + * SimpleName ::= identifier | null | false | true + * + * @return mixed False if it is not a valid annotation. + */ + private function Annotation() + { + $this->match(DocLexer::T_AT); + + // check if we have an annotation + if ($this->lexer->isNextTokenAny(self::$classIdentifiers)) { + $this->lexer->moveNext(); + $name = $this->lexer->token['value']; + } else if ($this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) { + $name = ''; + } else { + $this->syntaxError('namespace separator or identifier'); + } + + while ($this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value']) && $this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) { + $this->match(DocLexer::T_NAMESPACE_SEPARATOR); + $this->matchAny(self::$classIdentifiers); + $name .= '\\'.$this->lexer->token['value']; + } + + // only process names which are not fully qualified, yet + // fully qualified names must start with a \ + $originalName = $name; + if ('\\' !== $name[0]) { + $alias = (false === $pos = strpos($name, '\\'))? $name : substr($name, 0, $pos); + + $found = false; + if ($this->namespaces) { + foreach ($this->namespaces as $namespace) { + if ($this->classExists($namespace.'\\'.$name)) { + $name = $namespace.'\\'.$name; + $found = true; + break; + } + } + } elseif (isset($this->imports[$loweredAlias = strtolower($alias)])) { + if (false !== $pos) { + $name = $this->imports[$loweredAlias].substr($name, $pos); + } else { + $name = $this->imports[$loweredAlias]; + } + $found = true; + } elseif (isset($this->imports['__NAMESPACE__']) && $this->classExists($this->imports['__NAMESPACE__'].'\\'.$name)) { + $name = $this->imports['__NAMESPACE__'].'\\'.$name; + $found = true; + } elseif ($this->classExists($name)) { + $found = true; + } + + if (!$found) { + if ($this->ignoreNotImportedAnnotations || isset($this->ignoredAnnotationNames[$name])) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s was never imported. Did you maybe forget to add a "use" statement for this annotation?', $name, $this->context)); + } + } + + if (!$this->classExists($name)) { + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s does not exist, or could not be auto-loaded.', $name, $this->context)); + } + + // at this point, $name contains the fully qualified class name of the + // annotation, and it is also guaranteed that this class exists, and + // that it is loaded + + + // collects the metadata annotation only if there is not yet + if (!isset(self::$annotationMetadata[$name])) { + $this->collectAnnotationMetadata($name); + } + + // verify that the class is really meant to be an annotation and not just any ordinary class + if (self::$annotationMetadata[$name]['is_annotation'] === false) { + if (isset($this->ignoredAnnotationNames[$originalName])) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The class "%s" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "%s". If it is indeed no annotation, then you need to add @IgnoreAnnotation("%s") to the _class_ doc comment of %s.', $name, $name, $originalName, $this->context)); + } + + //if target is nested annotation + $target = $this->isNestedAnnotation ? Target::TARGET_ANNOTATION : $this->target; + + // Next will be nested + $this->isNestedAnnotation = true; + + //if annotation does not support current target + if (0 === (self::$annotationMetadata[$name]['targets'] & $target) && $target) { + throw AnnotationException::semanticalError( + sprintf('Annotation @%s is not allowed to be declared on %s. You may only use this annotation on these code elements: %s.', + $originalName, $this->context, self::$annotationMetadata[$name]['targets_literal']) + ); + } + + $values = array(); + if ($this->lexer->isNextToken(DocLexer::T_OPEN_PARENTHESIS)) { + $this->match(DocLexer::T_OPEN_PARENTHESIS); + + if ( ! $this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) { + $values = $this->Values(); + } + + $this->match(DocLexer::T_CLOSE_PARENTHESIS); + } + + // checks all declared attributes + foreach (self::$annotationMetadata[$name]['attribute_types'] as $property => $type) { + if ($property === self::$annotationMetadata[$name]['default_property'] + && !isset($values[$property]) && isset($values['value'])) { + $property = 'value'; + } + + // handle a not given attribute or null value + if (!isset($values[$property])) { + if ($type['required']) { + throw AnnotationException::requiredError($property, $originalName, $this->context, 'a(n) '.$type['value']); + } + + continue; + } + + if ($type['type'] === 'array') { + // handle the case of a single value + if (!is_array($values[$property])) { + $values[$property] = array($values[$property]); + } + + // checks if the attribute has array type declaration, such as "array" + if (isset($type['array_type'])) { + foreach ($values[$property] as $item) { + if (gettype($item) !== $type['array_type'] && !$item instanceof $type['array_type']) { + throw AnnotationException::typeError($property, $originalName, $this->context, 'either a(n) '.$type['array_type'].', or an array of '.$type['array_type'].'s', $item); + } + } + } + } elseif (gettype($values[$property]) !== $type['type'] && !$values[$property] instanceof $type['type']) { + throw AnnotationException::typeError($property, $originalName, $this->context, 'a(n) '.$type['value'], $values[$property]); + } + } + + // check if the annotation expects values via the constructor, + // or directly injected into public properties + if (self::$annotationMetadata[$name]['has_constructor'] === true) { + return new $name($values); + } + + $instance = new $name(); + foreach ($values as $property => $value) { + if (!isset(self::$annotationMetadata[$name]['properties'][$property])) { + if ('value' !== $property) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not have a property named "%s". Available properties: %s', $originalName, $this->context, $property, implode(', ', self::$annotationMetadata[$name]['properties']))); + } + + // handle the case if the property has no annotations + if (!$property = self::$annotationMetadata[$name]['default_property']) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not accept any values, but got %s.', $originalName, $this->context, json_encode($values))); + } + } + + $instance->{$property} = $value; + } + + return $instance; + } + + /** + * Values ::= Array | Value {"," Value}* + * + * @return array + */ + private function Values() + { + $values = array(); + + // Handle the case of a single array as value, i.e. @Foo({....}) + if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { + $values['value'] = $this->Value(); + return $values; + } + + $values[] = $this->Value(); + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + $token = $this->lexer->lookahead; + $value = $this->Value(); + + if ( ! is_object($value) && ! is_array($value)) { + $this->syntaxError('Value', $token); + } + + $values[] = $value; + } + + foreach ($values as $k => $value) { + if (is_object($value) && $value instanceof \stdClass) { + $values[$value->name] = $value->value; + } else if ( ! isset($values['value'])){ + $values['value'] = $value; + } else { + if ( ! is_array($values['value'])) { + $values['value'] = array($values['value']); + } + + $values['value'][] = $value; + } + + unset($values[$k]); + } + + return $values; + } + + /** + * Value ::= PlainValue | FieldAssignment + * + * @return mixed + */ + private function Value() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type']) { + return $this->FieldAssignment(); + } + + return $this->PlainValue(); + } + + /** + * PlainValue ::= integer | string | float | boolean | Array | Annotation + * + * @return mixed + */ + private function PlainValue() + { + if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { + return $this->Arrayx(); + } + + if ($this->lexer->isNextToken(DocLexer::T_AT)) { + return $this->Annotation(); + } + + switch ($this->lexer->lookahead['type']) { + case DocLexer::T_STRING: + $this->match(DocLexer::T_STRING); + return $this->lexer->token['value']; + + case DocLexer::T_INTEGER: + $this->match(DocLexer::T_INTEGER); + return (int)$this->lexer->token['value']; + + case DocLexer::T_FLOAT: + $this->match(DocLexer::T_FLOAT); + return (float)$this->lexer->token['value']; + + case DocLexer::T_TRUE: + $this->match(DocLexer::T_TRUE); + return true; + + case DocLexer::T_FALSE: + $this->match(DocLexer::T_FALSE); + return false; + + case DocLexer::T_NULL: + $this->match(DocLexer::T_NULL); + return null; + + default: + $this->syntaxError('PlainValue'); + } + } + + /** + * FieldAssignment ::= FieldName "=" PlainValue + * FieldName ::= identifier + * + * @return array + */ + private function FieldAssignment() + { + $this->match(DocLexer::T_IDENTIFIER); + $fieldName = $this->lexer->token['value']; + + $this->match(DocLexer::T_EQUALS); + + $item = new \stdClass(); + $item->name = $fieldName; + $item->value = $this->PlainValue(); + + return $item; + } + + /** + * Array ::= "{" ArrayEntry {"," ArrayEntry}* [","] "}" + * + * @return array + */ + private function Arrayx() + { + $array = $values = array(); + + $this->match(DocLexer::T_OPEN_CURLY_BRACES); + $values[] = $this->ArrayEntry(); + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + + // optional trailing comma + if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) { + break; + } + + $values[] = $this->ArrayEntry(); + } + + $this->match(DocLexer::T_CLOSE_CURLY_BRACES); + + foreach ($values as $value) { + list ($key, $val) = $value; + + if ($key !== null) { + $array[$key] = $val; + } else { + $array[] = $val; + } + } + + return $array; + } + + /** + * ArrayEntry ::= Value | KeyValuePair + * KeyValuePair ::= Key ("=" | ":") PlainValue + * Key ::= string | integer + * + * @return array + */ + private function ArrayEntry() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type'] + || DocLexer::T_COLON === $peek['type']) { + $this->matchAny(array(DocLexer::T_INTEGER, DocLexer::T_STRING)); + + $key = $this->lexer->token['value']; + $this->matchAny(array(DocLexer::T_EQUALS, DocLexer::T_COLON)); + + return array($key, $this->PlainValue()); + } + + return array(null, $this->Value()); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php new file mode 100644 index 00000000..4a42b583 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php @@ -0,0 +1,209 @@ +. + */ + +namespace Doctrine\Common\Annotations; + + +/** + * File cache reader for annotations. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + */ +class FileCacheReader implements Reader +{ + /** + * @var Reader + */ + private $reader; + private $dir; + private $debug; + private $loadedAnnotations = array(); + + public function __construct(Reader $reader, $cacheDir, $debug = false) + { + $this->reader = $reader; + if (!is_dir($cacheDir) && !@mkdir($cacheDir, 0777, true)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist and could not be created.', $cacheDir)); + } + if (!is_writable($cacheDir)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" is not writable. Both, the webserver and the console user need access. You can manage access rights for multiple users with "chmod +a". If your system does not support this, check out the acl package.', $cacheDir)); + } + + $this->dir = rtrim($cacheDir, '\\/'); + $this->debug = $debug; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $key = $class->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + @unlink($path); + + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $key = $class->getName().'$'.$property->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + unlink($path); + + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $key = $class->getName().'#'.$method->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + unlink($path); + + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + private function saveCacheFile($path, $data) + { + file_put_contents($path, 'getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = array(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php new file mode 100644 index 00000000..1eea4921 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php @@ -0,0 +1,94 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Reader; + +/** + * Allows the reader to be used in-place of Doctrine's reader. + * + * @author Johannes M. Schmitt + */ +class IndexedReader implements Reader +{ + private $delegate; + + public function __construct(Reader $reader) + { + $this->delegate = $reader; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $annotations = array(); + foreach ($this->delegate->getClassAnnotations($class) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getClassAnnotation(\ReflectionClass $class, $annotation) + { + return $this->delegate->getClassAnnotation($class, $annotation); + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $annotations = array(); + foreach ($this->delegate->getMethodAnnotations($method) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getMethodAnnotation(\ReflectionMethod $method, $annotation) + { + return $this->delegate->getMethodAnnotation($method, $annotation); + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $annotations = array(); + foreach ($this->delegate->getPropertyAnnotations($property) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getPropertyAnnotation(\ReflectionProperty $property, $annotation) + { + return $this->delegate->getPropertyAnnotation($property, $annotation); + } + + /** + * Proxy all methods to the delegate. + * + * @param type $method + * @param type $args + * @return type + */ + public function __call($method, $args) + { + return call_user_func_array(array($this->delegate, $method), $args); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php new file mode 100644 index 00000000..a14f8f5b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php @@ -0,0 +1,203 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use SplFileObject; + +/** + * Parses a file for namespaces/use/class declarations. + * + * @author Fabien Potencier + * @author Christian Kaps + */ +final class PhpParser +{ + /** + * The token list. + * + * @var array + */ + private $tokens; + + /** + * The number of tokens. + * + * @var int + */ + private $numTokens = 0; + + /** + * The current array pointer. + * + * @var int + */ + private $pointer = 0; + + /** + * Parses a class. + * + * @param \ReflectionClass $class A ReflectionClass object. + * @return array A list with use statements in the form (Alias => FQN). + */ + public function parseClass(\ReflectionClass $class) + { + if (false === $filename = $class->getFilename()) { + return array(); + } + + $content = $this->getFileContent($filename, $class->getStartLine()); + $namespace = str_replace('\\', '\\\\', $class->getNamespaceName()); + $content = preg_replace('/^.*?(\bnamespace\s+' . $namespace . '\s*[;{].*)$/s', '\\1', $content); + $this->tokens = token_get_all('numTokens = count($this->tokens); + $this->pointer = 0; + + $statements = $this->parseUseStatements($class->getNamespaceName()); + + return $statements; + } + + /** + * Get the content of the file right up to the given line number. + * + * @param string $filename The name of the file to load. + * @param int $lineNumber The number of lines to read from file. + * @return string The content of the file. + */ + private function getFileContent($filename, $lineNumber) + { + $content = ''; + $lineCnt = 0; + $file = new SplFileObject($filename); + while(!$file->eof()) { + if ($lineCnt++ == $lineNumber) { + break; + } + + $content .= $file->fgets(); + } + + return $content; + } + + /** + * Gets the next non whitespace and non comment token. + * + * @return array The token if exists, null otherwise. + */ + private function next() + { + for ($i = $this->pointer; $i < $this->numTokens; $i++) { + $this->pointer++; + if ($this->tokens[$i][0] === T_WHITESPACE || + $this->tokens[$i][0] === T_COMMENT || + $this->tokens[$i][0] === T_DOC_COMMENT) { + + continue; + } + + return $this->tokens[$i]; + } + + return null; + } + + /** + * Get all use statements. + * + * @param string $namespaceName The namespace name of the reflected class. + * @return array A list with all found use statements. + */ + private function parseUseStatements($namespaceName) + { + $statements = array(); + while (($token = $this->next())) { + if ($token[0] === T_USE) { + $statements = array_merge($statements, $this->parseUseStatement()); + continue; + } else if ($token[0] !== T_NAMESPACE || $this->parseNamespace() != $namespaceName) { + continue; + } + + // Get fresh array for new namespace. This is to prevent the parser to collect the use statements + // for a previous namespace with the same name. This is the case if a namespace is defined twice + // or if a namespace with the same name is commented out. + $statements = array(); + } + + return $statements; + } + + /** + * Get the namespace name. + * + * @return string The found namespace name. + */ + private function parseNamespace() + { + $namespace = ''; + while (($token = $this->next())){ + if ($token[0] === T_STRING || $token[0] === T_NS_SEPARATOR) { + $namespace .= $token[1]; + } else { + break; + } + } + + return $namespace; + } + + /** + * Parse a single use statement. + * + * @return array A list with all found class names for a use statement. + */ + private function parseUseStatement() + { + $class = ''; + $alias = ''; + $statements = array(); + $explicitAlias = false; + while (($token = $this->next())) { + $isNameToken = $token[0] === T_STRING || $token[0] === T_NS_SEPARATOR; + if (!$explicitAlias && $isNameToken) { + $class .= $token[1]; + $alias = $token[1]; + } else if ($explicitAlias && $isNameToken) { + $alias .= $token[1]; + } else if ($token[0] === T_AS) { + $explicitAlias = true; + $alias = ''; + } else if ($token === ',') { + $statements[strtolower($alias)] = $class; + $class = ''; + $alias = ''; + $explicitAlias = false; + } else if ($token === ';') { + $statements[strtolower($alias)] = $class; + break; + } else { + break; + } + } + + return $statements; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php new file mode 100644 index 00000000..8e85d392 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php @@ -0,0 +1,35 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Interface for annotation readers. + * + * @author Johannes M. Schmitt + */ +interface Reader +{ + function getClassAnnotations(\ReflectionClass $class); + function getClassAnnotation(\ReflectionClass $class, $annotationName); + function getMethodAnnotations(\ReflectionMethod $method); + function getMethodAnnotation(\ReflectionMethod $method, $annotationName); + function getPropertyAnnotations(\ReflectionProperty $property); + function getPropertyAnnotation(\ReflectionProperty $property, $annotationName); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php new file mode 100644 index 00000000..a13c7fa0 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php @@ -0,0 +1,152 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\Target; + +/** + * Simple Annotation Reader. + * + * This annotation reader is intended to be used in projects where you have + * full-control over all annotations that are available. + * + * @since 2.2 + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +class SimpleAnnotationReader implements Reader +{ + /** + * @var DocParser + */ + private $parser; + + /** + * Constructor. + * + * Initializes a new SimpleAnnotationReader. + */ + public function __construct() + { + $this->parser = new DocParser(); + $this->parser->setIgnoreNotImportedAnnotations(true); + } + + /** + * Adds a namespace in which we will look for annotations. + * + * @param string $namespace + */ + public function addNamespace($namespace) + { + $this->parser->addNamespace($namespace); + } + + /** + * Gets the annotations applied to a class. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @return array An array of Annotations. + */ + public function getClassAnnotations(\ReflectionClass $class) + { + return $this->parser->parse($class->getDocComment(), 'class '.$class->getName()); + } + + /** + * Gets the annotations applied to a method. + * + * @param ReflectionMethod $property The ReflectionMethod of the method from which + * the annotations should be read. + * @return array An array of Annotations. + */ + public function getMethodAnnotations(\ReflectionMethod $method) + { + return $this->parser->parse($method->getDocComment(), 'method '.$method->getDeclaringClass()->name.'::'.$method->getName().'()'); + } + + /** + * Gets the annotations applied to a property. + * + * @param ReflectionProperty $property The ReflectionProperty of the property + * from which the annotations should be read. + * @return array An array of Annotations. + */ + public function getPropertyAnnotations(\ReflectionProperty $property) + { + return $this->parser->parse($property->getDocComment(), 'property '.$property->getDeclaringClass()->name.'::$'.$property->getName()); + } + + /** + * Gets a class annotation. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php new file mode 100644 index 00000000..a59296f5 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php @@ -0,0 +1,97 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * APC cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class ApcCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return apc_fetch($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + $found = false; + + apc_fetch($id, $found); + + return $found; + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return (bool) apc_store($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return apc_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return apc_clear_cache() && apc_clear_cache('user'); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = apc_cache_info(); + $sma = apc_sma_info(); + + return array( + Cache::STATS_HITS => $info['num_hits'], + Cache::STATS_MISSES => $info['num_misses'], + Cache::STATS_UPTIME => $info['start_time'], + Cache::STATS_MEMORY_USAGE => $info['mem_size'], + Cache::STATS_MEMORY_AVAILIABLE => $sma['avail_mem'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php new file mode 100644 index 00000000..8a0b982b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php @@ -0,0 +1,96 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Array cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class ArrayCache extends CacheProvider +{ + /** + * @var array $data + */ + private $data = array(); + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return (isset($this->data[$id])) ? $this->data[$id] : false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return isset($this->data[$id]); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + $this->data[$id] = $data; + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + unset($this->data[$id]); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->data = array(); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php new file mode 100644 index 00000000..d303bde4 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php @@ -0,0 +1,102 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Interface for cache drivers. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Fabio B. Silva + */ +interface Cache +{ + const STATS_HITS = 'hits'; + const STATS_MISSES = 'misses'; + const STATS_UPTIME = 'uptime'; + const STATS_MEMORY_USAGE = 'memory_usage'; + const STATS_MEMORY_AVAILIABLE = 'memory_available'; + + /** + * Fetches an entry from the cache. + * + * @param string $id cache id The id of the cache entry to fetch. + * @return string The cached data or FALSE, if no cache entry exists for the given id. + */ + function fetch($id); + + /** + * Test if an entry exists in the cache. + * + * @param string $id cache id The cache id of the entry to check for. + * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. + */ + function contains($id); + + /** + * Puts data into the cache. + * + * @param string $id The cache id. + * @param string $data The cache entry/data. + * @param int $lifeTime The lifetime. If != 0, sets a specific lifetime for this cache entry (0 => infinite lifeTime). + * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. + */ + function save($id, $data, $lifeTime = 0); + + /** + * Deletes a cache entry. + * + * @param string $id cache id + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + function delete($id); + + /** + * Retrieves cached information from data store + * + * The server's statistics array has the following values: + * + * - hits + * Number of keys that have been requested and found present. + * + * - misses + * Number of items that have been requested and not found. + * + * - uptime + * Time that the server is running. + * + * - memory_usage + * Memory used by this server to store items. + * + * - memory_available + * Memory allowed to use for storage. + * + * @since 2.2 + * @var array Associative array with server's statistics if available, NULL otherwise. + */ + function getStats(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php new file mode 100644 index 00000000..fa11fc22 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php @@ -0,0 +1,188 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Base class for cache provider implementations. + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Fabio B. Silva + */ +abstract class CacheProvider implements Cache +{ + const DOCTRINE_NAMESPACE_CACHEKEY = 'DoctrineNamespaceCacheKey[%s]'; + + /** + * @var string The namespace to prefix all cache ids with + */ + private $namespace = ''; + + /** + * Set the namespace to prefix all cache ids with. + * + * @param string $namespace + * @return void + */ + public function setNamespace($namespace) + { + $this->namespace = (string) $namespace; + } + + /** + * Retrieve the namespace that prefixes all cache ids. + * + * @return string + */ + public function getNamespace() + { + return $this->namespace; + } + + /** + * {@inheritdoc} + */ + public function fetch($id) + { + return $this->doFetch($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function contains($id) + { + return $this->doContains($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function save($id, $data, $lifeTime = 0) + { + return $this->doSave($this->getNamespacedId($id), $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + public function delete($id) + { + return $this->doDelete($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function getStats() + { + return $this->doGetStats(); + } + + /** + * Deletes all cache entries. + * + * @return boolean TRUE if the cache entries were successfully flushed, FALSE otherwise. + */ + public function flushAll() + { + return $this->doFlush(); + } + + /** + * Delete all cache entries. + * + * @return boolean TRUE if the cache entries were successfully deleted, FALSE otherwise. + */ + public function deleteAll() + { + $namespaceCacheKey = sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); + $namespaceVersion = ($this->doContains($namespaceCacheKey)) ? $this->doFetch($namespaceCacheKey) : 1; + + return $this->doSave($namespaceCacheKey, $namespaceVersion + 1); + } + + /** + * Prefix the passed id with the configured namespace value + * + * @param string $id The id to namespace + * @return string $id The namespaced id + */ + private function getNamespacedId($id) + { + $namespaceCacheKey = sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); + $namespaceVersion = ($this->doContains($namespaceCacheKey)) ? $this->doFetch($namespaceCacheKey) : 1; + + return sprintf('%s[%s][%s]', $this->namespace, $id, $namespaceVersion); + } + + /** + * Fetches an entry from the cache. + * + * @param string $id cache id The id of the cache entry to fetch. + * @return string The cached data or FALSE, if no cache entry exists for the given id. + */ + abstract protected function doFetch($id); + + /** + * Test if an entry exists in the cache. + * + * @param string $id cache id The cache id of the entry to check for. + * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. + */ + abstract protected function doContains($id); + + /** + * Puts data into the cache. + * + * @param string $id The cache id. + * @param string $data The cache entry/data. + * @param int $lifeTime The lifetime. If != false, sets a specific lifetime for this cache entry (null => infinite lifeTime). + * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. + */ + abstract protected function doSave($id, $data, $lifeTime = false); + + /** + * Deletes a cache entry. + * + * @param string $id cache id + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + abstract protected function doDelete($id); + + /** + * Deletes all cache entries. + * + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + abstract protected function doFlush(); + + /** + * Retrieves cached information from data store + * + * @since 2.2 + * @return array An associative array with server's statistics if available, NULL otherwise. + */ + abstract protected function doGetStats(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php new file mode 100644 index 00000000..dd6d1e31 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php @@ -0,0 +1,121 @@ +. + */ + +namespace Doctrine\Common\Cache; + +use \Memcache; + +/** + * Memcache cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class MemcacheCache extends CacheProvider +{ + /** + * @var Memcache + */ + private $memcache; + + /** + * Sets the memcache instance to use. + * + * @param Memcache $memcache + */ + public function setMemcache(Memcache $memcache) + { + $this->memcache = $memcache; + } + + /** + * Gets the memcache instance used by the cache. + * + * @return Memcache + */ + public function getMemcache() + { + return $this->memcache; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcache->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (bool) $this->memcache->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + return $this->memcache->set($id, $data, 0, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->memcache->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcache->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcache->getStats(); + return array( + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php new file mode 100644 index 00000000..4675fae7 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php @@ -0,0 +1,124 @@ +. + */ + +namespace Doctrine\Common\Cache; + +use \Memcached; + +/** + * Memcached cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class MemcachedCache extends CacheProvider +{ + /** + * @var Memcached + */ + private $memcached; + + /** + * Sets the memcache instance to use. + * + * @param Memcached $memcached + */ + public function setMemcached(Memcached $memcached) + { + $this->memcached = $memcached; + } + + /** + * Gets the memcached instance used by the cache. + * + * @return Memcached + */ + public function getMemcached() + { + return $this->memcached; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcached->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (false !== $this->memcached->get($id)); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + return $this->memcached->set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->memcached->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcached->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcached->getStats(); + $servers = $this->memcached->getServerList(); + $key = $servers[0]['host'] . ':' . $servers[0]['port']; + $stats = $stats[$key]; + return array( + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php new file mode 100644 index 00000000..ed8ca74a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php @@ -0,0 +1,92 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * WinCache cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class WincacheCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return wincache_ucache_get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return wincache_ucache_exists($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return (bool) wincache_ucache_set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return wincache_ucache_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return wincache_ucache_clear(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = wincache_ucache_info(); + $meminfo= wincache_ucache_meminfo(); + return array( + Cache::STATS_HITS => $info['total_hit_count'], + Cache::STATS_MISSES => $info['total_miss_count'], + Cache::STATS_UPTIME => $info['total_cache_uptime'], + Cache::STATS_MEMORY_USAGE => $meminfo['memory_total'], + Cache::STATS_MEMORY_AVAILIABLE => $meminfo['memory_free'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php new file mode 100644 index 00000000..6e22d265 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php @@ -0,0 +1,110 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Xcache cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class XcacheCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->doContains($id) ? unserialize(xcache_get($id)) : false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return xcache_isset($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return xcache_set($id, serialize($data), (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return xcache_unset($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->checkAuthorization(); + + xcache_clear_cache(XC_TYPE_VAR, 0); + + return true; + } + + /** + * Checks that xcache.admin.enable_auth is Off + * + * @throws \BadMethodCallException When xcache.admin.enable_auth is On + * @return void + */ + protected function checkAuthorization() + { + if (ini_get('xcache.admin.enable_auth')) { + throw new \BadMethodCallException('To use all features of \Doctrine\Common\Cache\XcacheCache, you must set "xcache.admin.enable_auth" to "Off" in your php.ini.'); + } + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $this->checkAuthorization(); + + $info = xcache_info(XC_TYPE_VAR, 0); + return array( + Cache::STATS_HITS => $info['hits'], + Cache::STATS_MISSES => $info['misses'], + Cache::STATS_UPTIME => null, + Cache::STATS_MEMORY_USAGE => $info['size'], + Cache::STATS_MEMORY_AVAILIABLE => $info['avail'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php new file mode 100644 index 00000000..4e4dabe7 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php @@ -0,0 +1,84 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Zend Data Cache cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Ralph Schindler + * @author Guilherme Blanco + */ +class ZendDataCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return zend_shm_cache_fetch($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (false !== zend_shm_cache_fetch($id)); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return zend_shm_cache_store($id, $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return zend_shm_cache_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $namespace = $this->getNamespace(); + if (empty($namespace)) { + return zend_shm_cache_clear(); + } + return zend_shm_cache_clear($namespace); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php new file mode 100644 index 00000000..375b0d6b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php @@ -0,0 +1,262 @@ +. + */ + +namespace Doctrine\Common; + +/** + * A ClassLoader is an autoloader for class files that can be + * installed on the SPL autoload stack. It is a class loader that either loads only classes + * of a specific namespace or all namespaces and it is suitable for working together + * with other autoloaders in the SPL autoload stack. + * + * If no include path is configured through the constructor or {@link setIncludePath}, a ClassLoader + * relies on the PHP include_path. + * + * @author Roman Borschel + * @since 2.0 + */ +class ClassLoader +{ + /** + * @var string PHP file extension + */ + protected $fileExtension = '.php'; + + /** + * @var string Current namespace + */ + protected $namespace; + + /** + * @var string Current include path + */ + protected $includePath; + + /** + * @var string PHP namespace separator + */ + protected $namespaceSeparator = '\\'; + + /** + * Creates a new ClassLoader that loads classes of the + * specified namespace from the specified include path. + * + * If no include path is given, the ClassLoader relies on the PHP include_path. + * If neither a namespace nor an include path is given, the ClassLoader will + * be responsible for loading all classes, thereby relying on the PHP include_path. + * + * @param string $ns The namespace of the classes to load. + * @param string $includePath The base include path to use. + */ + public function __construct($ns = null, $includePath = null) + { + $this->namespace = $ns; + $this->includePath = $includePath; + } + + /** + * Sets the namespace separator used by classes in the namespace of this ClassLoader. + * + * @param string $sep The separator to use. + */ + public function setNamespaceSeparator($sep) + { + $this->namespaceSeparator = $sep; + } + + /** + * Gets the namespace separator used by classes in the namespace of this ClassLoader. + * + * @return string + */ + public function getNamespaceSeparator() + { + return $this->namespaceSeparator; + } + + /** + * Sets the base include path for all class files in the namespace of this ClassLoader. + * + * @param string $includePath + */ + public function setIncludePath($includePath) + { + $this->includePath = $includePath; + } + + /** + * Gets the base include path for all class files in the namespace of this ClassLoader. + * + * @return string + */ + public function getIncludePath() + { + return $this->includePath; + } + + /** + * Sets the file extension of class files in the namespace of this ClassLoader. + * + * @param string $fileExtension + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * Gets the file extension of class files in the namespace of this ClassLoader. + * + * @return string + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Registers this ClassLoader on the SPL autoload stack. + */ + public function register() + { + spl_autoload_register(array($this, 'loadClass')); + } + + /** + * Removes this ClassLoader from the SPL autoload stack. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $classname The name of the class to load. + * @return boolean TRUE if the class has been successfully loaded, FALSE otherwise. + */ + public function loadClass($className) + { + if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) { + return false; + } + + require ($this->includePath !== null ? $this->includePath . DIRECTORY_SEPARATOR : '') + . str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) + . $this->fileExtension; + + return true; + } + + /** + * Asks this ClassLoader whether it can potentially load the class (file) with + * the given name. + * + * @param string $className The fully-qualified name of the class. + * @return boolean TRUE if this ClassLoader can load the class, FALSE otherwise. + */ + public function canLoadClass($className) + { + if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) { + return false; + } + + $file = str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) . $this->fileExtension; + + if ($this->includePath !== null) { + return file_exists($this->includePath . DIRECTORY_SEPARATOR . $file); + } + + return (false !== stream_resolve_include_path($file)); + } + + /** + * Checks whether a class with a given name exists. A class "exists" if it is either + * already defined in the current request or if there is an autoloader on the SPL + * autoload stack that is a) responsible for the class in question and b) is able to + * load a class file in which the class definition resides. + * + * If the class is not already defined, each autoloader in the SPL autoload stack + * is asked whether it is able to tell if the class exists. If the autoloader is + * a ClassLoader, {@link canLoadClass} is used, otherwise the autoload + * function of the autoloader is invoked and expected to return a value that + * evaluates to TRUE if the class (file) exists. As soon as one autoloader reports + * that the class exists, TRUE is returned. + * + * Note that, depending on what kinds of autoloaders are installed on the SPL + * autoload stack, the class (file) might already be loaded as a result of checking + * for its existence. This is not the case with a ClassLoader, who separates + * these responsibilities. + * + * @param string $className The fully-qualified name of the class. + * @return boolean TRUE if the class exists as per the definition given above, FALSE otherwise. + */ + public static function classExists($className) + { + if (class_exists($className, false) || interface_exists($className, false)) { + return true; + } + + foreach (spl_autoload_functions() as $loader) { + if (is_array($loader)) { // array(???, ???) + if (is_object($loader[0])) { + if ($loader[0] instanceof ClassLoader) { // array($obj, 'methodName') + if ($loader[0]->canLoadClass($className)) { + return true; + } + } else if ($loader[0]->{$loader[1]}($className)) { + return true; + } + } else if ($loader[0]::$loader[1]($className)) { // array('ClassName', 'methodName') + return true; + } + } else if ($loader instanceof \Closure) { // function($className) {..} + if ($loader($className)) { + return true; + } + } else if (is_string($loader) && $loader($className)) { // "MyClass::loadClass" + return true; + } + } + + return class_exists($className, false) || interface_exists($className, false); + } + + /** + * Gets the ClassLoader from the SPL autoload stack that is responsible + * for (and is able to load) the class with the given name. + * + * @param string $className The name of the class. + * @return The ClassLoader for the class or NULL if no such ClassLoader exists. + */ + public static function getClassLoader($className) + { + foreach (spl_autoload_functions() as $loader) { + if (is_array($loader) + && $loader[0] instanceof ClassLoader + && $loader[0]->canLoadClass($className) + ) { + return $loader[0]; + } + } + + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php new file mode 100644 index 00000000..2a7d4eaf --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php @@ -0,0 +1,447 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Closure, ArrayIterator; + +/** + * An ArrayCollection is a Collection implementation that wraps a regular PHP array. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class ArrayCollection implements Collection +{ + /** + * An array containing the entries of this collection. + * + * @var array + */ + private $_elements; + + /** + * Initializes a new ArrayCollection. + * + * @param array $elements + */ + public function __construct(array $elements = array()) + { + $this->_elements = $elements; + } + + /** + * Gets the PHP array representation of this collection. + * + * @return array The PHP array representation of this collection. + */ + public function toArray() + { + return $this->_elements; + } + + /** + * Sets the internal iterator to the first element in the collection and + * returns this element. + * + * @return mixed + */ + public function first() + { + return reset($this->_elements); + } + + /** + * Sets the internal iterator to the last element in the collection and + * returns this element. + * + * @return mixed + */ + public function last() + { + return end($this->_elements); + } + + /** + * Gets the current key/index at the current internal iterator position. + * + * @return mixed + */ + public function key() + { + return key($this->_elements); + } + + /** + * Moves the internal iterator position to the next element. + * + * @return mixed + */ + public function next() + { + return next($this->_elements); + } + + /** + * Gets the element of the collection at the current internal iterator position. + * + * @return mixed + */ + public function current() + { + return current($this->_elements); + } + + /** + * Removes an element with a specific key/index from the collection. + * + * @param mixed $key + * @return mixed The removed element or NULL, if no element exists for the given key. + */ + public function remove($key) + { + if (isset($this->_elements[$key])) { + $removed = $this->_elements[$key]; + unset($this->_elements[$key]); + + return $removed; + } + + return null; + } + + /** + * Removes the specified element from the collection, if it is found. + * + * @param mixed $element The element to remove. + * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. + */ + public function removeElement($element) + { + $key = array_search($element, $this->_elements, true); + + if ($key !== false) { + unset($this->_elements[$key]); + + return true; + } + + return false; + } + + /** + * ArrayAccess implementation of offsetExists() + * + * @see containsKey() + */ + public function offsetExists($offset) + { + return $this->containsKey($offset); + } + + /** + * ArrayAccess implementation of offsetGet() + * + * @see get() + */ + public function offsetGet($offset) + { + return $this->get($offset); + } + + /** + * ArrayAccess implementation of offsetGet() + * + * @see add() + * @see set() + */ + public function offsetSet($offset, $value) + { + if ( ! isset($offset)) { + return $this->add($value); + } + return $this->set($offset, $value); + } + + /** + * ArrayAccess implementation of offsetUnset() + * + * @see remove() + */ + public function offsetUnset($offset) + { + return $this->remove($offset); + } + + /** + * Checks whether the collection contains a specific key/index. + * + * @param mixed $key The key to check for. + * @return boolean TRUE if the given key/index exists, FALSE otherwise. + */ + public function containsKey($key) + { + return isset($this->_elements[$key]); + } + + /** + * Checks whether the given element is contained in the collection. + * Only element values are compared, not keys. The comparison of two elements + * is strict, that means not only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element + * @return boolean TRUE if the given element is contained in the collection, + * FALSE otherwise. + */ + public function contains($element) + { + foreach ($this->_elements as $collectionElement) { + if ($element === $collectionElement) { + return true; + } + } + + return false; + } + + /** + * Tests for the existance of an element that satisfies the given predicate. + * + * @param Closure $p The predicate. + * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. + */ + public function exists(Closure $p) + { + foreach ($this->_elements as $key => $element) { + if ($p($key, $element)) { + return true; + } + } + return false; + } + + /** + * Searches for a given element and, if found, returns the corresponding key/index + * of that element. The comparison of two elements is strict, that means not + * only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element The element to search for. + * @return mixed The key/index of the element or FALSE if the element was not found. + */ + public function indexOf($element) + { + return array_search($element, $this->_elements, true); + } + + /** + * Gets the element with the given key/index. + * + * @param mixed $key The key. + * @return mixed The element or NULL, if no element exists for the given key. + */ + public function get($key) + { + if (isset($this->_elements[$key])) { + return $this->_elements[$key]; + } + return null; + } + + /** + * Gets all keys/indexes of the collection elements. + * + * @return array + */ + public function getKeys() + { + return array_keys($this->_elements); + } + + /** + * Gets all elements. + * + * @return array + */ + public function getValues() + { + return array_values($this->_elements); + } + + /** + * Returns the number of elements in the collection. + * + * Implementation of the Countable interface. + * + * @return integer The number of elements in the collection. + */ + public function count() + { + return count($this->_elements); + } + + /** + * Adds/sets an element in the collection at the index / with the specified key. + * + * When the collection is a Map this is like put(key,value)/add(key,value). + * When the collection is a List this is like add(position,value). + * + * @param mixed $key + * @param mixed $value + */ + public function set($key, $value) + { + $this->_elements[$key] = $value; + } + + /** + * Adds an element to the collection. + * + * @param mixed $value + * @return boolean Always TRUE. + */ + public function add($value) + { + $this->_elements[] = $value; + return true; + } + + /** + * Checks whether the collection is empty. + * + * Note: This is preferrable over count() == 0. + * + * @return boolean TRUE if the collection is empty, FALSE otherwise. + */ + public function isEmpty() + { + return ! $this->_elements; + } + + /** + * Gets an iterator for iterating over the elements in the collection. + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_elements); + } + + /** + * Applies the given function to each element in the collection and returns + * a new collection with the elements returned by the function. + * + * @param Closure $func + * @return Collection + */ + public function map(Closure $func) + { + return new static(array_map($func, $this->_elements)); + } + + /** + * Returns all the elements of this collection that satisfy the predicate p. + * The order of the elements is preserved. + * + * @param Closure $p The predicate used for filtering. + * @return Collection A collection with the results of the filter operation. + */ + public function filter(Closure $p) + { + return new static(array_filter($this->_elements, $p)); + } + + /** + * Applies the given predicate p to all elements of this collection, + * returning true, if the predicate yields true for all elements. + * + * @param Closure $p The predicate. + * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. + */ + public function forAll(Closure $p) + { + foreach ($this->_elements as $key => $element) { + if ( ! $p($key, $element)) { + return false; + } + } + + return true; + } + + /** + * Partitions this collection in two collections according to a predicate. + * Keys are preserved in the resulting collections. + * + * @param Closure $p The predicate on which to partition. + * @return array An array with two elements. The first element contains the collection + * of elements where the predicate returned TRUE, the second element + * contains the collection of elements where the predicate returned FALSE. + */ + public function partition(Closure $p) + { + $coll1 = $coll2 = array(); + foreach ($this->_elements as $key => $element) { + if ($p($key, $element)) { + $coll1[$key] = $element; + } else { + $coll2[$key] = $element; + } + } + return array(new static($coll1), new static($coll2)); + } + + /** + * Returns a string representation of this object. + * + * @return string + */ + public function __toString() + { + return __CLASS__ . '@' . spl_object_hash($this); + } + + /** + * Clears the collection. + */ + public function clear() + { + $this->_elements = array(); + } + + /** + * Extract a slice of $length elements starting at position $offset from the Collection. + * + * If $length is null it returns all elements from $offset to the end of the Collection. + * Keys have to be preserved by this method. Calling this method will only return the + * selected slice and NOT change the elements contained in the collection slice is called on. + * + * @param int $offset + * @param int $length + * @return array + */ + public function slice($offset, $length = null) + { + return array_slice($this->_elements, $offset, $length, true); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php new file mode 100644 index 00000000..9fca659c --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php @@ -0,0 +1,243 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Closure, Countable, IteratorAggregate, ArrayAccess; + +/** + * The missing (SPL) Collection/Array/OrderedMap interface. + * + * A Collection resembles the nature of a regular PHP array. That is, + * it is essentially an ordered map that can also be used + * like a list. + * + * A Collection has an internal iterator just like a PHP array. In addition, + * a Collection can be iterated with external iterators, which is preferrable. + * To use an external iterator simply use the foreach language construct to + * iterate over the collection (which calls {@link getIterator()} internally) or + * explicitly retrieve an iterator though {@link getIterator()} which can then be + * used to iterate over the collection. + * You can not rely on the internal iterator of the collection being at a certain + * position unless you explicitly positioned it before. Prefer iteration with + * external iterators. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface Collection extends Countable, IteratorAggregate, ArrayAccess +{ + /** + * Adds an element at the end of the collection. + * + * @param mixed $element The element to add. + * @return boolean Always TRUE. + */ + function add($element); + + /** + * Clears the collection, removing all elements. + */ + function clear(); + + /** + * Checks whether an element is contained in the collection. + * This is an O(n) operation, where n is the size of the collection. + * + * @param mixed $element The element to search for. + * @return boolean TRUE if the collection contains the element, FALSE otherwise. + */ + function contains($element); + + /** + * Checks whether the collection is empty (contains no elements). + * + * @return boolean TRUE if the collection is empty, FALSE otherwise. + */ + function isEmpty(); + + /** + * Removes the element at the specified index from the collection. + * + * @param string|integer $key The kex/index of the element to remove. + * @return mixed The removed element or NULL, if the collection did not contain the element. + */ + function remove($key); + + /** + * Removes the specified element from the collection, if it is found. + * + * @param mixed $element The element to remove. + * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. + */ + function removeElement($element); + + /** + * Checks whether the collection contains an element with the specified key/index. + * + * @param string|integer $key The key/index to check for. + * @return boolean TRUE if the collection contains an element with the specified key/index, + * FALSE otherwise. + */ + function containsKey($key); + + /** + * Gets the element at the specified key/index. + * + * @param string|integer $key The key/index of the element to retrieve. + * @return mixed + */ + function get($key); + + /** + * Gets all keys/indices of the collection. + * + * @return array The keys/indices of the collection, in the order of the corresponding + * elements in the collection. + */ + function getKeys(); + + /** + * Gets all values of the collection. + * + * @return array The values of all elements in the collection, in the order they + * appear in the collection. + */ + function getValues(); + + /** + * Sets an element in the collection at the specified key/index. + * + * @param string|integer $key The key/index of the element to set. + * @param mixed $value The element to set. + */ + function set($key, $value); + + /** + * Gets a native PHP array representation of the collection. + * + * @return array + */ + function toArray(); + + /** + * Sets the internal iterator to the first element in the collection and + * returns this element. + * + * @return mixed + */ + function first(); + + /** + * Sets the internal iterator to the last element in the collection and + * returns this element. + * + * @return mixed + */ + function last(); + + /** + * Gets the key/index of the element at the current iterator position. + * + */ + function key(); + + /** + * Gets the element of the collection at the current iterator position. + * + */ + function current(); + + /** + * Moves the internal iterator position to the next element. + * + */ + function next(); + + /** + * Tests for the existence of an element that satisfies the given predicate. + * + * @param Closure $p The predicate. + * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. + */ + function exists(Closure $p); + + /** + * Returns all the elements of this collection that satisfy the predicate p. + * The order of the elements is preserved. + * + * @param Closure $p The predicate used for filtering. + * @return Collection A collection with the results of the filter operation. + */ + function filter(Closure $p); + + /** + * Applies the given predicate p to all elements of this collection, + * returning true, if the predicate yields true for all elements. + * + * @param Closure $p The predicate. + * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. + */ + function forAll(Closure $p); + + /** + * Applies the given function to each element in the collection and returns + * a new collection with the elements returned by the function. + * + * @param Closure $func + * @return Collection + */ + function map(Closure $func); + + /** + * Partitions this collection in two collections according to a predicate. + * Keys are preserved in the resulting collections. + * + * @param Closure $p The predicate on which to partition. + * @return array An array with two elements. The first element contains the collection + * of elements where the predicate returned TRUE, the second element + * contains the collection of elements where the predicate returned FALSE. + */ + function partition(Closure $p); + + /** + * Gets the index/key of a given element. The comparison of two elements is strict, + * that means not only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element The element to search for. + * @return mixed The key/index of the element or FALSE if the element was not found. + */ + function indexOf($element); + + /** + * Extract a slice of $length elements starting at position $offset from the Collection. + * + * If $length is null it returns all elements from $offset to the end of the Collection. + * Keys have to be preserved by this method. Calling this method will only return the + * selected slice and NOT change the elements contained in the collection slice is called on. + * + * @param int $offset + * @param int $length + * @return array + */ + function slice($offset, $length = null); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php new file mode 100644 index 00000000..8c5669be --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php @@ -0,0 +1,28 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Base exception class for package Doctrine\Common + * @author heinrich + * + */ +class CommonException extends \Exception { +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php new file mode 100644 index 00000000..bc95d303 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php @@ -0,0 +1,47 @@ +. + */ + + +namespace Doctrine\Common; + +/** + * Comparable interface that allows to compare two value objects to each other for similarity. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.com + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + */ +interface Comparable +{ + /** + * Compare the current object to the passed $other. + * + * Returns 0 if they are semantically equal, 1 if the other object + * is less than the current one, or -1 if its more than the current one. + * + * This method should not check for identity using ===, only for semantical equality for example + * when two different DateTime instances point to the exact same Date + TZ. + * + * @return int + */ + public function compareTo($other); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php new file mode 100644 index 00000000..6a3c0699 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php @@ -0,0 +1,69 @@ +. + */ + +namespace Doctrine\Common; + +/** + * EventArgs is the base class for classes containing event data. + * + * This class contains no event data. It is used by events that do not pass state + * information to an event handler when an event is raised. The single empty EventArgs + * instance can be obtained through {@link getEmptyInstance}. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class EventArgs +{ + /** + * @var EventArgs Single instance of EventArgs + * @static + */ + private static $_emptyEventArgsInstance; + + /** + * Gets the single, empty and immutable EventArgs instance. + * + * This instance will be used when events are dispatched without any parameter, + * like this: EventManager::dispatchEvent('eventname'); + * + * The benefit from this is that only one empty instance is instantiated and shared + * (otherwise there would be instances for every dispatched in the abovementioned form) + * + * @see EventManager::dispatchEvent + * @link http://msdn.microsoft.com/en-us/library/system.eventargs.aspx + * @static + * @return EventArgs + */ + public static function getEmptyInstance() + { + if ( ! self::$_emptyEventArgsInstance) { + self::$_emptyEventArgsInstance = new EventArgs; + } + + return self::$_emptyEventArgsInstance; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php new file mode 100644 index 00000000..a1f11ed2 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php @@ -0,0 +1,136 @@ +. + */ + +namespace Doctrine\Common; + +/** + * The EventManager is the central point of Doctrine's event listener system. + * Listeners are registered on the manager and events are dispatched through the + * manager. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class EventManager +{ + /** + * Map of registered listeners. + * => + * + * @var array + */ + private $_listeners = array(); + + /** + * Dispatches an event to all registered listeners. + * + * @param string $eventName The name of the event to dispatch. The name of the event is + * the name of the method that is invoked on listeners. + * @param EventArgs $eventArgs The event arguments to pass to the event handlers/listeners. + * If not supplied, the single empty EventArgs instance is used. + * @return boolean + */ + public function dispatchEvent($eventName, EventArgs $eventArgs = null) + { + if (isset($this->_listeners[$eventName])) { + $eventArgs = $eventArgs === null ? EventArgs::getEmptyInstance() : $eventArgs; + + foreach ($this->_listeners[$eventName] as $listener) { + $listener->$eventName($eventArgs); + } + } + } + + /** + * Gets the listeners of a specific event or all listeners. + * + * @param string $event The name of the event. + * @return array The event listeners for the specified event, or all event listeners. + */ + public function getListeners($event = null) + { + return $event ? $this->_listeners[$event] : $this->_listeners; + } + + /** + * Checks whether an event has any registered listeners. + * + * @param string $event + * @return boolean TRUE if the specified event has any listeners, FALSE otherwise. + */ + public function hasListeners($event) + { + return isset($this->_listeners[$event]) && $this->_listeners[$event]; + } + + /** + * Adds an event listener that listens on the specified events. + * + * @param string|array $events The event(s) to listen on. + * @param object $listener The listener object. + */ + public function addEventListener($events, $listener) + { + // Picks the hash code related to that listener + $hash = spl_object_hash($listener); + + foreach ((array) $events as $event) { + // Overrides listener if a previous one was associated already + // Prevents duplicate listeners on same event (same instance only) + $this->_listeners[$event][$hash] = $listener; + } + } + + /** + * Removes an event listener from the specified events. + * + * @param string|array $events + * @param object $listener + */ + public function removeEventListener($events, $listener) + { + // Picks the hash code related to that listener + $hash = spl_object_hash($listener); + + foreach ((array) $events as $event) { + // Check if actually have this listener associated + if (isset($this->_listeners[$event][$hash])) { + unset($this->_listeners[$event][$hash]); + } + } + } + + /** + * Adds an EventSubscriber. The subscriber is asked for all the events he is + * interested in and added as a listener for these events. + * + * @param Doctrine\Common\EventSubscriber $subscriber The subscriber. + */ + public function addEventSubscriber(EventSubscriber $subscriber) + { + $this->addEventListener($subscriber->getSubscribedEvents(), $subscriber); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php new file mode 100644 index 00000000..ed3383fa --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php @@ -0,0 +1,45 @@ +. + */ + +namespace Doctrine\Common; + +/** + * An EventSubscriber knows himself what events he is interested in. + * If an EventSubscriber is added to an EventManager, the manager invokes + * {@link getSubscribedEvents} and registers the subscriber as a listener for all + * returned events. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface EventSubscriber +{ + /** + * Returns an array of events this subscriber wants to listen to. + * + * @return array + */ + function getSubscribedEvents(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php new file mode 100644 index 00000000..8df3b843 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php @@ -0,0 +1,266 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Base class for writing simple lexers, i.e. for creating small DSLs. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @todo Rename: AbstractLexer + */ +abstract class Lexer +{ + /** + * @var array Array of scanned tokens + */ + private $tokens = array(); + + /** + * @var integer Current lexer position in input string + */ + private $position = 0; + + /** + * @var integer Current peek of current lexer position + */ + private $peek = 0; + + /** + * @var array The next token in the input. + */ + public $lookahead; + + /** + * @var array The last matched/seen token. + */ + public $token; + + /** + * Sets the input data to be tokenized. + * + * The Lexer is immediately reset and the new input tokenized. + * Any unprocessed tokens from any previous input are lost. + * + * @param string $input The input to be tokenized. + */ + public function setInput($input) + { + $this->tokens = array(); + $this->reset(); + $this->scan($input); + } + + /** + * Resets the lexer. + */ + public function reset() + { + $this->lookahead = null; + $this->token = null; + $this->peek = 0; + $this->position = 0; + } + + /** + * Resets the peek pointer to 0. + */ + public function resetPeek() + { + $this->peek = 0; + } + + /** + * Resets the lexer position on the input to the given position. + * + * @param integer $position Position to place the lexical scanner + */ + public function resetPosition($position = 0) + { + $this->position = $position; + } + + /** + * Checks whether a given token matches the current lookahead. + * + * @param integer|string $token + * @return boolean + */ + public function isNextToken($token) + { + return null !== $this->lookahead && $this->lookahead['type'] === $token; + } + + /** + * Checks whether any of the given tokens matches the current lookahead + * + * @param array $tokens + * @return boolean + */ + public function isNextTokenAny(array $tokens) + { + return null !== $this->lookahead && in_array($this->lookahead['type'], $tokens, true); + } + + /** + * Moves to the next token in the input string. + * + * A token is an associative array containing three items: + * - 'value' : the string value of the token in the input string + * - 'type' : the type of the token (identifier, numeric, string, input + * parameter, none) + * - 'position' : the position of the token in the input string + * + * @return array|null the next token; null if there is no more tokens left + */ + public function moveNext() + { + $this->peek = 0; + $this->token = $this->lookahead; + $this->lookahead = (isset($this->tokens[$this->position])) + ? $this->tokens[$this->position++] : null; + + return $this->lookahead !== null; + } + + /** + * Tells the lexer to skip input tokens until it sees a token with the given value. + * + * @param $type The token type to skip until. + */ + public function skipUntil($type) + { + while ($this->lookahead !== null && $this->lookahead['type'] !== $type) { + $this->moveNext(); + } + } + + /** + * Checks if given value is identical to the given token + * + * @param mixed $value + * @param integer $token + * @return boolean + */ + public function isA($value, $token) + { + return $this->getType($value) === $token; + } + + /** + * Moves the lookahead token forward. + * + * @return array | null The next token or NULL if there are no more tokens ahead. + */ + public function peek() + { + if (isset($this->tokens[$this->position + $this->peek])) { + return $this->tokens[$this->position + $this->peek++]; + } else { + return null; + } + } + + /** + * Peeks at the next token, returns it and immediately resets the peek. + * + * @return array|null The next token or NULL if there are no more tokens ahead. + */ + public function glimpse() + { + $peek = $this->peek(); + $this->peek = 0; + return $peek; + } + + /** + * Scans the input string for tokens. + * + * @param string $input a query string + */ + protected function scan($input) + { + static $regex; + + if ( ! isset($regex)) { + $regex = '/(' . implode(')|(', $this->getCatchablePatterns()) . ')|' + . implode('|', $this->getNonCatchablePatterns()) . '/i'; + } + + $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE; + $matches = preg_split($regex, $input, -1, $flags); + + foreach ($matches as $match) { + // Must remain before 'value' assignment since it can change content + $type = $this->getType($match[0]); + + $this->tokens[] = array( + 'value' => $match[0], + 'type' => $type, + 'position' => $match[1], + ); + } + } + + /** + * Gets the literal for a given token. + * + * @param integer $token + * @return string + */ + public function getLiteral($token) + { + $className = get_class($this); + $reflClass = new \ReflectionClass($className); + $constants = $reflClass->getConstants(); + + foreach ($constants as $name => $value) { + if ($value === $token) { + return $className . '::' . $name; + } + } + + return $token; + } + + /** + * Lexical catchable patterns. + * + * @return array + */ + abstract protected function getCatchablePatterns(); + + /** + * Lexical non-catchable patterns. + * + * @return array + */ + abstract protected function getNonCatchablePatterns(); + + /** + * Retrieve token type. Also processes the token value if necessary. + * + * @param string $value + * @return integer + */ + abstract protected function getType(&$value); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php new file mode 100644 index 00000000..93e504ae --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php @@ -0,0 +1,45 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Contract for classes that provide the service of notifying listeners of + * changes to their properties. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface NotifyPropertyChanged +{ + /** + * Adds a listener that wants to be notified about property changes. + * + * @param PropertyChangedListener $listener + */ + function addPropertyChangedListener(PropertyChangedListener $listener); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php new file mode 100644 index 00000000..9fff343c --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php @@ -0,0 +1,224 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\ManagerRegistry; + +/** + * Abstract implementation of the ManagerRegistry contract. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +abstract class AbstractManagerRegistry implements ManagerRegistry +{ + private $name; + private $connections; + private $managers; + private $defaultConnection; + private $defaultManager; + private $proxyInterfaceName; + + public function __construct($name, array $connections, array $managers, $defaultConnection, $defaultManager, $proxyInterfaceName) + { + $this->name = $name; + $this->connections = $connections; + $this->managers = $managers; + $this->defaultConnection = $defaultConnection; + $this->defaultManager = $defaultManager; + $this->proxyInterfaceName = $proxyInterfaceName; + } + + /** + * Fetches/creates the given services + * + * A service in this context is connection or a manager instance + * + * @param string $name name of the service + * @return object instance of the given service + */ + abstract protected function getService($name); + + /** + * Resets the given services + * + * A service in this context is connection or a manager instance + * + * @param string $name name of the service + * @return void + */ + abstract protected function resetService($name); + + /** + * Get the name of the registry + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @inheritdoc + */ + public function getConnection($name = null) + { + if (null === $name) { + $name = $this->defaultConnection; + } + + if (!isset($this->connections[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Connection named "%s" does not exist.', $this->name, $name)); + } + + return $this->getService($this->connections[$name]); + } + + /** + * @inheritdoc + */ + public function getConnectionNames() + { + return $this->connections; + } + + /** + * @inheritdoc + */ + public function getConnections() + { + $connections = array(); + foreach ($this->connections as $name => $id) { + $connections[$name] = $this->getService($id); + } + + return $connections; + } + + /** + * @inheritdoc + */ + public function getDefaultConnectionName() + { + return $this->defaultConnection; + } + + /** + * @inheritdoc + */ + public function getDefaultManagerName() + { + return $this->defaultManager; + } + + /** + * @inheritdoc + */ + public function getManager($name = null) + { + if (null === $name) { + $name = $this->defaultManager; + } + + if (!isset($this->managers[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); + } + + return $this->getService($this->managers[$name]); + } + + /** + * @inheritdoc + */ + public function getManagerForClass($class) + { + // Check for namespace alias + if (strpos($class, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $class); + $class = $this->getAliasNamespace($namespaceAlias) . '\\' . $simpleClassName; + } + + $proxyClass = new \ReflectionClass($class); + if ($proxyClass->implementsInterface($this->proxyInterfaceName)) { + $class = $proxyClass->getParentClass()->getName(); + } + + foreach ($this->managers as $id) { + $manager = $this->getService($id); + + if (!$manager->getMetadataFactory()->isTransient($class)) { + return $manager; + } + } + } + + /** + * @inheritdoc + */ + public function getManagerNames() + { + return $this->managers; + } + + /** + * @inheritdoc + */ + public function getManagers() + { + $dms = array(); + foreach ($this->managers as $name => $id) { + $dms[$name] = $this->getService($id); + } + + return $dms; + } + + /** + * @inheritdoc + */ + public function getRepository($persistentObjectName, $persistentManagerName = null) + { + return $this->getManager($persistentManagerName)->getRepository($persistentObjectName); + } + + /** + * @inheritdoc + */ + public function resetManager($name = null) + { + if (null === $name) { + $name = $this->defaultManager; + } + + if (!isset($this->managers[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); + } + + // force the creation of a new document manager + // if the current one is closed + $this->resetService($this->managers[$name]); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php new file mode 100644 index 00000000..a47727fa --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php @@ -0,0 +1,63 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract covering connection for a Doctrine persistence layer ManagerRegistry class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +interface ConnectionRegistry +{ + /** + * Gets the default connection name. + * + * @return string The default connection name + */ + function getDefaultConnectionName(); + + /** + * Gets the named connection. + * + * @param string $name The connection name (null for the default one) + * + * @return Connection + */ + function getConnection($name = null); + + /** + * Gets an array of all registered connections + * + * @return array An array of Connection instances + */ + function getConnections(); + + /** + * Gets all connection names. + * + * @return array An array of connection names + */ + function getConnectionNames(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php new file mode 100644 index 00000000..8055b66d --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php @@ -0,0 +1,77 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs; +use Doctrine\Common\Persistence\ObjectManager; + +/** + * Lifecycle Events are triggered by the UnitOfWork during lifecycle transitions + * of entities. + * + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class LifecycleEventArgs extends EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var object + */ + private $entity; + + /** + * Constructor + * + * @param object $entity + * @param ObjectManager $objectManager + */ + public function __construct($entity, ObjectManager $objectManager) + { + $this->entity = $entity; + $this->objectManager = $objectManager; + } + + /** + * Retireve associated Entity. + * + * @return object + */ + public function getEntity() + { + return $this->entity; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php new file mode 100644 index 00000000..4a18d167 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php @@ -0,0 +1,76 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs; +use Doctrine\Common\Persistence\ObjectManager; +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Class that holds event arguments for a loadMetadata event. + * + * @author Jonathan H. Wage + * @since 2.2 + */ +class LoadClassMetadataEventArgs extends EventArgs +{ + /** + * @var ClassMetadata + */ + private $classMetadata; + + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * Constructor. + * + * @param ClasseMetadata $classMetadata + * @param ObjectManager $objectManager + */ + public function __construct(ClassMetadata $classMetadata, ObjectManager $objectManager) + { + $this->classMetadata = $classMetadata; + $this->objectManager = $objectManager; + } + + /** + * Retrieve associated ClassMetadata. + * + * @return ClassMetadata + */ + public function getClassMetadata() + { + return $this->classMetadata; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php new file mode 100644 index 00000000..33c4d796 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php @@ -0,0 +1,59 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\Persistence\ObjectManager; + +/** + * Provides event arguments for the preFlush event. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class ManagerEventArgs extends \Doctrine\Common\EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * Constructor. + * + * @param ObjectManager $objectManager + */ + public function __construct(ObjectManager $objectManager) + { + $this->objectManager = $objectManager; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php new file mode 100644 index 00000000..f67ab50e --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php @@ -0,0 +1,84 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +/** + * Provides event arguments for the onClear event. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class OnClearEventArgs extends \Doctrine\Common\EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var string + */ + private $entityClass; + + /** + * Constructor. + * + * @param ObjectManager $objectManager + * @param string $entityClass Optional entity class + */ + public function __construct($objectManager, $entityClass = null) + { + $this->objectManager = $objectManager; + $this->entityClass = $entityClass; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } + + /** + * Name of the entity class that is cleared, or empty if all are cleared. + * + * @return string + */ + public function getEntityClass() + { + return $this->entityClass; + } + + /** + * Check if event clears all entities. + * + * @return bool + */ + public function clearsAllEntities() + { + return ($this->entityClass === null); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php new file mode 100644 index 00000000..191d053a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php @@ -0,0 +1,129 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs, + Doctrine\Common\Persistence\ObjectManager; + +/** + * Class that holds event arguments for a preUpdate event. + * + * @author Guilherme Blanco + * @author Roman Borschel + * @author Benjamin Eberlei + * @since 2.2 + */ +class PreUpdateEventArgs extends LifecycleEventArgs +{ + /** + * @var array + */ + private $entityChangeSet; + + /** + * Constructor. + * + * @param object $entity + * @param ObjectManager $objectManager + * @param array $changeSet + */ + public function __construct($entity, ObjectManager $objectManager, array &$changeSet) + { + parent::__construct($entity, $objectManager); + + $this->entityChangeSet = &$changeSet; + } + + /** + * Retrieve entity changeset. + * + * @return array + */ + public function getEntityChangeSet() + { + return $this->entityChangeSet; + } + + /** + * Check if field has a changeset. + * + * @return boolean + */ + public function hasChangedField($field) + { + return isset($this->entityChangeSet[$field]); + } + + /** + * Get the old value of the changeset of the changed field. + * + * @param string $field + * @return mixed + */ + public function getOldValue($field) + { + $this->assertValidField($field); + + return $this->entityChangeSet[$field][0]; + } + + /** + * Get the new value of the changeset of the changed field. + * + * @param string $field + * @return mixed + */ + public function getNewValue($field) + { + $this->assertValidField($field); + + return $this->entityChangeSet[$field][1]; + } + + /** + * Set the new value of this field. + * + * @param string $field + * @param mixed $value + */ + public function setNewValue($field, $value) + { + $this->assertValidField($field); + + $this->entityChangeSet[$field][1] = $value; + } + + /** + * Assert the field exists in changeset. + * + * @param string $field + */ + private function assertValidField($field) + { + if ( ! isset($this->entityChangeSet[$field])) { + throw new \InvalidArgumentException(sprintf( + 'Field "%s" is not a valid field of the entity "%s" in PreUpdateEventArgs.', + $field, + get_class($this->getEntity()) + )); + } + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php new file mode 100644 index 00000000..4d92426b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php @@ -0,0 +1,112 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract covering object managers for a Doctrine persistence layer ManagerRegistry class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +interface ManagerRegistry extends ConnectionRegistry +{ + /** + * Gets the default object manager name. + * + * @return string The default object manager name + */ + function getDefaultManagerName(); + + /** + * Gets a named object manager. + * + * @param string $name The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectManager + */ + function getManager($name = null); + + /** + * Gets an array of all registered object managers + * + * @return array An array of ObjectManager instances + */ + function getManagers(); + + /** + * Resets a named object manager. + * + * This method is useful when an object manager has been closed + * because of a rollbacked transaction AND when you think that + * it makes sense to get a new one to replace the closed one. + * + * Be warned that you will get a brand new object manager as + * the existing one is not useable anymore. This means that any + * other object with a dependency on this object manager will + * hold an obsolete reference. You can inject the registry instead + * to avoid this problem. + * + * @param string $name The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectManager + */ + function resetManager($name = null); + + /** + * Resolves a registered namespace alias to the full namespace. + * + * This method looks for the alias in all registered object managers. + * + * @param string $alias The alias + * + * @return string The full namespace + */ + function getAliasNamespace($alias); + + /** + * Gets all connection names. + * + * @return array An array of connection names + */ + function getManagerNames(); + + /** + * Gets the ObjectRepository for an persistent object. + * + * @param string $persistentObject The name of the persistent object. + * @param string $persistentManagerName The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectRepository + */ + function getRepository($persistentObject, $persistentManagerName = null); + + /** + * Gets the object manager associated with a given class. + * + * @param string $class A persistent object class name + * + * @return \Doctrine\Common\Persistence\ObjectManager|null + */ + function getManagerForClass($class); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php new file mode 100644 index 00000000..a2a61850 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php @@ -0,0 +1,359 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use Doctrine\Common\Cache\Cache; + +/** + * The ClassMetadataFactory is used to create ClassMetadata objects that contain all the + * metadata mapping informations of a class which describes how a class should be mapped + * to a relational database. + * + * This class was abstracted from the ORM ClassMetadataFactory + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +abstract class AbstractClassMetadataFactory implements ClassMetadataFactory +{ + /** + * Salt used by specific Object Manager implementation. + * + * @var string + */ + protected $cacheSalt = "\$CLASSMETADATA"; + + /** + * @var \Doctrine\Common\Cache\Cache + */ + private $cacheDriver; + + /** + * @var array + */ + private $loadedMetadata = array(); + + /** + * @var bool + */ + protected $initialized = false; + + /** + * @var ReflectionService + */ + private $reflectionService; + + /** + * Sets the cache driver used by the factory to cache ClassMetadata instances. + * + * @param Doctrine\Common\Cache\Cache $cacheDriver + */ + public function setCacheDriver(Cache $cacheDriver = null) + { + $this->cacheDriver = $cacheDriver; + } + + /** + * Gets the cache driver used by the factory to cache ClassMetadata instances. + * + * @return Doctrine\Common\Cache\Cache + */ + public function getCacheDriver() + { + return $this->cacheDriver; + } + + /** + * Return an array of all the loaded metadata currently in memory. + * + * @return array + */ + public function getLoadedMetadata() + { + return $this->loadedMetadata; + } + + /** + * Forces the factory to load the metadata of all classes known to the underlying + * mapping driver. + * + * @return array The ClassMetadata instances of all mapped classes. + */ + public function getAllMetadata() + { + if ( ! $this->initialized) { + $this->initialize(); + } + + $driver = $this->getDriver(); + $metadata = array(); + foreach ($driver->getAllClassNames() as $className) { + $metadata[] = $this->getMetadataFor($className); + } + + return $metadata; + } + + /** + * Lazy initialization of this stuff, especially the metadata driver, + * since these are not needed at all when a metadata cache is active. + * + * @return void + */ + abstract protected function initialize(); + + /** + * Get the fully qualified class-name from the namespace alias. + * + * @param string $namespaceAlias + * @param string $simpleClassName + * @return string + */ + abstract protected function getFqcnFromAlias($namespaceAlias, $simpleClassName); + + /** + * Return the mapping driver implementation. + * + * @return MappingDriver + */ + abstract protected function getDriver(); + + /** + * Wakeup reflection after ClassMetadata gets unserialized from cache. + * + * @param ClassMetadata $class + * @param ReflectionService $reflService + * @return void + */ + abstract protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService); + + /** + * Initialize Reflection after ClassMetadata was constructed. + * + * @param ClassMetadata $class + * @param ReflectionSErvice $reflService + * @return void + */ + abstract protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService); + + /** + * Gets the class metadata descriptor for a class. + * + * @param string $className The name of the class. + * @return Doctrine\Common\Persistence\Mapping\ClassMetadata + */ + public function getMetadataFor($className) + { + if ( ! isset($this->loadedMetadata[$className])) { + $realClassName = $className; + + // Check for namespace alias + if (strpos($className, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $className); + $realClassName = $this->getFqcnFromAlias($namespaceAlias, $simpleClassName); + + if (isset($this->loadedMetadata[$realClassName])) { + // We do not have the alias name in the map, include it + $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; + + return $this->loadedMetadata[$realClassName]; + } + } + + if ($this->cacheDriver) { + if (($cached = $this->cacheDriver->fetch($realClassName . $this->cacheSalt)) !== false) { + $this->loadedMetadata[$realClassName] = $cached; + $this->wakeupReflection($cached, $this->getReflectionService()); + } else { + foreach ($this->loadMetadata($realClassName) as $loadedClassName) { + $this->cacheDriver->save( + $loadedClassName . $this->cacheSalt, $this->loadedMetadata[$loadedClassName], null + ); + } + } + } else { + $this->loadMetadata($realClassName); + } + + if ($className != $realClassName) { + // We do not have the alias name in the map, include it + $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; + } + } + + return $this->loadedMetadata[$className]; + } + + /** + * Checks whether the factory has the metadata for a class loaded already. + * + * @param string $className + * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. + */ + public function hasMetadataFor($className) + { + return isset($this->loadedMetadata[$className]); + } + + /** + * Sets the metadata descriptor for a specific class. + * + * NOTE: This is only useful in very special cases, like when generating proxy classes. + * + * @param string $className + * @param ClassMetadata $class + */ + public function setMetadataFor($className, $class) + { + $this->loadedMetadata[$className] = $class; + } + + /** + * Get array of parent classes for the given entity class + * + * @param string $name + * @return array $parentClasses + */ + protected function getParentClasses($name) + { + // Collect parent classes, ignoring transient (not-mapped) classes. + $parentClasses = array(); + foreach (array_reverse($this->getReflectionService()->getParentClasses($name)) as $parentClass) { + if ( ! $this->getDriver()->isTransient($parentClass)) { + $parentClasses[] = $parentClass; + } + } + return $parentClasses; + } + + /** + * Loads the metadata of the class in question and all it's ancestors whose metadata + * is still not loaded. + * + * @param string $name The name of the class for which the metadata should get loaded. + * @param array $tables The metadata collection to which the loaded metadata is added. + */ + protected function loadMetadata($name) + { + if ( ! $this->initialized) { + $this->initialize(); + } + + $loaded = array(); + + $parentClasses = $this->getParentClasses($name); + $parentClasses[] = $name; + + // Move down the hierarchy of parent classes, starting from the topmost class + $parent = null; + $rootEntityFound = false; + $visited = array(); + $reflService = $this->getReflectionService(); + foreach ($parentClasses as $className) { + if (isset($this->loadedMetadata[$className])) { + $parent = $this->loadedMetadata[$className]; + if (isset($parent->isMappedSuperclass) && $parent->isMappedSuperclass === false) { + $rootEntityFound = true; + array_unshift($visited, $className); + } + continue; + } + + $class = $this->newClassMetadataInstance($className); + $this->initializeReflection($class, $reflService); + + $this->doLoadMetadata($class, $parent, $rootEntityFound); + + $this->loadedMetadata[$className] = $class; + + $parent = $class; + + if (isset($parent->isMappedSuperclass) && $class->isMappedSuperclass === false) { + $rootEntityFound = true; + array_unshift($visited, $className); + } + + $this->wakeupReflection($class, $reflService); + + $loaded[] = $className; + } + + return $loaded; + } + + /** + * Actually load the metadata from the underlying metadata + * + * @param ClassMetadata $class + * @param ClassMetadata $parent + * @param bool $rootEntityFound + * @return void + */ + abstract protected function doLoadMetadata($class, $parent, $rootEntityFound); + + /** + * Creates a new ClassMetadata instance for the given class name. + * + * @param string $className + * @return ClassMetadata + */ + abstract protected function newClassMetadataInstance($className); + + /** + * Check if this class is mapped by this Object Manager + ClassMetadata configuration + * + * @param $class + * @return bool + */ + public function isTransient($class) + { + if ( ! $this->initialized) { + $this->initialize(); + } + + return $this->getDriver()->isTransient($class); + } + + /** + * Set reflectionService. + * + * @param ReflectionService $reflectionService + */ + public function setReflectionService(ReflectionService $reflectionService) + { + $this->reflectionService = $reflectionService; + } + + /** + * Get the reflection service associated with this metadata factory. + * + * @return ReflectionService + */ + public function getReflectionService() + { + if ($this->reflectionService === null) { + $this->reflectionService = new RuntimeReflectionService(); + } + return $this->reflectionService; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php new file mode 100644 index 00000000..705d59ac --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php @@ -0,0 +1,165 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ClassMetadata +{ + /** + * Get fully-qualified class name of this persistent class. + * + * @return string + */ + function getName(); + + /** + * Gets the mapped identifier field name. + * + * The returned structure is an array of the identifier field names. + * + * @return array + */ + function getIdentifier(); + + /** + * Gets the ReflectionClass instance for this mapped class. + * + * @return ReflectionClass + */ + function getReflectionClass(); + + /** + * Checks if the given field name is a mapped identifier for this class. + * + * @param string $fieldName + * @return boolean + */ + function isIdentifier($fieldName); + + /** + * Checks if the given field is a mapped property for this class. + * + * @param string $fieldName + * @return boolean + */ + function hasField($fieldName); + + /** + * Checks if the given field is a mapped association for this class. + * + * @param string $fieldName + * @return boolean + */ + function hasAssociation($fieldName); + + /** + * Checks if the given field is a mapped single valued association for this class. + * + * @param string $fieldName + * @return boolean + */ + function isSingleValuedAssociation($fieldName); + + /** + * Checks if the given field is a mapped collection valued association for this class. + * + * @param string $fieldName + * @return boolean + */ + function isCollectionValuedAssociation($fieldName); + + /** + * A numerically indexed list of field names of this persistent class. + * + * This array includes identifier fields if present on this class. + * + * @return array + */ + function getFieldNames(); + + /** + * Returns an array of identifier field names numerically indexed. + * + * @return array + */ + function getIdentifierFieldNames(); + + /** + * A numerically indexed list of association names of this persistent class. + * + * This array includes identifier associations if present on this class. + * + * @return array + */ + function getAssociationNames(); + + /** + * Returns a type name of this field. + * + * This type names can be implementation specific but should at least include the php types: + * integer, string, boolean, float/double, datetime. + * + * @param string $fieldName + * @return string + */ + function getTypeOfField($fieldName); + + /** + * Returns the target class name of the given association. + * + * @param string $assocName + * @return string + */ + function getAssociationTargetClass($assocName); + + /** + * Checks if the association is the inverse side of a bidirectional association + * + * @param string $assocName + * @return boolean + */ + function isAssociationInverseSide($assocName); + + /** + * Returns the target field of the owning side of the association + * + * @param string $assocName + * @return string + */ + function getAssociationMappedByTargetField($assocName); + + /** + * Return the identifier of this object as an array with field name as key. + * + * Has to return an empty array if no identifier isset. + * + * @param object $object + * @return array + */ + function getIdentifierValues($object); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php new file mode 100644 index 00000000..bf27ba9a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php @@ -0,0 +1,74 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ClassMetadataFactory +{ + /** + * Forces the factory to load the metadata of all classes known to the underlying + * mapping driver. + * + * @return array The ClassMetadata instances of all mapped classes. + */ + function getAllMetadata(); + + /** + * Gets the class metadata descriptor for a class. + * + * @param string $className The name of the class. + * @return ClassMetadata + */ + function getMetadataFor($className); + + /** + * Checks whether the factory has the metadata for a class loaded already. + * + * @param string $className + * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. + */ + function hasMetadataFor($className); + + /** + * Sets the metadata descriptor for a specific class. + * + * @param string $className + * @param ClassMetadata $class + */ + function setMetadataFor($className, $class); + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped directly or as a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + function isTransient($className); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php new file mode 100644 index 00000000..f52d37ee --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php @@ -0,0 +1,214 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Cache\ArrayCache, + Doctrine\Common\Annotations\AnnotationReader, + Doctrine\Common\Annotations\AnnotationRegistry, + Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The AnnotationDriver reads the mapping metadata from docblock annotations. + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +abstract class AnnotationDriver implements MappingDriver +{ + /** + * The AnnotationReader. + * + * @var AnnotationReader + */ + protected $reader; + + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * The file extension of mapping documents. + * + * @var string + */ + protected $fileExtension = '.php'; + + /** + * Cache for AnnotationDriver#getAllClassNames() + * + * @var array + */ + protected $classNames; + + /** + * Name of the entity annotations as keys + * + * @var array + */ + protected $entityAnnotationClasses = array(); + + /** + * Initializes a new AnnotationDriver that uses the given AnnotationReader for reading + * docblock annotations. + * + * @param AnnotationReader $reader The AnnotationReader to use, duck-typed. + * @param string|array $paths One or multiple paths where mapping classes can be found. + */ + public function __construct($reader, $paths = null) + { + $this->reader = $reader; + if ($paths) { + $this->addPaths((array) $paths); + } + } + + /** + * Append lookup paths to metadata driver. + * + * @param array $paths + */ + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * Retrieve the defined metadata lookup paths. + * + * @return array + */ + public function getPaths() + { + return $this->paths; + } + + /** + * Retrieve the current annotation reader + * + * @return AnnotationReader + */ + public function getReader() + { + return $this->reader; + } + + /** + * Get the file extension used to look for mapping files under + * + * @return void + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * Whether the class with the specified name is transient. Only non-transient + * classes, that is entities and mapped superclasses, should have their metadata loaded. + * + * A class is non-transient if it is annotated with an annotation + * from the {@see AnnotationDriver::entityAnnotationClasses}. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + $classAnnotations = $this->reader->getClassAnnotations(new \ReflectionClass($className)); + + foreach ($classAnnotations as $annot) { + if (isset($this->entityAnnotationClasses[get_class($annot)])) { + return false; + } + } + return true; + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames() + { + if ($this->classNames !== null) { + return $this->classNames; + } + + if (!$this->paths) { + throw MappingException::pathRequired(); + } + + $classes = array(); + $includedFiles = array(); + + foreach ($this->paths as $path) { + if ( ! is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RegexIterator( + new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS), + \RecursiveIteratorIterator::LEAVES_ONLY + ), + '/^.+' . str_replace('.', '\.', $this->fileExtension) . '$/i', + \RecursiveRegexIterator::GET_MATCH + ); + + foreach ($iterator as $file) { + $sourceFile = realpath($file[0]); + + require_once $sourceFile; + + $includedFiles[] = $sourceFile; + } + } + + $declared = get_declared_classes(); + + foreach ($declared as $className) { + $rc = new \ReflectionClass($className); + $sourceFile = $rc->getFileName(); + if (in_array($sourceFile, $includedFiles) && ! $this->isTransient($className)) { + $classes[] = $className; + } + } + + $this->classNames = $classes; + + return $classes; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php new file mode 100644 index 00000000..efaf545e --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php @@ -0,0 +1,169 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * Locate the file that contains the metadata information for a given class name. + * + * This behavior is inpependent of the actual content of the file. It just detects + * the file which is responsible for the given class name. + * + * @author Benjamin Eberlei + * @author Johannes M. Schmitt + */ +class DefaultFileLocator implements FileLocator +{ + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * The file extension of mapping documents. + * + * @var string + */ + protected $fileExtension; + + /** + * Initializes a new FileDriver that looks in the given path(s) for mapping + * documents and operates in the specified operating mode. + * + * @param string|array $paths One or multiple paths where mapping documents can be found. + */ + public function __construct($paths, $fileExtension = null) + { + $this->addPaths((array) $paths); + $this->fileExtension = $fileExtension; + } + + /** + * Append lookup paths to metadata driver. + * + * @param array $paths + */ + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * Retrieve the defined metadata lookup paths. + * + * @return array + */ + public function getPaths() + { + return $this->paths; + } + + /** + * Get the file extension used to look for mapping files under + * + * @return void + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * {@inheritDoc} + */ + public function findMappingFile($className) + { + $fileName = str_replace('\\', '.', $className) . $this->fileExtension; + + // Check whether file exists + foreach ($this->paths as $path) { + if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { + return $path . DIRECTORY_SEPARATOR . $fileName; + } + } + + throw MappingException::mappingFileNotFound($className, $fileName); + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames($globalBasename) + { + $classes = array(); + + if ($this->paths) { + foreach ($this->paths as $path) { + if ( ! is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + $fileName = $file->getBasename($this->fileExtension); + + if ($fileName == $file->getBasename() || $fileName == $globalBasename) { + continue; + } + + // NOTE: All files found here means classes are not transient! + $classes[] = str_replace('.', '\\', $fileName); + } + } + } + + return $classes; + } + + /** + * {@inheritDoc} + */ + public function fileExists($className) + { + $fileName = str_replace('\\', '.', $className) . $this->fileExtension; + + // Check whether file exists + foreach ((array) $this->paths as $path) { + if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php new file mode 100644 index 00000000..22cf117d --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php @@ -0,0 +1,178 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * Base driver for file-based metadata drivers. + * + * A file driver operates in a mode where it loads the mapping files of individual + * classes on demand. This requires the user to adhere to the convention of 1 mapping + * file per class and the file names of the mapping files must correspond to the full + * class name, including namespace, with the namespace delimiters '\', replaced by dots '.'. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.com + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +abstract class FileDriver implements MappingDriver +{ + /** + * @var FileLocator + */ + protected $locator; + + /** + * @var array + */ + protected $classCache; + + /** + * @var string + */ + protected $globalBasename; + + /** + * Initializes a new FileDriver that looks in the given path(s) for mapping + * documents and operates in the specified operating mode. + * + * @param string|array|FileLocator $paths A FileLocator or one/multiple paths where mapping documents can be found. + * @param string $fileExtension + */ + public function __construct($locator, $fileExtension = null) + { + if ($locator instanceof FileLocator) { + $this->locator = $locator; + } else { + $this->locator = new DefaultFileLocator((array)$locator, $fileExtension); + } + } + + public function setGlobalBasename($file) + { + $this->globalBasename = $file; + } + + public function getGlobalBasename() + { + return $this->globalBasename; + } + + /** + * Get the element of schema meta data for the class from the mapping file. + * This will lazily load the mapping file if it is not loaded yet + * + * @return array $element The element of schema meta data + */ + public function getElement($className) + { + if ($this->classCache === null) { + $this->initialize(); + } + + if (isset($this->classCache[$className])) { + return $this->classCache[$className]; + } + + $result = $this->loadMappingFile($this->locator->findMappingFile($className)); + + return $result[$className]; + } + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped as an Entity or a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + if ($this->classCache === null) { + $this->initialize(); + } + + if (isset($this->classCache[$className])) { + return false; + } + + return !$this->locator->fileExists($className); + } + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + public function getAllClassNames() + { + if ($this->classCache === null) { + $this->initialize(); + } + + $classNames = (array)$this->locator->getAllClassNames($this->globalBasename); + if ($this->classCache) { + $classNames = array_merge(array_keys($this->classCache), $classNames); + } + return $classNames; + } + + /** + * Loads a mapping file with the given name and returns a map + * from class/entity names to their corresponding file driver elements. + * + * @param string $file The mapping file to load. + * @return array + */ + abstract protected function loadMappingFile($file); + + /** + * Initialize the class cache from all the global files. + * + * Using this feature adds a substantial performance hit to file drivers as + * more metadata has to be loaded into memory than might actually be + * necessary. This may not be relevant to scenarios where caching of + * metadata is in place, however hits very hard in scenarios where no + * caching is used. + * + * @return void + */ + protected function initialize() + { + $this->classCache = array(); + if (null !== $this->globalBasename) { + foreach ($this->locator->getPaths() as $path) { + $file = $path.'/'.$this->globalBasename.$this->locator->getFileExtension(); + if (is_file($file)) { + $this->classCache = array_merge( + $this->classCache, + $this->loadMappingFile($file) + ); + } + } + } + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php new file mode 100644 index 00000000..a1019d71 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php @@ -0,0 +1,69 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +/** + * Locate the file that contains the metadata information for a given class name. + * + * This behavior is inpependent of the actual content of the file. It just detects + * the file which is responsible for the given class name. + * + * @author Benjamin Eberlei + * @author Johannes M. Schmitt + */ +interface FileLocator +{ + /** + * Locate mapping file for the given class name. + * + * @param string $className + * @return string + */ + function findMappingFile($className); + + /** + * Get all class names that are found with this file locator. + * + * @param string $globalBasename Passed to allow excluding the basename + * @return array + */ + function getAllClassNames($globalBasename); + + /** + * Check if a file can be found for this class name. + * + * @return bool + */ + function fileExists($className); + + /** + * Get all the paths that this file locator looks for mapping files. + * + * @return array + */ + function getPaths(); + + /** + * Get the file extension that mapping files are suffixed with. + * + * @return string + */ + function getFileExtension(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php new file mode 100644 index 00000000..c050d323 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php @@ -0,0 +1,56 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Contract for metadata drivers. + * + * @since 2.2 + * @author Jonathan H. Wage + */ +interface MappingDriver +{ + /** + * Loads the metadata for the specified class into the provided container. + * + * @param string $className + * @param ClassMetadata $metadata + */ + function loadMetadataForClass($className, ClassMetadata $metadata); + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + function getAllClassNames(); + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped as an Entity or a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + function isTransient($className); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php new file mode 100644 index 00000000..c7c14527 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php @@ -0,0 +1,125 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\Driver\MappingDriver, + Doctrine\Common\Persistence\Mapping\ClassMetadata, + Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The DriverChain allows you to add multiple other mapping drivers for + * certain namespaces + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class MappingDriverChain implements MappingDriver +{ + /** + * @var array + */ + private $drivers = array(); + + /** + * Add a nested driver. + * + * @param Driver $nestedDriver + * @param string $namespace + */ + public function addDriver(MappingDriver $nestedDriver, $namespace) + { + $this->drivers[$namespace] = $nestedDriver; + } + + /** + * Get the array of nested drivers. + * + * @return array $drivers + */ + public function getDrivers() + { + return $this->drivers; + } + + /** + * Loads the metadata for the specified class into the provided container. + * + * @param string $className + * @param ClassMetadataInfo $metadata + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + foreach ($this->drivers as $namespace => $driver) { + if (strpos($className, $namespace) === 0) { + $driver->loadMetadataForClass($className, $metadata); + return; + } + } + + throw MappingException::classNotFoundInNamespaces($className, array_keys($this->drivers)); + } + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + public function getAllClassNames() + { + $classNames = array(); + $driverClasses = array(); + foreach ($this->drivers AS $namespace => $driver) { + $oid = spl_object_hash($driver); + if (!isset($driverClasses[$oid])) { + $driverClasses[$oid] = $driver->getAllClassNames(); + } + + foreach ($driverClasses[$oid] AS $className) { + if (strpos($className, $namespace) === 0) { + $classNames[$className] = true; + } + } + } + return array_keys($classNames); + } + + /** + * Whether the class with the specified name should have its metadata loaded. + * + * This is only the case for non-transient classes either mapped as an Entity or MappedSuperclass. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + foreach ($this->drivers AS $namespace => $driver) { + if (strpos($className, $namespace) === 0) { + return $driver->isTransient($className); + } + } + + // class isTransient, i.e. not an entity or mapped superclass + return true; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php new file mode 100644 index 00000000..7751dae3 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * The PHPDriver includes php files which just populate ClassMetadataInfo + * instances with plain php code + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class PHPDriver extends FileDriver +{ + /** + * {@inheritdoc} + */ + protected $metadata; + + /** + * {@inheritDoc} + */ + public function __construct($locator, $fileExtension = null) + { + $fileExtension = ".php"; + parent::__construct($locator, $fileExtension); + } + + /** + * {@inheritdoc} + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + $this->metadata = $metadata; + $this->loadMappingFile($this->locator->findMappingFile($className)); + } + + /** + * {@inheritdoc} + */ + protected function loadMappingFile($file) + { + $metadata = $this->metadata; + include $file; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php new file mode 100644 index 00000000..9103ed86 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php @@ -0,0 +1,131 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The StaticPHPDriver calls a static loadMetadata() method on your entity + * classes where you can manually populate the ClassMetadata instance. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class StaticPHPDriver implements MappingDriver +{ + /** + * Paths of entity directories. + * + * @var array + */ + private $paths = array(); + + /** + * Map of all class names. + * + * @var array + */ + private $classNames; + + public function __construct($paths) + { + $this->addPaths((array) $paths); + } + + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * {@inheritdoc} + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + $className::loadMetadata($metadata); + } + + /** + * {@inheritDoc} + * @todo Same code exists in AnnotationDriver, should we re-use it somehow or not worry about it? + */ + public function getAllClassNames() + { + if ($this->classNames !== null) { + return $this->classNames; + } + + if (!$this->paths) { + throw MappingException::pathRequired(); + } + + $classes = array(); + $includedFiles = array(); + + foreach ($this->paths as $path) { + if (!is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + if ($file->getBasename('.php') == $file->getBasename()) { + continue; + } + + $sourceFile = realpath($file->getPathName()); + require_once $sourceFile; + $includedFiles[] = $sourceFile; + } + } + + $declared = get_declared_classes(); + + foreach ($declared as $className) { + $rc = new \ReflectionClass($className); + $sourceFile = $rc->getFileName(); + if (in_array($sourceFile, $includedFiles) && !$this->isTransient($className)) { + $classes[] = $className; + } + } + + $this->classNames = $classes; + + return $classes; + } + + /** + * {@inheritdoc} + */ + public function isTransient($className) + { + return ! method_exists($className, 'loadMetadata'); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php new file mode 100644 index 00000000..d338cf60 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php @@ -0,0 +1,198 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The Symfony File Locator makes a simplifying assumptions compared + * to the DefaultFileLocator. By assuming paths only contain entities of a certain + * namespace the mapping files consists of the short classname only. + * + * @author Fabien Potencier + * @author Benjamin Eberlei + * @license MIT + */ +class SymfonyFileLocator implements FileLocator +{ + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * A map of mapping directory path to namespace prefix used to expand class shortnames. + * + * @var array + */ + protected $prefixes = array(); + + /** + * File extension that is searched for. + * + * @var string + */ + protected $fileExtension; + + public function __construct(array $prefixes, $fileExtension = null) + { + $this->addNamespacePrefixes($prefixes); + $this->fileExtension = $fileExtension; + } + + public function addNamespacePrefixes(array $prefixes) + { + $this->prefixes = array_merge($this->prefixes, $prefixes); + $this->paths = array_merge($this->paths, array_keys($prefixes)); + } + + public function getNamespacePrefixes() + { + return $this->prefixes; + } + + /** + * {@inheritDoc} + */ + public function getPaths() + { + return $this->paths; + } + + /** + * {@inheritDoc} + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * {@inheritDoc} + */ + public function fileExists($className) + { + $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; + foreach ($this->paths as $path) { + if (!isset($this->prefixes[$path])) { + // global namespace class + if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { + return true; + } + + continue; + } + + $prefix = $this->prefixes[$path]; + + if (0 !== strpos($className, $prefix.'\\')) { + continue; + } + + $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; + return is_file($filename); + } + + return false; + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames($globalBasename = null) + { + $classes = array(); + + if ($this->paths) { + foreach ((array) $this->paths as $path) { + if (!is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + $fileName = $file->getBasename($this->fileExtension); + + if ($fileName == $file->getBasename() || $fileName == $globalBasename) { + continue; + } + + // NOTE: All files found here means classes are not transient! + if (isset($this->prefixes[$path])) { + $classes[] = $this->prefixes[$path].'\\'.str_replace('.', '\\', $fileName); + } else { + $classes[] = str_replace('.', '\\', $fileName); + } + } + } + } + + return $classes; + } + + /** + * {@inheritDoc} + */ + public function findMappingFile($className) + { + $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; + foreach ($this->paths as $path) { + if (!isset($this->prefixes[$path])) { + if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { + return $path.DIRECTORY_SEPARATOR.$defaultFileName; + } + + continue; + } + + $prefix = $this->prefixes[$path]; + + if (0 !== strpos($className, $prefix.'\\')) { + continue; + } + + $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; + if (is_file($filename)) { + return $filename; + } + + throw MappingException::mappingFileNotFound($className, $filename); + } + + throw MappingException::mappingFileNotFound($className, substr($className, strrpos($className, '\\') + 1).$this->fileExtension); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php new file mode 100644 index 00000000..4ecd2ad5 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php @@ -0,0 +1,57 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * A MappingException indicates that something is wrong with the mapping setup. + * + * @since 2.2 + */ +class MappingException extends \Exception +{ + public static function classNotFoundInNamespaces($className, $namespaces) + { + return new self("The class '" . $className . "' was not found in the ". + "chain configured namespaces " . implode(", ", $namespaces)); + } + + public static function pathRequired() + { + return new self("Specifying the paths to your entities is required ". + "in the AnnotationDriver to retrieve all class names."); + } + + public static function fileMappingDriversRequireConfiguredDirectoryPath($path = null) + { + if ( ! empty($path)) { + $path = '[' . $path . ']'; + } + + return new self( + 'File mapping drivers must have a valid directory path, ' . + 'however the given path ' . $path . ' seems to be incorrect!' + ); + } + + public static function mappingFileNotFound($entityName, $fileName) + { + return new self("No mapping file found named '$fileName' for class '$entityName'."); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php new file mode 100644 index 00000000..4e0e312f --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php @@ -0,0 +1,80 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Very simple reflection service abstraction. + * + * This is required inside metadata layers that may require either + * static or runtime reflection. + * + * @author Benjamin Eberlei + */ +interface ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + function getParentClasses($class); + + /** + * Return the shortname of a class. + * + * @param string $class + * @return string + */ + function getClassShortName($class); + + /** + * @param string $class + * @return string + */ + function getClassNamespace($class); + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + function getClass($class); + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + function getAccessibleProperty($class, $property); + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + function hasPublicMethod($class, $method); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php new file mode 100644 index 00000000..abcff581 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php @@ -0,0 +1,102 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use ReflectionClass; +use ReflectionProperty; + +/** + * PHP Runtime Reflection Service + * + * @author Benjamin Eberlei + */ +class RuntimeReflectionService implements ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + public function getParentClasses($class) + { + return class_parents($class); + } + + /** + * Return the shortname of a class. + * + * @param string $class + * @return string + */ + public function getClassShortName($class) + { + $r = new ReflectionClass($class); + return $r->getShortName(); + } + + /** + * @param string $class + * @return string + */ + public function getClassNamespace($class) + { + $r = new ReflectionClass($class); + return $r->getNamespaceName(); + } + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + public function getClass($class) + { + return new ReflectionClass($class); + } + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + public function getAccessibleProperty($class, $property) + { + $property = new ReflectionProperty($class, $property); + $property->setAccessible(true); + return $property; + } + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + public function hasPublicMethod($class, $method) + { + return method_exists($class, $method) && is_callable(array($class, $method)); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php new file mode 100644 index 00000000..2de6e761 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php @@ -0,0 +1,107 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use ReflectionClass; +use ReflectionProperty; + +/** + * PHP Runtime Reflection Service + * + * @author Benjamin Eberlei + */ +class StaticReflectionService implements ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + public function getParentClasses($class) + { + return array(); + } + + /** + * Return the shortname of a class. + * + * @param string $className + * @return string + */ + public function getClassShortName($className) + { + if (strpos($className, '\\') !== false) { + $className = substr($className, strrpos($className, "\\")+1); + } + return $className; + } + + /** + * Return the namespace of a class. + * + * @param string $className + * @return string + */ + public function getClassNamespace($className) + { + $namespace = ''; + if (strpos($className, '\\') !== false) { + $namespace = strrev(substr( strrev($className), strpos(strrev($className), '\\')+1 )); + } + return $namespace; + } + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + public function getClass($class) + { + return null; + } + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + public function getAccessibleProperty($class, $property) + { + return null; + } + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + public function hasPublicMethod($class, $method) + { + return method_exists($class, $method) && is_callable(array($class, $method)); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php new file mode 100644 index 00000000..6d70fc12 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php @@ -0,0 +1,143 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract for a Doctrine persistence layer ObjectManager class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ObjectManager +{ + /** + * Finds a object by its identifier. + * + * This is just a convenient shortcut for getRepository($className)->find($id). + * + * @param string + * @param mixed + * @return object + */ + function find($className, $id); + + /** + * Tells the ObjectManager to make an instance managed and persistent. + * + * The object will be entered into the database as a result of the flush operation. + * + * NOTE: The persist operation always considers objects that are not yet known to + * this ObjectManager as NEW. Do not pass detached objects to the persist operation. + * + * @param object $object The instance to make managed and persistent. + */ + function persist($object); + + /** + * Removes an object instance. + * + * A removed object will be removed from the database as a result of the flush operation. + * + * @param object $object The object instance to remove. + */ + function remove($object); + + /** + * Merges the state of a detached object into the persistence context + * of this ObjectManager and returns the managed copy of the object. + * The object passed to merge will not become associated/managed with this ObjectManager. + * + * @param object $object + */ + function merge($object); + + /** + * Detaches an object from the ObjectManager, causing a managed object to + * become detached. Unflushed changes made to the object if any + * (including removal of the object), will not be synchronized to the database. + * Objects which previously referenced the detached object will continue to + * reference it. + * + * @param object $object The object to detach. + */ + function detach($object); + + /** + * Refreshes the persistent state of an object from the database, + * overriding any local changes that have not yet been persisted. + * + * @param object $object The object to refresh. + */ + function refresh($object); + + /** + * Flushes all changes to objects that have been queued up to now to the database. + * This effectively synchronizes the in-memory state of managed objects with the + * database. + */ + function flush(); + + /** + * Gets the repository for a class. + * + * @param string $className + * @return \Doctrine\Common\Persistence\ObjectRepository + */ + function getRepository($className); + + /** + * Returns the ClassMetadata descriptor for a class. + * + * The class name must be the fully-qualified class name without a leading backslash + * (as it is returned by get_class($obj)). + * + * @param string $className + * @return \Doctrine\Common\Persistence\Mapping\ClassMetadata + */ + function getClassMetadata($className); + + /** + * Gets the metadata factory used to gather the metadata of classes. + * + * @return Doctrine\Common\Persistence\Mapping\ClassMetadataFactory + */ + function getMetadataFactory(); + + /** + * Helper method to initialize a lazy loading proxy or persistent collection. + * + * This method is a no-op for other objects. + * + * @param object $obj + */ + function initializeObject($obj); + + /** + * Check if the object is part of the current UnitOfWork and therefore + * managed. + * + * @param object $object + * @return bool + */ + function contains($object); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php new file mode 100644 index 00000000..015dd3dd --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php @@ -0,0 +1,49 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Makes a Persistent Objects aware of its own object-manager. + * + * Using this interface the managing object manager and class metadata instances + * are injected into the persistent object after construction. This allows + * you to implement ActiveRecord functionality on top of the persistance-ignorance + * that Doctrine propagates. + * + * Word of Warning: This is a very powerful hook to change how you can work with your domain models. + * Using this hook will break the Single Responsibility Principle inside your Domain Objects + * and increase the coupling of database and objects. + * + * Every ObjectManager has to implement this functionality itself. + * + * @author Benjamin Eberlei + */ +interface ObjectManagerAware +{ + /** + * Injects responsible ObjectManager and the ClassMetadata into this persistent object. + * + * @param ObjectManager $objectManager + * @param ClassMetadata $classMetadata + */ + public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php new file mode 100644 index 00000000..22633288 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php @@ -0,0 +1,78 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract for a Doctrine persistence layer ObjectRepository class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ObjectRepository +{ + /** + * Finds an object by its primary key / identifier. + * + * @param $id The identifier. + * @return object The object. + */ + function find($id); + + /** + * Finds all objects in the repository. + * + * @return mixed The objects. + */ + function findAll(); + + /** + * Finds objects by a set of criteria. + * + * Optionally sorting and limiting details can be passed. An implementation may throw + * an UnexpectedValueException if certain values of the sorting or limiting details are + * not supported. + * + * @throws UnexpectedValueException + * @param array $criteria + * @param array|null $orderBy + * @param int|null $limit + * @param int|null $offset + * @return mixed The objects. + */ + function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null); + + /** + * Finds a single object by a set of criteria. + * + * @param array $criteria + * @return object The object. + */ + function findOneBy(array $criteria); + + /** + * Returns the class name of the object managed by the repository + * + * @return string + */ + function getClassName(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php new file mode 100644 index 00000000..4274af62 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php @@ -0,0 +1,233 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; + +/** + * PersistentObject base class that implements getter/setter methods for all mapped fields and associations + * by overriding __call. + * + * This class is a forward compatible implementation of the PersistentObject trait. + * + * + * Limitations: + * + * 1. All persistent objects have to be associated with a single ObjectManager, multiple + * ObjectManagers are not supported. You can set the ObjectManager with `PersistentObject#setObjectManager()`. + * 2. Setters and getters only work if a ClassMetadata instance was injected into the PersistentObject. + * This is either done on `postLoad` of an object or by accessing the global object manager. + * 3. There are no hooks for setters/getters. Just implement the method yourself instead of relying on __call(). + * 4. Slower than handcoded implementations: An average of 7 method calls per access to a field and 11 for an association. + * 5. Only the inverse side associations get autoset on the owning side aswell. Setting objects on the owning side + * will not set the inverse side associations. + * + * @example + * + * PersistentObject::setObjectManager($em); + * + * class Foo extends PersistentObject + * { + * private $id; + * } + * + * $foo = new Foo(); + * $foo->getId(); // method exists through __call + * + * @author Benjamin Eberlei + */ +abstract class PersistentObject implements ObjectManagerAware +{ + /** + * @var ObjectManager + */ + private static $objectManager; + + /** + * @var ClassMetadata + */ + private $cm; + + /** + * Set the object manager responsible for all persistent object base classes. + * + * @param ObjectManager $objectManager + */ + static public function setObjectManager(ObjectManager $objectManager = null) + { + self::$objectManager = $objectManager; + } + + /** + * @return ObjectManager + */ + static public function getObjectManager() + { + return self::$objectManager; + } + + /** + * Inject Doctrine Object Manager + * + * @param ObjectManager $objectManager + * @param ClassMetadata $classMetadata + */ + public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata) + { + if ($objectManager !== self::$objectManager) { + throw new \RuntimeException("Trying to use PersistentObject with different ObjectManager instances. " . + "Was PersistentObject::setObjectManager() called?"); + } + + $this->cm = $classMetadata; + } + + /** + * Sets a persistent fields value. + * + * @throws InvalidArgumentException - When the wrong target object type is passed to an association + * @throws BadMethodCallException - When no persistent field exists by that name. + * @param string $field + * @param array $args + * @return void + */ + private function set($field, $args) + { + $this->initializeDoctrine(); + + if ($this->cm->hasField($field) && !$this->cm->isIdentifier($field)) { + $this->$field = $args[0]; + } else if ($this->cm->hasAssociation($field) && $this->cm->isSingleValuedAssociation($field)) { + $targetClass = $this->cm->getAssociationTargetClass($field); + if (!($args[0] instanceof $targetClass) && $args[0] !== null) { + throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); + } + $this->$field = $args[0]; + $this->completeOwningSide($field, $targetClass, $args[0]); + } else { + throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); + } + } + + /** + * Get persistent field value. + * + * @throws BadMethodCallException - When no persistent field exists by that name. + * @param string $field + * @return mixed + */ + private function get($field) + { + $this->initializeDoctrine(); + + if ( $this->cm->hasField($field) || $this->cm->hasAssociation($field) ) { + return $this->$field; + } else { + throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); + } + } + + /** + * If this is an inverse side association complete the owning side. + * + * @param string $field + * @param ClassMetadata $targetClass + * @param object $targetObject + */ + private function completeOwningSide($field, $targetClass, $targetObject) + { + // add this object on the owning side aswell, for obvious infinite recursion + // reasons this is only done when called on the inverse side. + if ($this->cm->isAssociationInverseSide($field)) { + $mappedByField = $this->cm->getAssociationMappedByTargetField($field); + $targetMetadata = self::$objectManager->getClassMetadata($targetClass); + + $setter = ($targetMetadata->isCollectionValuedAssociation($mappedByField) ? "add" : "set").$mappedByField; + $targetObject->$setter($this); + } + } + + /** + * Add an object to a collection + * + * @param type $field + * @param assoc $args + */ + private function add($field, $args) + { + $this->initializeDoctrine(); + + if ($this->cm->hasAssociation($field) && $this->cm->isCollectionValuedAssociation($field)) { + $targetClass = $this->cm->getAssociationTargetClass($field); + if (!($args[0] instanceof $targetClass)) { + throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); + } + if (!($this->$field instanceof Collection)) { + $this->$field = new ArrayCollection($this->$field ?: array()); + } + $this->$field->add($args[0]); + $this->completeOwningSide($field, $targetClass, $args[0]); + } else { + throw new \BadMethodCallException("There is no method add".$field."() on ".$this->cm->getName()); + } + } + + /** + * Initialize Doctrine Metadata for this class. + * + * @return void + */ + private function initializeDoctrine() + { + if ($this->cm !== null) { + return; + } + + if (!self::$objectManager) { + throw new \RuntimeException("No runtime object manager set. Call PersistentObject#setObjectManager()."); + } + + $this->cm = self::$objectManager->getClassMetadata(get_class($this)); + } + + /** + * Magic method that implements + * + * @param string $method + * @param array $args + * @return mixed + */ + public function __call($method, $args) + { + $command = substr($method, 0, 3); + $field = lcfirst(substr($method, 3)); + if ($command == "set") { + $this->set($field, $args); + } else if ($command == "get") { + return $this->get($field); + } else if ($command == "add") { + $this->add($field, $args); + } else { + throw new \BadMethodCallException("There is no method ".$method." on ".$this->cm->getName()); + } + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php new file mode 100644 index 00000000..726979fc --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php @@ -0,0 +1,60 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Interface for proxy classes. + * + * @author Roman Borschel + * @since 2.2 + */ +interface Proxy +{ + /** + * Marker for Proxy class names. + * + * @var string + */ + const MARKER = '__CG__'; + + /** + * Length of the proxy marker + * + * @var int + */ + const MARKER_LENGTH = 6; + + /** + * Initialize this proxy if its not yet initialized. + * + * Acts as a no-op if already initialized. + * + * @return void + */ + public function __load(); + + /** + * Is this proxy initialized or not. + * + * @return bool + */ + public function __isInitialized(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php b/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php new file mode 100644 index 00000000..87c5b413 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php @@ -0,0 +1,48 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Contract for classes that are potential listeners of a NotifyPropertyChanged + * implementor. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface PropertyChangedListener +{ + /** + * Notifies the listener of a property change. + * + * @param object $sender The object on which the property changed. + * @param string $propertyName The name of the property that changed. + * @param mixed $oldValue The old value of the property that changed. + * @param mixed $newValue The new value of the property that changed. + */ + function propertyChanged($sender, $propertyName, $oldValue, $newValue); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php new file mode 100644 index 00000000..c3462782 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php @@ -0,0 +1,103 @@ +. + */ + +namespace Doctrine\Common\Util; + +use Doctrine\Common\Persistence\Proxy; + +/** + * Class and reflection related functionality for objects that + * might or not be proxy objects at the moment. + * + * @author Benjamin Eberlei + * @author Johannes Schmitt + */ +class ClassUtils +{ + /** + * Get the real class name of a class name that could be a proxy. + * + * @param string + * @return string + */ + public static function getRealClass($class) + { + if (false === $pos = strrpos($class, '\\'.Proxy::MARKER.'\\')) { + return $class; + } + + return substr($class, $pos + Proxy::MARKER_LENGTH + 2); + } + + /** + * Get the real class name of an object (even if its a proxy) + * + * @param object + * @return string + */ + public static function getClass($object) + { + return self::getRealClass(get_class($object)); + } + + /** + * Get the real parent class name of a class or object + * + * @param string + * @return string + */ + public static function getParentClass($className) + { + return get_parent_class( self::getRealClass( $className ) ); + } + + /** + * Create a new reflection class + * + * @param string + * @return ReflectionClass + */ + public static function newReflectionClass($class) + { + return new \ReflectionClass( self::getRealClass( $class ) ); + } + + /** + * Create a new reflection object + * + * @param object + * @return ReflectionObject + */ + public static function newReflectionObject($object) + { + return self::newReflectionClass( self::getClass( $object ) ); + } + + /** + * Given a class name and a proxy namespace return the proxy name. + * + * @param string $className + * @param string $proxyNamespace + * @return string + */ + public static function generateProxyClassName($className, $proxyNamespace) + { + return rtrim($proxyNamespace, '\\') . '\\'.Proxy::MARKER.'\\' . ltrim($className, '\\'); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php new file mode 100644 index 00000000..57ae3120 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php @@ -0,0 +1,123 @@ +. + */ + +namespace Doctrine\Common\Util; + +/** + * Static class containing most used debug methods. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Giorgio Sironi + */ +final class Debug +{ + /** + * Private constructor (prevents from instantiation) + * + */ + private function __construct() {} + + /** + * Prints a dump of the public, protected and private properties of $var. + * + * @static + * @link http://xdebug.org/ + * @param mixed $var + * @param integer $maxDepth Maximum nesting level for object properties + * @param boolean $stripTags Flag that indicate if output should strip HTML tags + */ + public static function dump($var, $maxDepth = 2, $stripTags = true) + { + ini_set('html_errors', 'On'); + + if (extension_loaded('xdebug')) { + ini_set('xdebug.var_display_max_depth', $maxDepth); + } + + $var = self::export($var, $maxDepth++); + + ob_start(); + var_dump($var); + $dump = ob_get_contents(); + ob_end_clean(); + + echo ($stripTags ? strip_tags(html_entity_decode($dump)) : $dump); + + ini_set('html_errors', 'Off'); + } + + public static function export($var, $maxDepth) + { + $return = null; + $isObj = is_object($var); + + if ($isObj && in_array('Doctrine\Common\Collections\Collection', class_implements($var))) { + $var = $var->toArray(); + } + + if ($maxDepth) { + if (is_array($var)) { + $return = array(); + + foreach ($var as $k => $v) { + $return[$k] = self::export($v, $maxDepth - 1); + } + } else if ($isObj) { + $return = new \stdclass(); + if ($var instanceof \DateTime) { + $return->__CLASS__ = "DateTime"; + $return->date = $var->format('c'); + $return->timezone = $var->getTimeZone()->getName(); + } else { + $reflClass = ClassUtils::newReflectionObject($var); + $return->__CLASS__ = ClassUtils::getClass($var); + + if ($var instanceof \Doctrine\Common\Persistence\Proxy) { + $return->__IS_PROXY__ = true; + $return->__PROXY_INITIALIZED__ = $var->__isInitialized(); + } + + foreach ($reflClass->getProperties() as $reflProperty) { + $name = $reflProperty->getName(); + + $reflProperty->setAccessible(true); + $return->$name = self::export($reflProperty->getValue($var), $maxDepth - 1); + } + } + } else { + $return = $var; + } + } else { + $return = is_object($var) ? get_class($var) + : (is_array($var) ? 'Array(' . count($var) . ')' : $var); + } + + return $return; + } + + public static function toString($obj) + { + return method_exists('__toString', $obj) ? (string) $obj : get_class($obj) . '@' . spl_object_hash($obj); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php new file mode 100644 index 00000000..ba1eb17b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php @@ -0,0 +1,72 @@ +. + */ + +namespace Doctrine\Common\Util; + +/** + * Doctrine inflector has static methods for inflecting text + * + * The methods in these classes are from several different sources collected + * across several different php projects and several different authors. The + * original author names and emails are not known + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 1.0 + * @version $Revision: 3189 $ + * @author Konsta Vesterinen + * @author Jonathan H. Wage + */ +class Inflector +{ + /** + * Convert word in to the format for a Doctrine table name. Converts 'ModelName' to 'model_name' + * + * @param string $word Word to tableize + * @return string $word Tableized word + */ + public static function tableize($word) + { + return strtolower(preg_replace('~(?<=\\w)([A-Z])~', '_$1', $word)); + } + + /** + * Convert a word in to the format for a Doctrine class name. Converts 'table_name' to 'TableName' + * + * @param string $word Word to classify + * @return string $word Classified word + */ + public static function classify($word) + { + return str_replace(" ", "", ucwords(strtr($word, "_-", " "))); + } + + /** + * Camelize a word. This uses the classify() method and turns the first character to lowercase + * + * @param string $word + * @return string $word + */ + public static function camelize($word) + { + return lcfirst(self::classify($word)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Version.php b/vendor/doctrine/common/lib/Doctrine/Common/Version.php new file mode 100644 index 00000000..7a87311f --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Version.php @@ -0,0 +1,55 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Class to store and retrieve the version of Doctrine + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class Version +{ + /** + * Current Doctrine Version + */ + const VERSION = '2.2.3'; + + /** + * Compares a Doctrine version with the current one. + * + * @param string $version Doctrine version to compare. + * @return int Returns -1 if older, 0 if it is the same, 1 if version + * passed as argument is newer. + */ + public static function compare($version) + { + $currentVersion = str_replace(' ', '', strtolower(self::VERSION)); + $version = str_replace(' ', '', $version); + + return version_compare($version, $currentVersion); + } +} diff --git a/vendor/doctrine/common/phpunit.xml.dist b/vendor/doctrine/common/phpunit.xml.dist new file mode 100644 index 00000000..b9d3b340 --- /dev/null +++ b/vendor/doctrine/common/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + ./tests/Doctrine/ + + + + + + ./lib/Doctrine/ + + + + + + performance + + + diff --git a/vendor/doctrine/common/tests/.gitignore b/vendor/doctrine/common/tests/.gitignore new file mode 100644 index 00000000..72104052 --- /dev/null +++ b/vendor/doctrine/common/tests/.gitignore @@ -0,0 +1,3 @@ +Doctrine/Tests/Proxies/ +Doctrine/Tests/ORM/Proxy/generated/ +Doctrine/Tests/ORM/Tools/Export/export diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php new file mode 100644 index 00000000..0a329a3c --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php @@ -0,0 +1,538 @@ +getReader(); + + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\DummyClass'); + $this->assertEquals(1, count($reader->getClassAnnotations($class))); + $this->assertInstanceOf($annotName = 'Doctrine\Tests\Common\Annotations\DummyAnnotation', $annot = $reader->getClassAnnotation($class, $annotName)); + $this->assertEquals("hello", $annot->dummyValue); + + $field1Prop = $class->getProperty('field1'); + $propAnnots = $reader->getPropertyAnnotations($field1Prop); + $this->assertEquals(1, count($propAnnots)); + $this->assertInstanceOf($annotName, $annot = $reader->getPropertyAnnotation($field1Prop, $annotName)); + $this->assertEquals("fieldHello", $annot->dummyValue); + + $getField1Method = $class->getMethod('getField1'); + $methodAnnots = $reader->getMethodAnnotations($getField1Method); + $this->assertEquals(1, count($methodAnnots)); + $this->assertInstanceOf($annotName, $annot = $reader->getMethodAnnotation($getField1Method, $annotName)); + $this->assertEquals(array(1, 2, "three"), $annot->value); + + $field2Prop = $class->getProperty('field2'); + $propAnnots = $reader->getPropertyAnnotations($field2Prop); + $this->assertEquals(1, count($propAnnots)); + $this->assertInstanceOf($annotName = 'Doctrine\Tests\Common\Annotations\DummyJoinTable', $joinTableAnnot = $reader->getPropertyAnnotation($field2Prop, $annotName)); + $this->assertEquals(1, count($joinTableAnnot->joinColumns)); + $this->assertEquals(1, count($joinTableAnnot->inverseJoinColumns)); + $this->assertTrue($joinTableAnnot->joinColumns[0] instanceof DummyJoinColumn); + $this->assertTrue($joinTableAnnot->inverseJoinColumns[0] instanceof DummyJoinColumn); + $this->assertEquals('col1', $joinTableAnnot->joinColumns[0]->name); + $this->assertEquals('col2', $joinTableAnnot->joinColumns[0]->referencedColumnName); + $this->assertEquals('col3', $joinTableAnnot->inverseJoinColumns[0]->name); + $this->assertEquals('col4', $joinTableAnnot->inverseJoinColumns[0]->referencedColumnName); + + $dummyAnnot = $reader->getMethodAnnotation($class->getMethod('getField1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('', $dummyAnnot->dummyValue); + $this->assertEquals(array(1, 2, 'three'), $dummyAnnot->value); + + $dummyAnnot = $reader->getPropertyAnnotation($class->getProperty('field1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('fieldHello', $dummyAnnot->dummyValue); + + $classAnnot = $reader->getClassAnnotation($class, 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('hello', $classAnnot->dummyValue); + } + + public function testAnnotationsWithValidTargets() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithValidAnnotationTarget'); + + $this->assertEquals(1,count($reader->getClassAnnotations($class))); + $this->assertEquals(1,count($reader->getPropertyAnnotations($class->getProperty('foo')))); + $this->assertEquals(1,count($reader->getMethodAnnotations($class->getMethod('someFunction')))); + $this->assertEquals(1,count($reader->getPropertyAnnotations($class->getProperty('nested')))); + } + + public function testAnnotationsWithVarType() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $this->assertEquals(1,count($fooAnnot = $reader->getPropertyAnnotations($class->getProperty('foo')))); + $this->assertEquals(1,count($barAnnot = $reader->getMethodAnnotations($class->getMethod('bar')))); + + $this->assertInternalType('string', $fooAnnot[0]->string); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', $barAnnot[0]->annotation); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetPropertyMethod is not allowed to be declared on class Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass. You may only use this annotation on these code elements: METHOD, PROPERTY + */ + public function testClassWithInvalidAnnotationTargetAtClassDocBlock() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetClass is not allowed to be declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty::$foo. You may only use this annotation on these code elements: CLASS + */ + public function testClassWithInvalidAnnotationTargetAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty', 'foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetAnnotation is not allowed to be declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty::$bar. You may only use this annotation on these code elements: ANNOTATION + */ + public function testClassWithInvalidNestedAnnotationTargetAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty', 'bar')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetClass is not allowed to be declared on method Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod::functionName(). You may only use this annotation on these code elements: CLASS + */ + public function testClassWithInvalidAnnotationTargetAtMethodDocBlock() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod', 'functionName')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtClassDocBlock() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError','foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtMethodDocBlock() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError','bar')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Type Error] Attribute "string" of @AnnotationWithVarType declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType::$invalidProperty expects a(n) string, but got integer. + */ + public function testClassWithPropertyInvalidVarTypeError() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $reader->getPropertyAnnotations($class->getProperty('invalidProperty')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Type Error] Attribute "annotation" of @AnnotationWithVarType declared on method Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType::invalidMethod() expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll, but got an instance of Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. + */ + public function testClassWithMethodInvalidVarTypeError() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $reader->getMethodAnnotations($class->getMethod('invalidMethod')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in class Doctrine\Tests\Common\Annotations\DummyClassSyntaxError. + */ + public function testClassSyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\DummyClassSyntaxError')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in method Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError::foo(). + */ + public function testMethodSyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError', 'foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in property Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError::$foo. + */ + public function testPropertySyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError', 'foo')); + } + + /** + * @group regression + */ + public function testMultipleAnnotationsOnSameLine() + { + $reader = $this->getReader(); + $annots = $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClass2', 'id')); + $this->assertEquals(3, count($annots)); + } + + public function testNonAnnotationProblem() + { + $reader = $this->getReader(); + + $this->assertNotNull($annot = $reader->getPropertyAnnotation(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClassNonAnnotationProblem', 'foo'), $name = 'Doctrine\Tests\Common\Annotations\DummyAnnotation')); + $this->assertInstanceOf($name, $annot); + } + + public function testImportWithConcreteAnnotation() + { + $reader = $this->getReader(); + $property = new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestImportWithConcreteAnnotation', 'field'); + $annotations = $reader->getPropertyAnnotations($property); + $this->assertEquals(1, count($annotations)); + $this->assertNotNull($reader->getPropertyAnnotation($property, 'Doctrine\Tests\Common\Annotations\DummyAnnotation')); + } + + public function testImportWithInheritance() + { + $reader = $this->getReader(); + + $class = new TestParentClass(); + $ref = new \ReflectionClass($class); + + $childAnnotations = $reader->getPropertyAnnotations($ref->getProperty('child')); + $this->assertEquals(1, count($childAnnotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Foo\Name', reset($childAnnotations)); + + $parentAnnotations = $reader->getPropertyAnnotations($ref->getProperty('parent')); + $this->assertEquals(1, count($parentAnnotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Bar\Name', reset($parentAnnotations)); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation "@NameFoo" in property Doctrine\Tests\Common\Annotations\TestAnnotationNotImportedClass::$field was never imported. + */ + public function testImportDetectsNotImportedAnnotation() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestAnnotationNotImportedClass', 'field')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation "@Foo\Bar\Name" in property Doctrine\Tests\Common\Annotations\TestNonExistentAnnotationClass::$field was never imported. + */ + public function testImportDetectsNonExistentAnnotation() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestNonExistentAnnotationClass', 'field')); + } + + public function testTopLevelAnnotation() + { + $reader = $this->getReader(); + $annotations = $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestTopLevelAnnotationClass', 'field')); + + $this->assertEquals(1, count($annotations)); + $this->assertInstanceOf('\TopLevelAnnotation', reset($annotations)); + } + + public function testIgnoresAnnotationsNotPrefixedWithWhitespace() + { + $reader = $this->getReader(); + + $annotation = $reader->getClassAnnotation(new \ReflectionClass(new TestIgnoresNonAnnotationsClass()), 'Doctrine\Tests\Common\Annotations\Name'); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Name', $annotation); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The class "Doctrine\Tests\Common\Annotations\Fixtures\NoAnnotation" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "Doctrine\Tests\Common\Annotations\Fixtures\NoAnnotation". If it is indeed no annotation, then you need to add @IgnoreAnnotation("NoAnnotation") to the _class_ doc comment of class Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageClass. + */ + public function testErrorWhenInvalidAnnotationIsUsed() + { + $reader = $this->getReader(); + $ref = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageClass'); + $reader->getClassAnnotations($ref); + } + + public function testInvalidAnnotationUsageButIgnoredClass() + { + $reader = $this->getReader(); + $ref = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageButIgnoredClass'); + $annots = $reader->getClassAnnotations($ref); + + $this->assertEquals(2, count($annots)); + } + + /** + * @group DDC-1660 + * @group regression + */ + public function testInvalidAnnotationButIgnored() + { + $reader = $this->getReader(); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassDDC1660'); + + $this->assertTrue(class_exists('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Version')); + $this->assertCount(0, $reader->getClassAnnotations($class)); + $this->assertCount(0, $reader->getMethodAnnotations($class->getMethod('bar'))); + $this->assertCount(0, $reader->getPropertyAnnotations($class->getProperty('foo'))); + } + + abstract protected function getReader(); +} + +/** + * @parseAnnotation("var") + * @author Johannes M. Schmitt + * + */ +class TestParseAnnotationClass +{ + /** + * @var + */ + private $field; +} + +/** + * @Name + * @author Johannes M. Schmitt + */ +class TestIgnoresNonAnnotationsClass +{ +} + +class TestTopLevelAnnotationClass +{ + /** + * @\TopLevelAnnotation + */ + private $field; +} + +class TestNonExistentAnnotationClass +{ + /** + * @Foo\Bar\Name + */ + private $field; +} + +class TestAnnotationNotImportedClass +{ + /** + * @NameFoo + */ + private $field; +} + +class TestChildClass +{ + /** + * @\Doctrine\Tests\Common\Annotations\Foo\Name(name = "foo") + */ + protected $child; +} + +class TestParentClass extends TestChildClass +{ + /** + * @\Doctrine\Tests\Common\Annotations\Bar\Name(name = "bar") + */ + private $parent; +} + +class TestImportWithConcreteAnnotation +{ + /** + * @DummyAnnotation(dummyValue = "bar") + */ + private $field; +} + +/** + * A description of this class. + * + * Let's see if the parser recognizes that this @ is not really referring to an + * annotation. Also make sure that @var \ is not concated to "@var\is". + * + * @author robo + * @since 2.0 + * @DummyAnnotation(dummyValue="hello") + */ +class DummyClass { + /** + * A nice property. + * + * @var mixed + * @DummyAnnotation(dummyValue="fieldHello") + */ + private $field1; + + /** + * @DummyJoinTable(name="join_table", + * joinColumns={@DummyJoinColumn(name="col1", referencedColumnName="col2")}, + * inverseJoinColumns={ + * @DummyJoinColumn(name="col3", referencedColumnName="col4") + * }) + */ + private $field2; + + /** + * Gets the value of field1. + * + * @return mixed + * @DummyAnnotation({1,2,"three"}) + */ + public function getField1() { + } +} + +/** + * @ignoreAnnotation("var") + */ +class DummyClass2 { + /** + * @DummyId @DummyColumn(type="integer") @DummyGeneratedValue + * @var integer + */ + private $id; +} + +/** @Annotation */ +class DummyId extends \Doctrine\Common\Annotations\Annotation {} +/** @Annotation */ +class DummyColumn extends \Doctrine\Common\Annotations\Annotation { + public $type; +} +/** @Annotation */ +class DummyGeneratedValue extends \Doctrine\Common\Annotations\Annotation {} +/** @Annotation */ +class DummyAnnotation extends \Doctrine\Common\Annotations\Annotation { + public $dummyValue; +} +/** @Annotation */ +class DummyJoinColumn extends \Doctrine\Common\Annotations\Annotation { + public $name; + public $referencedColumnName; +} +/** @Annotation */ +class DummyJoinTable extends \Doctrine\Common\Annotations\Annotation { + public $name; + public $joinColumns; + public $inverseJoinColumns; +} + +/** + * @DummyAnnotation(@) + */ +class DummyClassSyntaxError +{ + +} + +class DummyClassMethodSyntaxError +{ + /** + * @DummyAnnotation(@) + */ + public function foo() + { + + } +} + +class DummyClassPropertySyntaxError +{ + /** + * @DummyAnnotation(@) + */ + public $foo; +} + +/** + * @ignoreAnnotation({"since", "var"}) + */ +class DummyClassNonAnnotationProblem +{ + /** + * @DummyAnnotation + * + * @var \Test + * @since 0.1 + */ + public $foo; +} + + +/** +* @DummyAnnotation Foo bar +*/ +class DummyClassWithEmail +{ + +} + +namespace Doctrine\Tests\Common\Annotations\Foo; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation +{ + public $name; +} + +namespace Doctrine\Tests\Common\Annotations\Bar; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation +{ + public $name; +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php new file mode 100644 index 00000000..d2cc6678 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php @@ -0,0 +1,13 @@ +getMock('Doctrine\Common\Cache\Cache'); + $cache + ->expects($this->at(0)) + ->method('fetch') + ->with($this->equalTo($cacheKey)) + ->will($this->returnValue(array())) + ; + $cache + ->expects($this->at(1)) + ->method('fetch') + ->with($this->equalTo('[C]'.$cacheKey)) + ->will($this->returnValue(time() - 10)) + ; + $cache + ->expects($this->at(2)) + ->method('save') + ->with($this->equalTo($cacheKey)) + ; + $cache + ->expects($this->at(3)) + ->method('save') + ->with($this->equalTo('[C]'.$cacheKey)) + ; + + $reader = new CachedReader(new AnnotationReader(), $cache, true); + $route = new Route(); + $route->pattern = '/someprefix'; + $this->assertEquals(array($route), $reader->getClassAnnotations(new \ReflectionClass($name))); + } + + protected function getReader() + { + $this->cache = new ArrayCache(); + return new CachedReader(new AnnotationReader(), $this->cache); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php new file mode 100644 index 00000000..cb080f08 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php @@ -0,0 +1,27 @@ +setInput("@Name"); + $this->assertNull($lexer->token); + $this->assertNull($lexer->lookahead); + + $this->assertTrue($lexer->moveNext()); + $this->assertNull($lexer->token); + $this->assertEquals('@', $lexer->lookahead['value']); + + $this->assertTrue($lexer->moveNext()); + $this->assertEquals('@', $lexer->token['value']); + $this->assertEquals('Name', $lexer->lookahead['value']); + + $this->assertFalse($lexer->moveNext()); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php new file mode 100644 index 00000000..56cae7fd --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php @@ -0,0 +1,1118 @@ +createTestParser(); + + // Nested arrays with nested annotations + $result = $parser->parse('@Name(foo={1,2, {"key"=@Name}})'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertNull($annot->value); + $this->assertEquals(3, count($annot->foo)); + $this->assertEquals(1, $annot->foo[0]); + $this->assertEquals(2, $annot->foo[1]); + $this->assertTrue(is_array($annot->foo[2])); + + $nestedArray = $annot->foo[2]; + $this->assertTrue(isset($nestedArray['key'])); + $this->assertTrue($nestedArray['key'] instanceof Name); + } + + public function testBasicAnnotations() + { + $parser = $this->createTestParser(); + + // Marker annotation + $result = $parser->parse("@Name"); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertNull($annot->value); + $this->assertNull($annot->foo); + + // Associative arrays + $result = $parser->parse('@Name(foo={"key1" = "value1"})'); + $annot = $result[0]; + $this->assertNull($annot->value); + $this->assertTrue(is_array($annot->foo)); + $this->assertTrue(isset($annot->foo['key1'])); + + // Numerical arrays + $result = $parser->parse('@Name({2="foo", 4="bar"})'); + $annot = $result[0]; + $this->assertTrue(is_array($annot->value)); + $this->assertEquals('foo', $annot->value[2]); + $this->assertEquals('bar', $annot->value[4]); + $this->assertFalse(isset($annot->value[0])); + $this->assertFalse(isset($annot->value[1])); + $this->assertFalse(isset($annot->value[3])); + + // Multiple values + $result = $parser->parse('@Name(@Name, @Name)'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertTrue(is_array($annot->value)); + $this->assertTrue($annot->value[0] instanceof Name); + $this->assertTrue($annot->value[1] instanceof Name); + + // Multiple types as values + $result = $parser->parse('@Name(foo="Bar", @Name, {"key1"="value1", "key2"="value2"})'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertTrue(is_array($annot->value)); + $this->assertTrue($annot->value[0] instanceof Name); + $this->assertTrue(is_array($annot->value[1])); + $this->assertEquals('value1', $annot->value[1]['key1']); + $this->assertEquals('value2', $annot->value[1]['key2']); + + // Complete docblock + $docblock = <<parse($docblock); + $this->assertEquals(1, count($result)); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + $this->assertNull($annot->value); + } + + public function testNamespacedAnnotations() + { + $parser = new DocParser; + $parser->setIgnoreNotImportedAnnotations(true); + + $docblock = << + * @Doctrine\Tests\Common\Annotations\Name(foo="bar") + * @ignore + */ +DOCBLOCK; + + $result = $parser->parse($docblock); + $this->assertEquals(1, count($result)); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + } + + /** + * @group debug + */ + public function testTypicalMethodDocBlock() + { + $parser = $this->createTestParser(); + + $docblock = <<parse($docblock); + $this->assertEquals(2, count($result)); + $this->assertTrue(isset($result[0])); + $this->assertTrue(isset($result[1])); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + $marker = $result[1]; + $this->assertTrue($marker instanceof Marker); + } + + + public function testAnnotationWithoutConstructor() + { + $parser = $this->createTestParser(); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertNotNull($annot); + $this->assertTrue($annot instanceof SomeAnnotationClassNameWithoutConstructor); + + $this->assertNull($annot->name); + $this->assertNotNull($annot->data); + $this->assertEquals($annot->data, "Some data"); + + + + +$docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertNotNull($annot); + $this->assertTrue($annot instanceof SomeAnnotationClassNameWithoutConstructor); + + $this->assertEquals($annot->name, "Some Name"); + $this->assertEquals($annot->data, "Some data"); + + + + +$docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->data, "Some data"); + $this->assertNull($annot->name); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertNull($annot->data); + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->data, "Some data"); + $this->assertNull($annot->name); + + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertEquals($annot->data, "Some data"); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertEquals($annot->data, "Some data"); + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $this->assertTrue($result[0] instanceof SomeAnnotationClassNameWithoutConstructorAndProperties); + } + + public function testAnnotationTarget() + { + + $parser = new DocParser; + $parser->setImports(array( + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations\Fixtures', + )); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithValidAnnotationTarget'); + + + $context = 'class ' . $class->getName(); + $docComment = $class->getDocComment(); + + $parser->setTarget(Target::TARGET_CLASS); + $this->assertNotNull($parser->parse($docComment,$context)); + + + $property = $class->getProperty('foo'); + $docComment = $property->getDocComment(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + + $parser->setTarget(Target::TARGET_PROPERTY); + $this->assertNotNull($parser->parse($docComment,$context)); + + + + $method = $class->getMethod('someFunction'); + $docComment = $property->getDocComment(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + + $parser->setTarget(Target::TARGET_METHOD); + $this->assertNotNull($parser->parse($docComment,$context)); + + + try { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass'); + $context = 'class ' . $class->getName(); + $docComment = $class->getDocComment(); + + $parser->setTarget(Target::TARGET_CLASS); + $parser->parse($class->getDocComment(),$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + + try { + + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod'); + $method = $class->getMethod('functionName'); + $docComment = $method->getDocComment(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + + $parser->setTarget(Target::TARGET_METHOD); + $parser->parse($docComment,$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + + try { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty'); + $property = $class->getProperty('foo'); + $docComment = $property->getDocComment(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + + $parser->setTarget(Target::TARGET_PROPERTY); + $parser->parse($docComment,$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + } + + public function getAnnotationVarTypeProviderValid() + { + //({attribute name}, {attribute value}) + return array( + // mixed type + array('mixed', '"String Value"'), + array('mixed', 'true'), + array('mixed', 'false'), + array('mixed', '1'), + array('mixed', '1.2'), + array('mixed', '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll'), + + // boolean type + array('boolean', 'true'), + array('boolean', 'false'), + + // alias for internal type boolean + array('bool', 'true'), + array('bool', 'false'), + + // integer type + array('integer', '0'), + array('integer', '1'), + array('integer', '123456789'), + array('integer', '9223372036854775807'), + + // alias for internal type double + array('float', '0.1'), + array('float', '1.2'), + array('float', '123.456'), + + // string type + array('string', '"String Value"'), + array('string', '"true"'), + array('string', '"123"'), + + // array type + array('array', '{@AnnotationExtendsAnnotationTargetAll}'), + array('array', '{@AnnotationExtendsAnnotationTargetAll,@AnnotationExtendsAnnotationTargetAll}'), + + array('arrayOfIntegers', '1'), + array('arrayOfIntegers', '{1}'), + array('arrayOfIntegers', '{1,2,3,4}'), + array('arrayOfAnnotations', '@AnnotationExtendsAnnotationTargetAll'), + array('arrayOfAnnotations', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll}'), + array('arrayOfAnnotations', '{@AnnotationExtendsAnnotationTargetAll, @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll}'), + + // annotation instance + array('annotation', '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll'), + array('annotation', '@AnnotationExtendsAnnotationTargetAll'), + ); + } + + public function getAnnotationVarTypeProviderInvalid() + { + //({attribute name}, {type declared type}, {attribute value} , {given type or class}) + return array( + // boolean type + array('boolean','boolean','1','integer'), + array('boolean','boolean','1.2','double'), + array('boolean','boolean','"str"','string'), + array('boolean','boolean','{1,2,3}','array'), + array('boolean','boolean','@Name', 'an instance of Doctrine\Tests\Common\Annotations\Name'), + + // alias for internal type boolean + array('bool','bool', '1','integer'), + array('bool','bool', '1.2','double'), + array('bool','bool', '"str"','string'), + array('bool','bool', '{"str"}','array'), + + // integer type + array('integer','integer', 'true','boolean'), + array('integer','integer', 'false','boolean'), + array('integer','integer', '1.2','double'), + array('integer','integer', '"str"','string'), + array('integer','integer', '{"str"}','array'), + array('integer','integer', '{1,2,3,4}','array'), + + // alias for internal type double + array('float','float', 'true','boolean'), + array('float','float', 'false','boolean'), + array('float','float', '123','integer'), + array('float','float', '"str"','string'), + array('float','float', '{"str"}','array'), + array('float','float', '{12.34}','array'), + array('float','float', '{1,2,3}','array'), + + // string type + array('string','string', 'true','boolean'), + array('string','string', 'false','boolean'), + array('string','string', '12','integer'), + array('string','string', '1.2','double'), + array('string','string', '{"str"}','array'), + array('string','string', '{1,2,3,4}','array'), + + // annotation instance + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'true','boolean'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'false','boolean'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '12','integer'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '1.2','double'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{"str"}','array'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{1,2,3,4}','array'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '@Name','an instance of Doctrine\Tests\Common\Annotations\Name'), + ); + } + + public function getAnnotationVarTypeArrayProviderInvalid() + { + //({attribute name}, {type declared type}, {attribute value} , {given type or class}) + return array( + array('arrayOfIntegers','integer', 'true','boolean'), + array('arrayOfIntegers','integer', 'false','boolean'), + array('arrayOfIntegers','integer', '{true,true}','boolean'), + array('arrayOfIntegers','integer', '{1,true}','boolean'), + array('arrayOfIntegers','integer', '{1,2,1.2}','double'), + array('arrayOfIntegers','integer', '{1,2,"str"}','string'), + + + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'true','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'false','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,true}','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,true}','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,1.2}','double'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,@AnnotationExtendsAnnotationTargetAll,"str"}','string'), + ); + } + + /** + * @dataProvider getAnnotationVarTypeProviderValid + */ + public function testAnnotationWithVarType($attribute, $value) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::$invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + $result = $parser->parse($docblock, $context); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType', $result[0]); + $this->assertNotNull($result[0]->$attribute); + } + + /** + * @dataProvider getAnnotationVarTypeProviderInvalid + */ + public function testAnnotationWithVarTypeError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType declared on property SomeClassName::invalidProperty. expects a(n) $type, but got $given.", $exc->getMessage()); + } + } + + + /** + * @dataProvider getAnnotationVarTypeArrayProviderInvalid + */ + public function testAnnotationWithVarTypeArrayError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType declared on property SomeClassName::invalidProperty. expects either a(n) $type, or an array of {$type}s, but got $given.", $exc->getMessage()); + } + } + + /** + * @dataProvider getAnnotationVarTypeProviderValid + */ + public function testAnnotationWithAttributes($attribute, $value) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::$invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + $result = $parser->parse($docblock, $context); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes', $result[0]); + $getter = "get".ucfirst($attribute); + $this->assertNotNull($result[0]->$getter()); + } + + /** + * @dataProvider getAnnotationVarTypeProviderInvalid + */ + public function testAnnotationWithAttributesError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes declared on property SomeClassName::invalidProperty. expects a(n) $type, but got $given.", $exc->getMessage()); + } + } + + + /** + * @dataProvider getAnnotationVarTypeArrayProviderInvalid + */ + public function testAnnotationWithAttributesWithVarTypeArrayError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes declared on property SomeClassName::invalidProperty. expects either a(n) $type, or an array of {$type}s, but got $given.", $exc->getMessage()); + } + } + + public function testAnnotationWithRequiredAttributes() + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $parser->setTarget(Target::TARGET_PROPERTY); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes("Some Value", annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + $result = $parser->parse($docblock); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes', $result[0]); + $this->assertEquals("Some Value",$result[0]->getValue()); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation', $result[0]->getAnnot()); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes("Some Value")'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "annot" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes declared on property SomeClassName::invalidProperty. expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. This value should not be null.', $exc->getMessage()); + } + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes(annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "value" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes declared on property SomeClassName::invalidProperty. expects a(n) string. This value should not be null.', $exc->getMessage()); + } + + } + + public function testAnnotationWithRequiredAttributesWithoutContructor() + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $parser->setTarget(Target::TARGET_PROPERTY); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor("Some Value", annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + $result = $parser->parse($docblock); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor', $result[0]); + $this->assertEquals("Some Value", $result[0]->value); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation', $result[0]->annot); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor("Some Value")'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "annot" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor declared on property SomeClassName::invalidProperty. expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. This value should not be null.', $exc->getMessage()); + } + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor(annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "value" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor declared on property SomeClassName::invalidProperty. expects a(n) string. This value should not be null.', $exc->getMessage()); + } + + } + + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation @SomeAnnotationClassNameWithoutConstructorAndProperties declared on does not accept any values, but got {"value":"Foo"}. + */ + public function testWithoutConstructorWhenIsNotDefaultValue() + { + $parser = $this->createTestParser(); + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation @SomeAnnotationClassNameWithoutConstructorAndProperties declared on does not accept any values, but got {"value":"Foo"}. + */ + public function testWithoutConstructorWhenHasNoProperties() + { + $parser = $this->createTestParser(); + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testAnnotationTargetSyntaxError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Invalid Target "Foo". Available targets: [ALL, CLASS, METHOD, PROPERTY, ANNOTATION] + */ + public function testAnnotationWithInvalidTargetDeclarationError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage @Target expects either a string value, or an array of strings, "NULL" given. + */ + public function testAnnotationWithTargetEmptyError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @group DDC-575 + */ + public function testRegressionDDC575() + { + $parser = $this->createTestParser(); + + $docblock = <<parse($docblock); + + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Name", $result[0]); + + $docblock = <<parse($docblock); + + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Name", $result[0]); + } + + /** + * @group DDC-77 + */ + public function testAnnotationWithoutClassIsIgnoredWithoutWarning() + { + $parser = new DocParser(); + $parser->setIgnoreNotImportedAnnotations(true); + $result = $parser->parse("@param"); + + $this->assertEquals(0, count($result)); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected PlainValue, got ''' at position 10. + */ + public function testAnnotationDontAcceptSingleQuotes() + { + $parser = $this->createTestParser(); + $parser->parse("@Name(foo='bar')"); + } + + /** + * @group DCOM-41 + */ + public function testAnnotationDoesntThrowExceptionWhenAtSignIsNotFollowedByIdentifier() + { + $parser = new DocParser(); + $result = $parser->parse("'@'"); + + $this->assertEquals(0, count($result)); + } + + /** + * @group DCOM-41 + * @expectedException Doctrine\Common\Annotations\AnnotationException + */ + public function testAnnotationThrowsExceptionWhenAtSignIsNotFollowedByIdentifierInNestedAnnotation() + { + $parser = new DocParser(); + $result = $parser->parse("@Doctrine\Tests\Common\Annotations\Name(@')"); + } + + /** + * @group DCOM-56 + */ + public function testAutoloadAnnotation() + { + $this->assertFalse(class_exists('Doctrine\Tests\Common\Annotations\Fixture\Annotation\Autoload', false), 'Pre-condition: Doctrine\Tests\Common\Annotations\Fixture\Annotation\Autoload not allowed to be loaded.'); + + $parser = new DocParser(); + + AnnotationRegistry::registerAutoloadNamespace('Doctrine\Tests\Common\Annotations\Fixtures\Annotation', __DIR__ . '/../../../../'); + + $parser->setImports(array( + 'autoload' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Autoload', + )); + $annotations = $parser->parse('@Autoload'); + + $this->assertEquals(1, count($annotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Autoload', $annotations[0]); + } + + public function createTestParser() + { + $parser = new DocParser(); + $parser->setIgnoreNotImportedAnnotations(true); + $parser->setImports(array( + 'name' => 'Doctrine\Tests\Common\Annotations\Name', + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations', + )); + + return $parser; + } + + /** + * @group DDC-78 + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected PlainValue, got ''' at position 10 in class \Doctrine\Tests\Common\Annotations\Name + */ + public function testSyntaxErrorWithContextDescription() + { + $parser = $this->createTestParser(); + $parser->parse("@Name(foo='bar')", "class \Doctrine\Tests\Common\Annotations\Name"); + } + + /** + * @group DDC-183 + */ + public function testSyntaxErrorWithUnknownCharacters() + { + $docblock = <<setInput(trim($docblock, '/ *')); + //var_dump($lexer); + + try { + $parser = $this->createTestParser(); + $result = $parser->parse($docblock); + } catch (Exception $e) { + $this->fail($e->getMessage()); + } + } + + /** + * @group DCOM-14 + */ + public function testIgnorePHPDocThrowTag() + { + $docblock = <<createTestParser(); + $result = $parser->parse($docblock); + } catch (Exception $e) { + $this->fail($e->getMessage()); + } + } + + /** + * @group DCOM-38 + */ + public function testCastInt() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=1234)"); + $annot = $result[0]; + $this->assertInternalType('int', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastNegativeInt() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=-1234)"); + $annot = $result[0]; + $this->assertInternalType('int', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastFloat() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastNegativeFloat() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=-1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->foo); + + $result = $parser->parse("@Marker(-1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->value); + } + + public function testReservedKeywordsInAnnotations() + { + $parser = $this->createTestParser(); + + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\True'); + $this->assertTrue($result[0] instanceof True); + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\False'); + $this->assertTrue($result[0] instanceof False); + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\Null'); + $this->assertTrue($result[0] instanceof Null); + + $result = $parser->parse('@True'); + $this->assertTrue($result[0] instanceof True); + $result = $parser->parse('@False'); + $this->assertTrue($result[0] instanceof False); + $result = $parser->parse('@Null'); + $this->assertTrue($result[0] instanceof Null); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Creation Error] The annotation @SomeAnnotationClassNameWithoutConstructor declared on some class does not have a property named "invalidaProperty". Available properties: data, name + */ + public function testSetValuesExeption() + { + $docblock = <<createTestParser()->parse($docblock, 'some class'); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Syntax Error] Expected Doctrine\Common\Annotations\DocLexer::T_IDENTIFIER or Doctrine\Common\Annotations\DocLexer::T_TRUE or Doctrine\Common\Annotations\DocLexer::T_FALSE or Doctrine\Common\Annotations\DocLexer::T_NULL, got '3.42' at position 5. + */ + public function testInvalidIdentifierInAnnotation() + { + $parser = $this->createTestParser(); + $parser->parse('@Foo\3.42'); + } + + public function testTrailingCommaIsAllowed() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Name({ + "Foo", + "Bar", + })'); + $this->assertEquals(1, count($annots)); + $this->assertEquals(array('Foo', 'Bar'), $annots[0]->value); + } + + public function testDefaultAnnotationValueIsNotOverwritten() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Doctrine\Tests\Common\Annotations\Fixtures\Annotation\AnnotWithDefaultValue'); + $this->assertEquals(1, count($annots)); + $this->assertEquals('bar', $annots[0]->foo); + } + + public function testArrayWithColon() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Name({"foo": "bar"})'); + $this->assertEquals(1, count($annots)); + $this->assertEquals(array('foo' => 'bar'), $annots[0]->value); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Syntax Error] Expected PlainValue, got 'foo:' at position 6. + */ + public function testColonNotAllowedOnTopLevel() + { + $parser = $this->createTestParser(); + $parser->parse('@Name(foo: "bar")'); + } +} + +/** @Annotation */ +class SomeAnnotationClassNameWithoutConstructor +{ + public $data; + public $name; +} + +/** @Annotation */ +class SomeAnnotationWithConstructorWithoutParams +{ + function __construct() + { + $this->data = "Some data"; + } + public $data; + public $name; +} + +/** @Annotation */ +class SomeAnnotationClassNameWithoutConstructorAndProperties{} + +/** + * @Annotation + * @Target("Foo") + */ +class AnnotationWithInvalidTargetDeclaration{} + +/** + * @Annotation + * @Target + */ +class AnnotationWithTargetEmpty{} + +/** @Annotation */ +class AnnotationExtendsAnnotationTargetAll extends \Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll +{ +} + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation { + public $foo; +} + +/** @Annotation */ +class Marker { + public $value; +} + +/** @Annotation */ +class True {} + +/** @Annotation */ +class False {} + +/** @Annotation */ +class Null {} + +namespace Doctrine\Tests\Common\Annotations\FooBar; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation { +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php new file mode 100644 index 00000000..c84344d8 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php @@ -0,0 +1,40 @@ +cacheDir = sys_get_temp_dir() . "/annotations_". uniqid(); + @mkdir($this->cacheDir); + return new FileCacheReader(new AnnotationReader(), $this->cacheDir); + } + + public function tearDown() + { + foreach (glob($this->cacheDir.'/*.php') AS $file) { + unlink($file); + } + rmdir($this->cacheDir); + } + + /** + * @group DCOM-81 + */ + public function testAttemptToCreateAnnotationCacheDir() + { + $this->cacheDir = sys_get_temp_dir() . "/not_existed_dir_". uniqid(); + + $this->assertFalse(is_dir($this->cacheDir)); + + $cache = new FileCacheReader(new AnnotationReader(), $this->cacheDir); + + $this->assertTrue(is_dir($this->cacheDir)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php new file mode 100644 index 00000000..44108e19 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php @@ -0,0 +1,10 @@ +roles = $values['value']; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php new file mode 100644 index 00000000..b507e602 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php @@ -0,0 +1,14 @@ +name = isset($values['value']) ? $values['value'] : null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php new file mode 100644 index 00000000..09ef0317 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php @@ -0,0 +1,11 @@ +"), + @Attribute("annotation", type = "Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll"), + @Attribute("arrayOfAnnotations", type = "array"), + }) + */ +final class AnnotationWithAttributes +{ + + public final function __construct(array $data) + { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + private $mixed; + private $boolean; + private $bool; + private $float; + private $string; + private $integer; + private $array; + private $annotation; + private $arrayOfIntegers; + private $arrayOfAnnotations; + + /** + * @return mixed + */ + public function getMixed() + { + return $this->mixed; + } + + /** + * @return boolean + */ + public function getBoolean() + { + return $this->boolean; + } + + /** + * @return bool + */ + public function getBool() + { + return $this->bool; + } + + /** + * @return float + */ + public function getFloat() + { + return $this->float; + } + + /** + * @return string + */ + public function getString() + { + return $this->string; + } + + public function getInteger() + { + return $this->integer; + } + + /** + * @return array + */ + public function getArray() + { + return $this->array; + } + + /** + * @return Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll + */ + public function getAnnotation() + { + return $this->annotation; + } + + /** + * @return array + */ + public function getArrayOfIntegers() + { + return $this->arrayOfIntegers; + } + + /** + * @return array + */ + public function getArrayOfAnnotations() + { + return $this->arrayOfAnnotations; + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php new file mode 100644 index 00000000..6eb1bc5a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php @@ -0,0 +1,50 @@ + $value) { + $this->$key = $value; + } + } + + /** + * @var string + */ + private $value; + + /** + * + * @var Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation + */ + private $annot; + + /** + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * @return Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation + */ + public function getAnnot() + { + return $this->annot; + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php new file mode 100644 index 00000000..bf458ee7 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php @@ -0,0 +1,24 @@ + + */ + public $arrayOfIntegers; + + /** + * @var array + */ + public $arrayOfAnnotations; + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php new file mode 100644 index 00000000..4e652e13 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php @@ -0,0 +1,30 @@ + + */ +class Controller +{ + /** + * @Route("/", name="_demo") + * @Template() + */ + public function indexAction() + { + return array(); + } + + /** + * @Route("/hello/{name}", name="_demo_hello") + * @Template() + */ + public function helloAction($name) + { + return array('name' => $name); + } + + /** + * @Route("/contact", name="_demo_contact") + * @Template() + */ + public function contactAction() + { + $form = ContactForm::create($this->get('form.context'), 'contact'); + + $form->bind($this->container->get('request'), $form); + if ($form->isValid()) { + $form->send($this->get('mailer')); + + $this->get('session')->setFlash('notice', 'Message sent!'); + + return new RedirectResponse($this->generateUrl('_demo')); + } + + return array('form' => $form); + } + + /** + * Creates the ACL for the passed object identity + * + * @param ObjectIdentityInterface $oid + * @return void + */ + private function createObjectIdentity(ObjectIdentityInterface $oid) + { + $classId = $this->createOrRetrieveClassId($oid->getType()); + + $this->connection->executeQuery($this->getInsertObjectIdentitySql($oid->getIdentifier(), $classId, true)); + } + + /** + * Returns the primary key for the passed class type. + * + * If the type does not yet exist in the database, it will be created. + * + * @param string $classType + * @return integer + */ + private function createOrRetrieveClassId($classType) + { + if (false !== $id = $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn()) { + return $id; + } + + $this->connection->executeQuery($this->getInsertClassSql($classType)); + + return $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn(); + } + + /** + * Returns the primary key for the passed security identity. + * + * If the security identity does not yet exist in the database, it will be + * created. + * + * @param SecurityIdentityInterface $sid + * @return integer + */ + private function createOrRetrieveSecurityIdentityId(SecurityIdentityInterface $sid) + { + if (false !== $id = $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn()) { + return $id; + } + + $this->connection->executeQuery($this->getInsertSecurityIdentitySql($sid)); + + return $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn(); + } + + /** + * Deletes all ACEs for the given object identity primary key. + * + * @param integer $oidPK + * @return void + */ + private function deleteAccessControlEntries($oidPK) + { + $this->connection->executeQuery($this->getDeleteAccessControlEntriesSql($oidPK)); + } + + /** + * Deletes the object identity from the database. + * + * @param integer $pk + * @return void + */ + private function deleteObjectIdentity($pk) + { + $this->connection->executeQuery($this->getDeleteObjectIdentitySql($pk)); + } + + /** + * Deletes all entries from the relations table from the database. + * + * @param integer $pk + * @return void + */ + private function deleteObjectIdentityRelations($pk) + { + $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk)); + } + + /** + * This regenerates the ancestor table which is used for fast read access. + * + * @param AclInterface $acl + * @return void + */ + private function regenerateAncestorRelations(AclInterface $acl) + { + $pk = $acl->getId(); + $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk)); + $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $pk)); + + $parentAcl = $acl->getParentAcl(); + while (null !== $parentAcl) { + $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $parentAcl->getId())); + + $parentAcl = $parentAcl->getParentAcl(); + } + } + + /** + * This processes changes on an ACE related property (classFieldAces, or objectFieldAces). + * + * @param string $name + * @param array $changes + * @return void + */ + private function updateFieldAceProperty($name, array $changes) + { + $sids = new \SplObjectStorage(); + $classIds = new \SplObjectStorage(); + $currentIds = array(); + foreach ($changes[1] as $field => $new) { + for ($i=0,$c=count($new); $i<$c; $i++) { + $ace = $new[$i]; + + if (null === $ace->getId()) { + if ($sids->contains($ace->getSecurityIdentity())) { + $sid = $sids->offsetGet($ace->getSecurityIdentity()); + } else { + $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity()); + } + + $oid = $ace->getAcl()->getObjectIdentity(); + if ($classIds->contains($oid)) { + $classId = $classIds->offsetGet($oid); + } else { + $classId = $this->createOrRetrieveClassId($oid->getType()); + } + + $objectIdentityId = $name === 'classFieldAces' ? null : $ace->getAcl()->getId(); + + $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, $field, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure())); + $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, $field, $i))->fetchColumn(); + $this->loadedAces[$aceId] = $ace; + + $aceIdProperty = new \ReflectionProperty('Symfony\Component\Security\Acl\Domain\Entry', 'id'); + $aceIdProperty->setAccessible(true); + $aceIdProperty->setValue($ace, intval($aceId)); + } else { + $currentIds[$ace->getId()] = true; + } + } + } + + foreach ($changes[0] as $old) { + for ($i=0,$c=count($old); $i<$c; $i++) { + $ace = $old[$i]; + + if (!isset($currentIds[$ace->getId()])) { + $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId())); + unset($this->loadedAces[$ace->getId()]); + } + } + } + } + + /** + * This processes changes on an ACE related property (classAces, or objectAces). + * + * @param string $name + * @param array $changes + * @return void + */ + private function updateAceProperty($name, array $changes) + { + list($old, $new) = $changes; + + $sids = new \SplObjectStorage(); + $classIds = new \SplObjectStorage(); + $currentIds = array(); + for ($i=0,$c=count($new); $i<$c; $i++) { + $ace = $new[$i]; + + if (null === $ace->getId()) { + if ($sids->contains($ace->getSecurityIdentity())) { + $sid = $sids->offsetGet($ace->getSecurityIdentity()); + } else { + $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity()); + } + + $oid = $ace->getAcl()->getObjectIdentity(); + if ($classIds->contains($oid)) { + $classId = $classIds->offsetGet($oid); + } else { + $classId = $this->createOrRetrieveClassId($oid->getType()); + } + + $objectIdentityId = $name === 'classAces' ? null : $ace->getAcl()->getId(); + + $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, null, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure())); + $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, null, $i))->fetchColumn(); + $this->loadedAces[$aceId] = $ace; + + $aceIdProperty = new \ReflectionProperty($ace, 'id'); + $aceIdProperty->setAccessible(true); + $aceIdProperty->setValue($ace, intval($aceId)); + } else { + $currentIds[$ace->getId()] = true; + } + } + + for ($i=0,$c=count($old); $i<$c; $i++) { + $ace = $old[$i]; + + if (!isset($currentIds[$ace->getId()])) { + $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId())); + unset($this->loadedAces[$ace->getId()]); + } + } + } + + /** + * Persists the changes which were made to ACEs to the database. + * + * @param \SplObjectStorage $aces + * @return void + */ + private function updateAces(\SplObjectStorage $aces) + { + foreach ($aces as $ace) { + $propertyChanges = $aces->offsetGet($ace); + $sets = array(); + + if (isset($propertyChanges['mask'])) { + $sets[] = sprintf('mask = %d', $propertyChanges['mask'][1]); + } + if (isset($propertyChanges['strategy'])) { + $sets[] = sprintf('granting_strategy = %s', $this->connection->quote($propertyChanges['strategy'])); + } + if (isset($propertyChanges['aceOrder'])) { + $sets[] = sprintf('ace_order = %d', $propertyChanges['aceOrder'][1]); + } + if (isset($propertyChanges['auditSuccess'])) { + $sets[] = sprintf('audit_success = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditSuccess'][1])); + } + if (isset($propertyChanges['auditFailure'])) { + $sets[] = sprintf('audit_failure = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditFailure'][1])); + } + + $this->connection->executeQuery($this->getUpdateAccessControlEntrySql($ace->getId(), $sets)); + } + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php new file mode 100644 index 00000000..bda2cc21 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php @@ -0,0 +1,15 @@ +test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test2() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test3() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test4() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test5() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test6() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test7() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test8() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test9() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test10() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test11() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test12() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test13() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test14() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test15() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test16() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test17() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test18() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test19() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test20() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test21() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test22() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test23() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test24() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test25() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test26() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test27() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test28() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test29() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test30() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test31() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test32() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test33() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test34() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test35() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test36() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test37() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test38() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test39() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php new file mode 100644 index 00000000..1dae104a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php @@ -0,0 +1,5 @@ +test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test2() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test3() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test4() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test5() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test6() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test7() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test8() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test9() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test10() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test11() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test12() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test13() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test14() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test15() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test16() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test17() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test18() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test19() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test20() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test21() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test22() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test23() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test24() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test25() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test26() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test27() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test28() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test29() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test30() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test31() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test32() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test33() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test34() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test35() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test36() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test37() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test38() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test39() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php new file mode 100644 index 00000000..58c5e6af --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php @@ -0,0 +1,13 @@ +getMethod(); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $reader->getMethodAnnotations($method); + } + $time = microtime(true) - $time; + + $this->printResults('cached reader (in-memory)', $time, $c); + } + + /** + * @group performance + */ + public function testCachedReadPerformanceWithFileCache() + { + $method = $this->getMethod(); + + // prime cache + $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir()); + $reader->getMethodAnnotations($method); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir()); + $reader->getMethodAnnotations($method); + clearstatcache(); + } + $time = microtime(true) - $time; + + $this->printResults('cached reader (file)', $time, $c); + } + + /** + * @group performance + */ + public function testReadPerformance() + { + $method = $this->getMethod(); + + $time = microtime(true); + for ($i=0,$c=150; $i<$c; $i++) { + $reader = new AnnotationReader(); + $reader->getMethodAnnotations($method); + } + $time = microtime(true) - $time; + + $this->printResults('reader', $time, $c); + } + + /** + * @group performance + */ + public function testDocParsePerformance() + { + $imports = array( + 'ignorephpdoc' => 'Annotations\Annotation\IgnorePhpDoc', + 'ignoreannotation' => 'Annotations\Annotation\IgnoreAnnotation', + 'route' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Route', + 'template' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Template', + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations\Fixtures', + ); + $ignored = array( + 'access', 'author', 'copyright', 'deprecated', 'example', 'ignore', + 'internal', 'link', 'see', 'since', 'tutorial', 'version', 'package', + 'subpackage', 'name', 'global', 'param', 'return', 'staticvar', + 'static', 'var', 'throws', 'inheritdoc', + ); + + $method = $this->getMethod(); + $methodComment = $method->getDocComment(); + $classComment = $method->getDeclaringClass()->getDocComment(); + + $time = microtime(true); + for ($i=0,$c=200; $i<$c; $i++) { + $parser = new DocParser(); + $parser->setImports($imports); + $parser->setIgnoredAnnotationNames($ignored); + $parser->setIgnoreNotImportedAnnotations(true); + + $parser->parse($methodComment); + $parser->parse($classComment); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser', $time, $c); + } + + /** + * @group performance + */ + public function testDocLexerPerformance() + { + $method = $this->getMethod(); + $methodComment = $method->getDocComment(); + $classComment = $method->getDeclaringClass()->getDocComment(); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $lexer = new DocLexer(); + $lexer->setInput($methodComment); + $lexer->setInput($classComment); + } + $time = microtime(true) - $time; + + $this->printResults('doc-lexer', $time, $c); + } + + /** + * @group performance + */ + public function testPhpParserPerformanceWithShortCut() + { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\NamespacedSingleClassLOC1000'); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $parser = new PhpParser(); + $parser->parseClass($class); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser-with-short-cut', $time, $c); + } + + /** + * @group performance + */ + public function testPhpParserPerformanceWithoutShortCut() + { + $class = new \ReflectionClass('SingleClassLOC1000'); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $parser = new PhpParser(); + $parser->parseClass($class); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser-without-short-cut', $time, $c); + } + + private function getMethod() + { + return new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\Controller', 'helloAction'); + } + + private function printResults($test, $time, $iterations) + { + if (0 == $iterations) { + throw new \InvalidArgumentException('$iterations cannot be zero.'); + } + + $title = $test." results:\n"; + $iterationsText = sprintf("Iterations: %d\n", $iterations); + $totalTime = sprintf("Total Time: %.3f s\n", $time); + $iterationTime = sprintf("Time per iteration: %.3f ms\n", $time/$iterations * 1000); + + $max = max(strlen($title), strlen($iterationTime)) - 1; + + echo "\n".str_repeat('-', $max)."\n"; + echo $title; + echo str_repeat('=', $max)."\n"; + echo $iterationsText; + echo $totalTime; + echo $iterationTime; + echo str_repeat('-', $max)."\n"; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php new file mode 100644 index 00000000..8de4aabf --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php @@ -0,0 +1,179 @@ +assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testParseClassWithMultipleImportsInUseStatement() + { + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\MultipleImportsInUseStatement'); + $parser = new PhpParser(); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testParseClassWhenNotUserDefined() + { + $parser = new PhpParser(); + $this->assertEquals(array(), $parser->parseClass(new \ReflectionClass('\stdClass'))); + } + + public function testParseClassWhenClassIsNotNamespaced() + { + $parser = new PhpParser(); + $class = new ReflectionClass('\AnnotationsTestsFixturesNonNamespacedClass'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testParseClassWhenClassIsInterface() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\TestInterface'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testClassWithFullyQualifiedUseStatements() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\ClassWithFullyQualifiedUseStatements'); + + $this->assertEquals(array( + 'secure' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testNamespaceAndClassCommentedOut() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceAndClassCommentedOut'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testEqualNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\EqualNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + ), $parser->parseClass($class)); + } + + public function testEqualNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\EqualNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testDifferentNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\DifferentNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testDifferentNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\DifferentNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testGlobalNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new \ReflectionClass('\GlobalNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + ), $parser->parseClass($class)); + } + + public function testGlobalNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass('\GlobalNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testNamespaceWithClosureDeclaration() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceWithClosureDeclaration'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testIfPointerResetsOnMultipleParsingTries() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceWithClosureDeclaration'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php new file mode 100644 index 00000000..376539ff --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php @@ -0,0 +1,97 @@ +getReader(); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassDDC1660'); + + $this->assertTrue(class_exists('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Version')); + $this->assertCount(1, $reader->getClassAnnotations($class)); + $this->assertCount(1, $reader->getMethodAnnotations($class->getMethod('bar'))); + $this->assertCount(1, $reader->getPropertyAnnotations($class->getProperty('foo'))); + } + + protected function getReader() + { + $reader = new SimpleAnnotationReader(); + $reader->addNamespace(__NAMESPACE__); + $reader->addNamespace(__NAMESPACE__ . '\Fixtures'); + $reader->addNamespace(__NAMESPACE__ . '\Fixtures\Annotation'); + + return $reader; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php new file mode 100644 index 00000000..a7b9e2f2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php @@ -0,0 +1,65 @@ +getClassAnnotations($class); + } + + public function testAnnotation() + { + $class = new \ReflectionClass(__NAMESPACE__ . '\\DCOM55Consumer'); + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $annots = $reader->getClassAnnotations($class); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf(__NAMESPACE__.'\\DCOM55Annotation', $annots[0]); + } + + public function testParseAnnotationDocblocks() + { + $class = new \ReflectionClass(__NAMESPACE__ . '\\DCOM55Annotation'); + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $annots = $reader->getClassAnnotations($class); + + $this->assertEquals(0, count($annots)); + } +} + +/** + * @Controller + */ +class Dummy +{ + +} + +/** + * @Annotation + */ +class DCOM55Annotation +{ + +} + +/** + * @DCOM55Annotation + */ +class DCOM55Consumer +{ + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php new file mode 100644 index 00000000..708bcc99 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php @@ -0,0 +1,8 @@ +getClassAnnotations(new \ReflectionClass(__NAMESPACE__."\MappedClass")); + + foreach ($result as $annot) { + $classAnnotations[get_class($annot)] = $annot; + } + + $this->assertTrue(!isset($classAnnotations['']), 'Class "xxx" is not a valid entity or mapped super class.'); + } + + public function testIssueGlobalNamespace() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->setImports(array( + "__NAMESPACE__" =>"Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping" + )); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + + public function testIssueNamespaces() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM"); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Entity", $annots[0]); + } + + public function testIssueMultipleNamespaces() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping"); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM"); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + + public function testIssueWithNamespacesOrImports() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Entity", $annots[0]); + $this->assertEquals(1, count($annots)); + } + + + public function testIssueSimpleAnnotationReader() + { + $reader = new \Doctrine\Common\Annotations\SimpleAnnotationReader(); + $reader->addNamespace('Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping'); + $annots = $reader->getClassAnnotations(new \ReflectionClass(__NAMESPACE__."\MappedClass")); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + +} + +/** + * @Entity + */ +class MappedClass +{ + +} + + +namespace Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping; +/** +* @Annotation +*/ +class Entity +{ + +} + +namespace Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM; +/** +* @Annotation +*/ +class Entity +{ + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php new file mode 100644 index 00000000..ff3ca376 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php @@ -0,0 +1,8 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of APC'); + } + } + + protected function _getCacheDriver() + { + return new ApcCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php new file mode 100644 index 00000000..71927174 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php @@ -0,0 +1,13 @@ +_getCacheDriver(); + + // Test save + $cache->save('test_key', 'testing this out'); + + // Test contains to test that save() worked + $this->assertTrue($cache->contains('test_key')); + + // Test fetch + $this->assertEquals('testing this out', $cache->fetch('test_key')); + + // Test delete + $cache->save('test_key2', 'test2'); + $cache->delete('test_key2'); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testDeleteAll() + { + $cache = $this->_getCacheDriver(); + $cache->save('test_key1', '1'); + $cache->save('test_key2', '2'); + $cache->deleteAll(); + + $this->assertFalse($cache->contains('test_key1')); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testFlushAll() + { + $cache = $this->_getCacheDriver(); + $cache->save('test_key1', '1'); + $cache->save('test_key2', '2'); + $cache->flushAll(); + + $this->assertFalse($cache->contains('test_key1')); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testNamespace() + { + $cache = $this->_getCacheDriver(); + $cache->setNamespace('test_'); + $cache->save('key1', 'test'); + + $this->assertTrue($cache->contains('key1')); + + $cache->setNamespace('test2_'); + + $this->assertFalse($cache->contains('key1')); + } + + /** + * @group DCOM-43 + */ + public function testGetStats() + { + if ($this instanceof ArrayCacheTest || $this instanceof ZendDataCacheTest ) { + $this->markTestSkipped("Statistics are not available for this driver"); + } + + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + + $this->assertArrayHasKey(Cache::STATS_HITS, $stats); + $this->assertArrayHasKey(Cache::STATS_MISSES, $stats); + $this->assertArrayHasKey(Cache::STATS_UPTIME, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_USAGE, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_AVAILIABLE, $stats); + } + + /** + * @return \Doctrine\Common\Cache\CacheProvider + */ + abstract protected function _getCacheDriver(); +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php new file mode 100644 index 00000000..362ff69a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php @@ -0,0 +1,38 @@ +_memcache = new \Memcache; + $ok = @$this->_memcache->connect('localhost', 11211); + if (!$ok) { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } else { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } + + public function testNoExpire() { + $cache = $this->_getCacheDriver(); + $cache->save('noexpire', 'value', 0); + sleep(1); + $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire'); + } + + protected function _getCacheDriver() + { + $driver = new MemcacheCache(); + $driver->setMemcache($this->_memcache); + return $driver; + } + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php new file mode 100644 index 00000000..947ba752 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php @@ -0,0 +1,40 @@ +memcached = new \Memcached(); + $this->memcached->setOption(\Memcached::OPT_COMPRESSION, false); + $this->memcached->addServer('127.0.0.1', 11211); + + $fh = @fsockopen('127.0.0.1', 11211); + if (!$fh) { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } else { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } + + public function testNoExpire() { + $cache = $this->_getCacheDriver(); + $cache->save('noexpire', 'value', 0); + sleep(1); + $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire'); + } + + protected function _getCacheDriver() + { + $driver = new MemcachedCache(); + $driver->setMemcached($this->memcached); + return $driver; + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php new file mode 100644 index 00000000..cb363df9 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of Wincache'); + } + } + + protected function _getCacheDriver() + { + return new WincacheCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php new file mode 100644 index 00000000..62598487 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of xcache'); + } + } + + protected function _getCacheDriver() + { + return new XcacheCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php new file mode 100644 index 00000000..27dcf359 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of Zend Data Cache which only works in apache2handler SAPI'); + } + } + + protected function _getCacheDriver() + { + return new ZendDataCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php new file mode 100644 index 00000000..567cf918 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php @@ -0,0 +1,45 @@ +setIncludePath(__DIR__); + $classLoader->setFileExtension('.class.php'); + $classLoader->setNamespaceSeparator('_'); + + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassA')); + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassB')); + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassC')); + $this->assertFalse($classLoader->canLoadClass('OtherClass')); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassA'), true); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassB'), true); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassC'), true); + } + + public function testClassExists() + { + $this->assertFalse(ClassLoader::classExists('ClassLoaderTest\ClassD')); + $badLoader = function($className) { + require __DIR__ . '/ClassLoaderTest/ClassD.php'; + return true; + }; + spl_autoload_register($badLoader); + $this->assertTrue(ClassLoader::classExists('ClassLoaderTest\ClassD')); + spl_autoload_unregister($badLoader); + } + + public function testGetClassLoader() + { + $cl = new ClassLoader('ClassLoaderTest', __DIR__); + $cl->register(); + $this->assertTrue(ClassLoader::getClassLoader('ClassLoaderTest\ClassD') instanceof \Doctrine\Common\ClassLoader); + $this->assertNull(ClassLoader::getClassLoader('This\Class\Does\Not\Exist')); + $cl->unregister(); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php new file mode 100644 index 00000000..85546547 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php @@ -0,0 +1,6 @@ +_coll = new \Doctrine\Common\Collections\ArrayCollection; + } + + public function testIssetAndUnset() + { + $this->assertFalse(isset($this->_coll[0])); + $this->_coll->add('testing'); + $this->assertTrue(isset($this->_coll[0])); + unset($this->_coll[0]); + $this->assertFalse(isset($this->_coll[0])); + } + + public function testToString() + { + $this->_coll->add('testing'); + $this->assertTrue(is_string((string) $this->_coll)); + } + + public function testRemovingNonExistentEntryReturnsNull() + { + $this->assertEquals(null, $this->_coll->remove('testing_does_not_exist')); + } + + public function testExists() + { + $this->_coll->add("one"); + $this->_coll->add("two"); + $exists = $this->_coll->exists(function($k, $e) { return $e == "one"; }); + $this->assertTrue($exists); + $exists = $this->_coll->exists(function($k, $e) { return $e == "other"; }); + $this->assertFalse($exists); + } + + public function testMap() + { + $this->_coll->add(1); + $this->_coll->add(2); + $res = $this->_coll->map(function($e) { return $e * 2; }); + $this->assertEquals(array(2, 4), $res->toArray()); + } + + public function testFilter() + { + $this->_coll->add(1); + $this->_coll->add("foo"); + $this->_coll->add(3); + $res = $this->_coll->filter(function($e) { return is_numeric($e); }); + $this->assertEquals(array(0 => 1, 2 => 3), $res->toArray()); + } + + public function testFirstAndLast() + { + $this->_coll->add('one'); + $this->_coll->add('two'); + + $this->assertEquals($this->_coll->first(), 'one'); + $this->assertEquals($this->_coll->last(), 'two'); + } + + public function testArrayAccess() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + + $this->assertEquals($this->_coll[0], 'one'); + $this->assertEquals($this->_coll[1], 'two'); + + unset($this->_coll[0]); + $this->assertEquals($this->_coll->count(), 1); + } + + public function testContainsKey() + { + $this->_coll[5] = 'five'; + $this->assertTrue($this->_coll->containsKey(5)); + } + + public function testContains() + { + $this->_coll[0] = 'test'; + $this->assertTrue($this->_coll->contains('test')); + } + + public function testSearch() + { + $this->_coll[0] = 'test'; + $this->assertEquals(0, $this->_coll->indexOf('test')); + } + + public function testGet() + { + $this->_coll[0] = 'test'; + $this->assertEquals('test', $this->_coll->get(0)); + } + + public function testGetKeys() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals(array(0, 1), $this->_coll->getKeys()); + } + + public function testGetValues() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals(array('one', 'two'), $this->_coll->getValues()); + } + + public function testCount() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals($this->_coll->count(), 2); + $this->assertEquals(count($this->_coll), 2); + } + + public function testForAll() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_string($e); }), true); + $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_array($e); }), false); + } + + public function testPartition() + { + $this->_coll[] = true; + $this->_coll[] = false; + $partition = $this->_coll->partition(function($k, $e) { return $e == true; }); + $this->assertEquals($partition[0][0], true); + $this->assertEquals($partition[1][0], false); + } + + public function testClear() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->_coll->clear(); + $this->assertEquals($this->_coll->isEmpty(), true); + } + + public function testRemove() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $el = $this->_coll->remove(0); + + $this->assertEquals('one', $el); + $this->assertEquals($this->_coll->contains('one'), false); + $this->assertNull($this->_coll->remove(0)); + } + + public function testRemoveElement() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + + $this->assertTrue($this->_coll->removeElement('two')); + $this->assertFalse($this->_coll->contains('two')); + $this->assertFalse($this->_coll->removeElement('two')); + } + + public function testSlice() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->_coll[] = 'three'; + + $slice = $this->_coll->slice(0, 1); + $this->assertInternalType('array', $slice); + $this->assertEquals(array('one'), $slice); + + $slice = $this->_coll->slice(1); + $this->assertEquals(array(1 => 'two', 2 => 'three'), $slice); + + $slice = $this->_coll->slice(1, 1); + $this->assertEquals(array(1 => 'two'), $slice); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php new file mode 100644 index 00000000..e69de29b diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php new file mode 100644 index 00000000..2b11b20e --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php @@ -0,0 +1,88 @@ +_eventManager = new EventManager; + $this->_preFooInvoked = false; + $this->_postFooInvoked = false; + } + + public function testInitialState() + { + $this->assertEquals(array(), $this->_eventManager->getListeners()); + $this->assertFalse($this->_eventManager->hasListeners(self::preFoo)); + $this->assertFalse($this->_eventManager->hasListeners(self::postFoo)); + } + + public function testAddEventListener() + { + $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); + $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); + $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); + $this->assertEquals(1, count($this->_eventManager->getListeners(self::preFoo))); + $this->assertEquals(1, count($this->_eventManager->getListeners(self::postFoo))); + $this->assertEquals(2, count($this->_eventManager->getListeners())); + } + + public function testDispatchEvent() + { + $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); + $this->_eventManager->dispatchEvent(self::preFoo); + $this->assertTrue($this->_preFooInvoked); + $this->assertFalse($this->_postFooInvoked); + } + + public function testRemoveEventListener() + { + $this->_eventManager->addEventListener(array('preBar'), $this); + $this->assertTrue($this->_eventManager->hasListeners(self::preBar)); + $this->_eventManager->removeEventListener(array('preBar'), $this); + $this->assertFalse($this->_eventManager->hasListeners(self::preBar)); + } + + public function testAddEventSubscriber() + { + $eventSubscriber = new TestEventSubscriber(); + $this->_eventManager->addEventSubscriber($eventSubscriber); + $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); + $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); + } + + /* Listener methods */ + + public function preFoo(EventArgs $e) + { + $this->_preFooInvoked = true; + } + + public function postFoo(EventArgs $e) + { + $this->_postFooInvoked = true; + } +} + +class TestEventSubscriber implements \Doctrine\Common\EventSubscriber +{ + public function getSubscribedEvents() + { + return array('preFoo', 'postFoo'); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php new file mode 100644 index 00000000..e1825ae2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php @@ -0,0 +1,94 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver1->expects($this->never()) + ->method('loadMetadataForClass'); + $driver1->expectS($this->never()) + ->method('isTransient'); + + $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver2->expects($this->at(0)) + ->method('loadMetadataForClass') + ->with($this->equalTo($className), $this->equalTo($classMetadata)); + $driver2->expects($this->at(1)) + ->method('isTransient') + ->with($this->equalTo($className)) + ->will($this->returnValue( true )); + + $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); + $chain->addDriver($driver2, 'Doctrine\Tests\Common\Persistence\Mapping'); + + $chain->loadMetadataForClass($className, $classMetadata); + + $this->assertTrue( $chain->isTransient($className) ); + } + + public function testLoadMetadata_NoDelegatorFound_ThrowsMappingException() + { + $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; + $classMetadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $this->setExpectedException('Doctrine\Common\Persistence\Mapping\MappingException'); + $chain->loadMetadataForClass($className, $classMetadata); + } + + public function testGatherAllClassNames() + { + $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; + $classMetadata = $this->getMock('Doctrine\Common\Peristence\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver1->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Doctrine\Tests\Models\Company\Foo'))); + + $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver2->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Doctrine\Tests\ORM\Mapping\Bar', 'Doctrine\Tests\ORM\Mapping\Baz', 'FooBarBaz'))); + + $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); + $chain->addDriver($driver2, 'Doctrine\Tests\ORM\Mapping'); + + $this->assertEquals(array( + 'Doctrine\Tests\Models\Company\Foo', + 'Doctrine\Tests\ORM\Mapping\Bar', + 'Doctrine\Tests\ORM\Mapping\Baz' + ), $chain->getAllClassNames()); + } + + /** + * @group DDC-706 + */ + public function testIsTransient() + { + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $chain = new MappingDriverChain(); + $chain->addDriver($driver1, 'Doctrine\Tests\Models\CMS'); + + $this->assertTrue($chain->isTransient('stdClass'), "stdClass isTransient"); + } +} + +class DriverChainEntity +{ + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php new file mode 100644 index 00000000..9fe32994 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php @@ -0,0 +1,134 @@ +getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $this->cmf = new TestClassMetadataFactory($driver, $metadata); + } + + public function testGetCacheDriver() + { + $this->assertNull($this->cmf->getCacheDriver()); + $cache = new ArrayCache(); + $this->cmf->setCacheDriver($cache); + $this->assertSame($cache, $this->cmf->getCacheDriver()); + } + + public function testGetMetadataFor() + { + $metadata = $this->cmf->getMetadataFor('stdClass'); + + $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); + $this->assertTrue($this->cmf->hasMetadataFor('stdClass')); + } + + public function testGetParentMetadata() + { + $metadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + + $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\RootEntity')); + } + + public function testGetCachedMetadata() + { + $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $cache = new ArrayCache(); + $cache->save(__NAMESPACE__. '\ChildEntity$CLASSMETADATA', $metadata); + + $this->cmf->setCacheDriver($cache); + + $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + $this->assertSame($loadedMetadata, $metadata); + } + + public function testCacheGetMetadataFor() + { + $cache = new ArrayCache(); + $this->cmf->setCacheDriver($cache); + + $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + + $this->assertSame($loadedMetadata, $cache->fetch(__NAMESPACE__. '\ChildEntity$CLASSMETADATA')); + } + + public function testGetAliasedMetadata() + { + $loadedMetadata = $this->cmf->getMetadataFor('prefix:ChildEntity'); + + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); + $this->assertTrue($this->cmf->hasMetadataFor('prefix:ChildEntity')); + } +} + +class TestClassMetadataFactory extends AbstractClassMetadataFactory +{ + public $driver; + public $metadata; + + public function __construct($driver, $metadata) + { + $this->driver = $driver; + $this->metadata = $metadata; + } + + protected function doLoadMetadata($class, $parent, $rootEntityFound) + { + + } + + protected function getFqcnFromAlias($namespaceAlias, $simpleClassName) + { + return __NAMESPACE__ . '\\' . $simpleClassName; + } + + protected function initialize() + { + + } + + protected function newClassMetadataInstance($className) + { + return $this->metadata; + } + + protected function getDriver() + { + return $this->driver; + } + protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService) + { + } + + protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService) + { + } +} + +class RootEntity +{ + +} + +class ChildEntity extends RootEntity +{ + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php new file mode 100644 index 00000000..3c600c40 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php @@ -0,0 +1,90 @@ +assertEquals(array($path), $locator->getPaths()); + + $locator = new DefaultFileLocator($path); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testGetFileExtension() + { + $locator = new DefaultFileLocator(array(), ".yml"); + $this->assertEquals(".yml", $locator->getFileExtension()); + $locator->setFileExtension(".xml"); + $this->assertEquals(".xml", $locator->getFileExtension()); + } + + public function testUniquePaths() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path, $path)); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testFindMappingFile() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->assertEquals(__DIR__ . '/_files/stdClass.yml', $locator->findMappingFile('stdClass')); + } + + public function testFindMappingFileNotFound() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->setExpectedException( + 'Doctrine\Common\Persistence\Mapping\MappingException', + "No mapping file found named 'stdClass2.yml' for class 'stdClass2'" + ); + $locator->findMappingFile('stdClass2'); + } + + public function testGetAllClassNames() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + $classes = $locator->getAllClassNames(null); + sort($classes); + + $this->assertEquals(array('global', 'stdClass'), $classes); + $this->assertEquals(array('stdClass'), $locator->getAllClassNames("global")); + } + + public function testGetAllClassNamesNonMatchingFileExtension() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".xml"); + $this->assertEquals(array(), $locator->getAllClassNames("global")); + } + + public function testFileExists() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->assertTrue($locator->fileExists("stdClass")); + $this->assertFalse($locator->fileExists("stdClass2")); + $this->assertTrue($locator->fileExists("global")); + $this->assertFalse($locator->fileExists("global2")); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php new file mode 100644 index 00000000..020c2424 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php @@ -0,0 +1,142 @@ +assertNull($driver->getGlobalBasename()); + + $driver->setGlobalBasename("global"); + $this->assertEquals("global", $driver->getGlobalBasename()); + } + + public function testGetElementFromGlobalFile() + { + $driver = new TestFileDriver($this->newLocator()); + $driver->setGlobalBasename("global"); + + $element = $driver->getElement('stdGlobal'); + + $this->assertEquals('stdGlobal', $element); + } + + public function testGetElementFromFile() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('findMappingFile') + ->with($this->equalTo('stdClass')) + ->will($this->returnValue(__DIR__ . '/_files/stdClass.yml')); + + $driver = new TestFileDriver($locator); + + $this->assertEquals('stdClass', $driver->getElement('stdClass')); + } + + public function testGetAllClassNamesGlobalBasename() + { + $driver = new TestFileDriver($this->newLocator()); + $driver->setGlobalBasename("global"); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdGlobal', 'stdGlobal2'), $classNames); + } + + public function testGetAllClassNamesFromMappingFile() + { + $locator = $this->newLocator(); + $locator->expects($this->any()) + ->method('getAllClassNames') + ->with($this->equalTo(null)) + ->will($this->returnValue(array('stdClass'))); + $driver = new TestFileDriver($locator); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdClass'), $classNames); + } + + public function testGetAllClassNamesBothSources() + { + $locator = $this->newLocator(); + $locator->expects($this->any()) + ->method('getAllClassNames') + ->with($this->equalTo('global')) + ->will($this->returnValue(array('stdClass'))); + $driver = new TestFileDriver($locator); + $driver->setGlobalBasename("global"); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdGlobal', 'stdGlobal2', 'stdClass'), $classNames); + } + + public function testIsNotTransient() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('fileExists') + ->with($this->equalTo('stdClass')) + ->will($this->returnValue( true )); + + $driver = new TestFileDriver($locator); + $driver->setGlobalBasename("global"); + + $this->assertFalse($driver->isTransient('stdClass')); + $this->assertFalse($driver->isTransient('stdGlobal')); + $this->assertFalse($driver->isTransient('stdGlobal2')); + } + + public function testIsTransient() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('fileExists') + ->with($this->equalTo('stdClass2')) + ->will($this->returnValue( false )); + + $driver = new TestFileDriver($locator); + + $this->assertTrue($driver->isTransient('stdClass2')); + } + + public function testNonLocatorFallback() + { + $driver = new TestFileDriver(__DIR__ . '/_files', '.yml'); + $this->assertTrue($driver->isTransient('stdClass2')); + $this->assertFalse($driver->isTransient('stdClass')); + } + + private function newLocator() + { + $locator = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\FileLocator'); + $locator->expects($this->any())->method('getFileExtension')->will($this->returnValue('.yml')); + $locator->expects($this->any())->method('getPaths')->will($this->returnValue(array(__DIR__ . "/_files"))); + return $locator; + } +} + +class TestFileDriver extends FileDriver +{ + protected function loadMappingFile($file) + { + if (strpos($file, "global.yml") !== false) { + return array('stdGlobal' => 'stdGlobal', 'stdGlobal2' => 'stdGlobal2'); + } + return array('stdClass' => 'stdClass'); + } + + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php new file mode 100644 index 00000000..8fc4d807 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php @@ -0,0 +1,18 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $metadata->expects($this->once())->method('getFieldNames'); + + $driver = new PHPDriver(array(__DIR__ . "/_files")); + $driver->loadMetadataForClass('TestEntity', $metadata); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php new file mode 100644 index 00000000..5f06cad9 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Tests\Common\Persistence\Mapping; + +use Doctrine\Common\Persistence\Mapping\RuntimeReflectionService; + +/** + * @group DCOM-93 + */ +class RuntimeReflectionServiceTest extends \PHPUnit_Framework_TestCase +{ + private $reflectionService; + + public function setUp() + { + $this->reflectionService = new RuntimeReflectionService(); + } + + public function testShortname() + { + $this->assertEquals("RuntimeReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); + } + + public function testClassNamespaceName() + { + $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); + } + + public function testGetParentClasses() + { + $classes = $this->reflectionService->getParentClasses(__CLASS__); + $this->assertTrue(count($classes) >= 1, "The test class ".__CLASS__." should have at least one parent."); + } + + public function testGetReflectionClass() + { + $class = $this->reflectionService->getClass(__CLASS__); + $this->assertInstanceOf("ReflectionClass", $class); + } + + public function testGetMethods() + { + $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); + $this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); + } + + public function testGetAccessibleProperty() + { + $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); + $this->assertInstanceOf("ReflectionProperty", $reflProp); + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php new file mode 100644 index 00000000..9f1c5684 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php @@ -0,0 +1,35 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $metadata->expects($this->once())->method('getFieldNames'); + + $driver = new StaticPHPDriver(array(__DIR__)); + $driver->loadMetadataForClass(__NAMESPACE__ . '\\TestEntity', $metadata); + } + + public function testGetAllClassNames() + { + $driver = new StaticPHPDriver(array(__DIR__)); + $classNames = $driver->getAllClassNames(); + + $this->assertContains( + 'Doctrine\Tests\Common\Persistence\Mapping\TestEntity', $classNames); + } +} + +class TestEntity +{ + static public function loadMetadata($metadata) + { + $metadata->getFieldNames(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php new file mode 100644 index 00000000..ffce6d40 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Tests\Common\Persistence\Mapping; + +use Doctrine\Common\Persistence\Mapping\StaticReflectionService; + +/** + * @group DCOM-93 + */ +class StaticReflectionServiceTest extends \PHPUnit_Framework_TestCase +{ + private $reflectionService; + + public function setUp() + { + $this->reflectionService = new StaticReflectionService(); + } + + public function testShortname() + { + $this->assertEquals("StaticReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); + } + + public function testClassNamespaceName() + { + $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); + } + + public function testGetParentClasses() + { + $classes = $this->reflectionService->getParentClasses(__CLASS__); + $this->assertTrue(count($classes) == 0, "The test class ".__CLASS__." should have no parents according to static reflection."); + } + + public function testGetReflectionClass() + { + $class = $this->reflectionService->getClass(__CLASS__); + $this->assertNull($class); + } + + public function testGetMethods() + { + $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); + $this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); + } + + public function testGetAccessibleProperty() + { + $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); + $this->assertNull($reflProp); + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php new file mode 100644 index 00000000..b51162e6 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php @@ -0,0 +1,88 @@ + $prefix)); + $this->assertEquals(array($path), $locator->getPaths()); + + $locator = new SymfonyFileLocator(array($path => $prefix)); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testGetPrefixes() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix)); + $this->assertEquals(array($path => $prefix), $locator->getNamespacePrefixes()); + } + + public function testGetFileExtension() + { + $locator = new SymfonyFileLocator(array(), ".yml"); + $this->assertEquals(".yml", $locator->getFileExtension()); + $locator->setFileExtension(".xml"); + $this->assertEquals(".xml", $locator->getFileExtension()); + } + + public function testFileExists() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->assertTrue($locator->fileExists("Foo\stdClass")); + $this->assertTrue($locator->fileExists("Foo\global")); + $this->assertFalse($locator->fileExists("Foo\stdClass2")); + $this->assertFalse($locator->fileExists("Foo\global2")); + } + + public function testGetAllClassNames() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + $classes = $locator->getAllClassNames(null); + sort($classes); + + $this->assertEquals(array("Foo\\global", "Foo\\stdClass"), $classes); + $this->assertEquals(array("Foo\\stdClass"), $locator->getAllClassNames("global")); + } + + public function testFindMappingFile() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->assertEquals(__DIR__ . "/_files/stdClass.yml", $locator->findMappingFile("Foo\\stdClass")); + } + + public function testFindMappingFileNotFound() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->setExpectedException( + "Doctrine\Common\Persistence\Mapping\MappingException", + "No mapping file found named '".__DIR__."/_files/stdClass2.yml' for class 'Foo\stdClass2'." + ); + $locator->findMappingFile("Foo\\stdClass2"); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php new file mode 100644 index 00000000..d0e9976a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php @@ -0,0 +1,3 @@ +getFieldNames(); \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php new file mode 100644 index 00000000..a0f77b50 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php @@ -0,0 +1,247 @@ +cm = new TestObjectMetadata; + $this->om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); + $this->om->expects($this->any())->method('getClassMetadata') + ->will($this->returnValue($this->cm)); + $this->object = new TestObject; + PersistentObject::setObjectManager($this->om); + $this->object->injectObjectManager($this->om, $this->cm); + } + + public function testGetObjectManager() + { + $this->assertSame($this->om, PersistentObject::getObjectManager()); + } + + public function testNonMatchingObjectManager() + { + $this->setExpectedException('RuntimeException'); + $om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); + $this->object->injectObjectManager($om, $this->cm); + } + + public function testGetField() + { + $this->assertEquals('beberlei', $this->object->getName()); + } + + public function testSetField() + { + $this->object->setName("test"); + $this->assertEquals("test", $this->object->getName()); + } + + public function testGetIdentifier() + { + $this->assertEquals(1, $this->object->getId()); + } + + public function testSetIdentifier() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->setId(2); + } + + public function testSetUnknownField() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->setUnknown("test"); + } + + public function testGetUnknownField() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->getUnknown(); + } + + public function testGetToOneAssociation() + { + $this->assertNull($this->object->getParent()); + } + + public function testSetToOneAssociation() + { + $parent = new TestObject(); + $this->object->setParent($parent); + $this->assertSame($parent, $this->object->getParent($parent)); + } + + public function testSetInvalidToOneAssocation() + { + $parent = new \stdClass(); + + $this->setExpectedException('InvalidArgumentException'); + $this->object->setParent($parent); + } + + public function testSetToOneAssociationNull() + { + $parent = new TestObject(); + $this->object->setParent($parent); + $this->object->setParent(null); + $this->assertNull($this->object->getParent()); + } + + public function testAddToManyAssocation() + { + $child = new TestObject(); + $this->object->addChildren($child); + + $this->assertSame($this->object, $child->getParent()); + $this->assertEquals(1, count($this->object->getChildren())); + + $child = new TestObject(); + $this->object->addChildren($child); + + $this->assertEquals(2, count($this->object->getChildren())); + } + + public function testAddInvalidToManyAssocation() + { + $this->setExpectedException('InvalidArgumentException'); + $this->object->addChildren(new \stdClass()); + } + + public function testNoObjectManagerSet() + { + PersistentObject::setObjectManager(null); + $child = new TestObject(); + + $this->setExpectedException('RuntimeException'); + $child->setName("test"); + } + + public function testInvalidMethod() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->asdf(); + } + + public function testAddInvalidCollection() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->addAsdf(new \stdClass()); + } +} + +class TestObject extends PersistentObject +{ + protected $id = 1; + protected $name = 'beberlei'; + protected $parent; + protected $children; +} + +class TestObjectMetadata implements ClassMetadata +{ + + public function getAssociationMappedByTargetField($assocName) + { + $assoc = array('children' => 'parent'); + return $assoc[$assocName]; + } + + public function getAssociationNames() + { + return array('parent', 'children'); + } + + public function getAssociationTargetClass($assocName) + { + return __NAMESPACE__ . '\TestObject'; + } + + public function getFieldNames() + { + return array('id', 'name'); + } + + public function getIdentifier() + { + return array('id'); + } + + public function getName() + { + return __NAMESPACE__ . '\TestObject'; + } + + public function getReflectionClass() + { + return new \ReflectionClass($this->getName()); + } + + public function getTypeOfField($fieldName) + { + $types = array('id' => 'integer', 'name' => 'string'); + return $types[$fieldName]; + } + + public function hasAssociation($fieldName) + { + return in_array($fieldName, array('parent', 'children')); + } + + public function hasField($fieldName) + { + return in_array($fieldName, array('id', 'name')); + } + + public function isAssociationInverseSide($assocName) + { + return ($assocName === 'children'); + } + + public function isCollectionValuedAssociation($fieldName) + { + return ($fieldName === 'children'); + } + + public function isIdentifier($fieldName) + { + return $fieldName === 'id'; + } + + public function isSingleValuedAssociation($fieldName) + { + return $fieldName === 'parent'; + } + + public function getIdentifierValues($entity) + { + + } + + public function getIdentifierFieldNames() + { + + } + + public function initializeReflection(ReflectionService $reflService) + { + + } + + public function wakeupReflection(ReflectionService $reflService) + { + + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php new file mode 100644 index 00000000..a2814500 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php @@ -0,0 +1,100 @@ +assertEquals($expectedClassName, ClassUtils::getRealClass($className)); + } + + /** + * @dataProvider dataGetClass + */ + public function testGetClass( $className, $expectedClassName ) + { + $object = new $className(); + $this->assertEquals($expectedClassName, ClassUtils::getClass($object)); + } + + public function testGetParentClass() + { + $parentClass = ClassUtils::getParentClass( 'MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject' ); + $this->assertEquals('stdClass', $parentClass); + } + + public function testGenerateProxyClassName() + { + $this->assertEquals( 'Proxies\__CG__\stdClass', ClassUtils::generateProxyClassName( 'stdClass', 'Proxies' ) ); + } + + /** + * @dataProvider dataGetClass + */ + public function testNewReflectionClass( $className, $expectedClassName ) + { + $reflClass = ClassUtils::newReflectionClass( $className ); + $this->assertEquals( $expectedClassName, $reflClass->getName() ); + } + + /** + * @dataProvider dataGetClass + */ + public function testNewReflectionObject( $className, $expectedClassName ) + { + $object = new $className; + $reflClass = ClassUtils::newReflectionObject( $object ); + $this->assertEquals( $expectedClassName, $reflClass->getName() ); + } + } + + class ChildObject extends \stdClass + { + } +} + +namespace MyProject\Proxies\__CG__ +{ + class stdClass extends \stdClass + { + } +} + +namespace MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util +{ + class ChildObject extends \Doctrine\Tests\Common\Util\ChildObject + { + } +} + +namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__ +{ + class stdClass extends \MyProject\Proxies\__CG__\stdClass + { + } +} + +namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util +{ + class ChildObject extends \MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject + { + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php new file mode 100644 index 00000000..b4e9eed2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php @@ -0,0 +1,27 @@ +foo = "bar"; + $obj->bar = 1234; + + $var = Debug::export($obj, 2); + $this->assertEquals( "stdClass", $var->__CLASS__ ); + } + + public function testExportDateTime() + { + $obj = new \DateTime( "2010-10-10 10:10:10" ); + + $var = Debug::export( $obj, 2 ); + $this->assertEquals( "DateTime", $var->__CLASS__ ); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php b/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php new file mode 100644 index 00000000..e8323d29 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php @@ -0,0 +1,10 @@ + + */ +class NativePhpunitTask extends Task +{ + private $test; + private $testfile; + private $testdirectory; + private $configuration = null; + private $coverageClover = null; + private $junitlogfile = null; + private $haltonfailure = true; + private $haltonerror = true; + + public function setTestdirectory($directory) { + $this->testdirectory = $directory; + } + + public function setTest($test) { + $this->test = $test; + } + + public function setTestfile($testfile) { + $this->testfile = $testfile; + } + + public function setJunitlogfile($junitlogfile) { + if (strlen($junitlogfile) == 0) { + $junitlogfile = NULL; + } + + $this->junitlogfile = $junitlogfile; + } + + public function setConfiguration($configuration) { + if (strlen($configuration) == 0) { + $configuration = NULL; + } + + $this->configuration = $configuration; + } + + public function setCoverageClover($coverageClover) { + if (strlen($coverageClover) == 0) { + $coverageClover = NULL; + } + + $this->coverageClover = $coverageClover; + } + + public function setHaltonfailure($haltonfailures) { + $this->haltonfailure = $haltonfailures; + } + + public function setHaltonerror($haltonerrors) { + $this->haltonerror = $haltonerrors; + } + + public function init() + { + require_once "PHPUnit/Runner/Version.php"; + $version = PHPUnit_Runner_Version::id(); + + if (version_compare($version, '3.4.0') < 0) { + throw new BuildException("NativePHPUnitTask requires PHPUnit version >= 3.2.0", $this->getLocation()); + } + + require_once 'PHPUnit/Util/Filter.php'; + + // point PHPUnit_MAIN_METHOD define to non-existing method + if (!defined('PHPUnit_MAIN_METHOD')) { + define('PHPUnit_MAIN_METHOD', 'PHPUnitTask::undefined'); + } + } + + public function main() + { + if (!is_dir(realpath($this->testdirectory))) { + throw new BuildException("NativePHPUnitTask requires a Test Directory path given, '".$this->testdirectory."' given."); + } + set_include_path(realpath($this->testdirectory) . PATH_SEPARATOR . get_include_path()); + + $printer = new NativePhpunitPrinter(); + + $arguments = array( + 'configuration' => $this->configuration, + 'coverageClover' => $this->coverageClover, + 'junitLogfile' => $this->junitlogfile, + 'printer' => $printer, + ); + + $runner = new PHPUnit_TextUI_TestRunner(); + $suite = $runner->getTest($this->test, $this->testfile, true); + + try { + $result = $runner->doRun($suite, $arguments); + /* @var $result PHPUnit_Framework_TestResult */ + + if ( ($this->haltonfailure && $result->failureCount() > 0) || ($this->haltonerror && $result->errorCount() > 0) ) { + throw new BuildException("PHPUnit: ".$result->failureCount()." Failures and ".$result->errorCount()." Errors, ". + "last failure message: ".$printer->getMessages()); + } + + $this->log("PHPUnit Success: ".count($result->passed())." tests passed, no ". + "failures (".$result->skippedCount()." skipped, ".$result->notImplementedCount()." not implemented)"); + + // Hudson for example doesn't like the backslash in class names + if (file_exists($this->coverageClover)) { + $this->log("Generated Clover Coverage XML to: ".$this->coverageClover); + $content = file_get_contents($this->coverageClover); + $content = str_replace("\\", ".", $content); + file_put_contents($this->coverageClover, $content); + unset($content); + } + + } catch(\Exception $e) { + throw new BuildException("NativePhpunitTask failed: ".$e->getMessage()); + } + } +} + +class NativePhpunitPrinter extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener +{ + private $_messages = array(); + + public function write($buffer) + { + // do nothing + } + + public function getMessages() + { + return $this->_messages; + } + + /** + * An error occurred. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + */ + public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) + { + $this->_messages[] = "Test ERROR: ".$test->getName().": ".$e->getMessage(); + } + + /** + * A failure occurred. + * + * @param PHPUnit_Framework_Test $test + * @param PHPUnit_Framework_AssertionFailedError $e + * @param float $time + */ + public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) + { + $this->_messages[] = "Test FAILED: ".$test->getName().": ".$e->getMessage(); + } + + /** + * Incomplete test. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + */ + public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) + { + + } + + /** + * Skipped test. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + * @since Method available since Release 3.0.0 + */ + public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) + { + + } + + /** + * A test suite started. + * + * @param PHPUnit_Framework_TestSuite $suite + * @since Method available since Release 2.2.0 + */ + public function startTestSuite(PHPUnit_Framework_TestSuite $suite) + { + + } + + /** + * A test suite ended. + * + * @param PHPUnit_Framework_TestSuite $suite + * @since Method available since Release 2.2.0 + */ + public function endTestSuite(PHPUnit_Framework_TestSuite $suite) + { + + } + + /** + * A test started. + * + * @param PHPUnit_Framework_Test $test + */ + public function startTest(PHPUnit_Framework_Test $test) + { + + } + + /** + * A test ended. + * + * @param PHPUnit_Framework_Test $test + * @param float $time + */ + public function endTest(PHPUnit_Framework_Test $test, $time) + { + + } +} diff --git a/vendor/doctrine/common/tests/README.markdown b/vendor/doctrine/common/tests/README.markdown new file mode 100644 index 00000000..e6f1703d --- /dev/null +++ b/vendor/doctrine/common/tests/README.markdown @@ -0,0 +1,27 @@ +# Running the Doctrine 2 Testsuite + +## Running tests + +Execute PHPUnit in the root folder of your doctrine-common clone. + + phpunit + +## Testing Lock-Support + +The Lock support in Doctrine 2 is tested using Gearman, which allows to run concurrent tasks in parallel. +Install Gearman with PHP as follows: + +1. Go to http://www.gearman.org and download the latest Gearman Server +2. Compile it and then call ldconfig +3. Start it up "gearmand -vvvv" +4. Install pecl/gearman by calling "gearman-beta" + +You can then go into tests/ and start up two workers: + + php Doctrine/Tests/ORM/Functional/Locking/LockAgentWorker.php + +Then run the locking test-suite: + + phpunit --configuration Doctrine/Tests/ORM/Functional/Locking/GearmanLockTest.php + +This can run considerable time, because it is using sleep() to test for the timing ranges of locks. \ No newline at end of file From 03e8c9afc2773babfde8682e03f24dd6ab040210 Mon Sep 17 00:00:00 2001 From: zhgzhg Date: Fri, 8 Feb 2013 22:31:21 +0200 Subject: [PATCH 094/180] minor config changes --- config/autoload/README.md | 5 +++++ config/autoload/local.php.dist | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/config/autoload/README.md b/config/autoload/README.md index 4e504db0..c56d0b3b 100644 --- a/config/autoload/README.md +++ b/config/autoload/README.md @@ -1,3 +1,8 @@ +Important +========= +Create file local.php for your local repository. +Use the sample local.php.dist ! + About this directory: ===================== diff --git a/config/autoload/local.php.dist b/config/autoload/local.php.dist index 7862eba7..ab542a59 100644 --- a/config/autoload/local.php.dist +++ b/config/autoload/local.php.dist @@ -12,5 +12,9 @@ */ return array( - // ... + 'db' => array( + 'dsn' => 'mysql:dbname=YOUR_DATABASE_NAME_HERE;host=YOUR_DATABASE_HOST_ADDRESS_HERE', + 'username' => 'DATABASE USERNAME', + 'password' => 'DATABASE PASSWORD', + ), ); From 3b214c0ca17ccbafacdbc1d03ed036f5e6f70d31 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Sat, 9 Feb 2013 15:42:14 +0000 Subject: [PATCH 095/180] deleted local.php --- config/autoload/local.php.stoyan | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 config/autoload/local.php.stoyan diff --git a/config/autoload/local.php.stoyan b/config/autoload/local.php.stoyan deleted file mode 100644 index dfdf4f20..00000000 --- a/config/autoload/local.php.stoyan +++ /dev/null @@ -1,8 +0,0 @@ - array( - 'dsn' => 'mysql:dbname=wingman;host=wingman-db.my.phpcloud.com', - 'username' => 'wingman', - 'password' => 'area51', - ), -) \ No newline at end of file From 401986a175e6e6a4db2b5df0e4e5a8a9fe3dffa5 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Sat, 9 Feb 2013 16:01:13 +0000 Subject: [PATCH 096/180] gitignore created --- config/autoload/.gitignore | 4 ++-- public/.gitignore | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 public/.gitignore diff --git a/config/autoload/.gitignore b/config/autoload/.gitignore index 5ab30a71..1a83fda6 100644 --- a/config/autoload/.gitignore +++ b/config/autoload/.gitignore @@ -1,2 +1,2 @@ -# local.php -# *.local.php +local.php +*.local.php diff --git a/public/.gitignore b/public/.gitignore new file mode 100644 index 00000000..79eb93b0 --- /dev/null +++ b/public/.gitignore @@ -0,0 +1 @@ +.htaccess \ No newline at end of file From aa2fc76ae3acb468f770e98aa95a766524c3c830 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Sat, 9 Feb 2013 16:13:10 +0000 Subject: [PATCH 097/180] test --- config/autoload/.gitignore | 4 ++-- public/.gitignore | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/autoload/.gitignore b/config/autoload/.gitignore index 1a83fda6..5ab30a71 100644 --- a/config/autoload/.gitignore +++ b/config/autoload/.gitignore @@ -1,2 +1,2 @@ -local.php -*.local.php +# local.php +# *.local.php diff --git a/public/.gitignore b/public/.gitignore index 79eb93b0..ca17088a 100644 --- a/public/.gitignore +++ b/public/.gitignore @@ -1 +1 @@ -.htaccess \ No newline at end of file +# .htaccess \ No newline at end of file From 9a1a237eb66793562fd13370d6ecf07ce78482d1 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Sat, 9 Feb 2013 16:14:24 +0000 Subject: [PATCH 098/180] test --- config/autoload/.gitignore | 4 ++-- public/.gitignore | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/autoload/.gitignore b/config/autoload/.gitignore index 5ab30a71..1a83fda6 100644 --- a/config/autoload/.gitignore +++ b/config/autoload/.gitignore @@ -1,2 +1,2 @@ -# local.php -# *.local.php +local.php +*.local.php diff --git a/public/.gitignore b/public/.gitignore index ca17088a..79eb93b0 100644 --- a/public/.gitignore +++ b/public/.gitignore @@ -1 +1 @@ -# .htaccess \ No newline at end of file +.htaccess \ No newline at end of file From e08f7da1a1ea6b603cc5ad35098867bff1e798d4 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Sat, 9 Feb 2013 16:15:47 +0000 Subject: [PATCH 099/180] test --- config/autoload/global.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/autoload/global.php b/config/autoload/global.php index aab0ae59..466e497b 100644 --- a/config/autoload/global.php +++ b/config/autoload/global.php @@ -11,11 +11,11 @@ * file. */ -/* + return array( // ... ); -*/ + return array( 'db' => array( From 35cf8ddc324e7765d72b9fc51b2b272dde95df6c Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Sat, 9 Feb 2013 16:17:02 +0000 Subject: [PATCH 100/180] test --- config/autoload/global.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/autoload/global.php b/config/autoload/global.php index 466e497b..aab0ae59 100644 --- a/config/autoload/global.php +++ b/config/autoload/global.php @@ -11,11 +11,11 @@ * file. */ - +/* return array( // ... ); - +*/ return array( 'db' => array( From 842145bcf130ecea9d76731c0f2f79fef4e00fe7 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Sat, 9 Feb 2013 16:19:38 +0000 Subject: [PATCH 101/180] test --- public/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/.gitignore b/public/.gitignore index 79eb93b0..ca17088a 100644 --- a/public/.gitignore +++ b/public/.gitignore @@ -1 +1 @@ -.htaccess \ No newline at end of file +# .htaccess \ No newline at end of file From 75391a4f34be8f1fde0282ce983cba9cfe077b7d Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" Date: Sat, 9 Feb 2013 16:20:44 +0000 Subject: [PATCH 102/180] rwsr --- public/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/.gitignore b/public/.gitignore index ca17088a..79eb93b0 100644 --- a/public/.gitignore +++ b/public/.gitignore @@ -1 +1 @@ -# .htaccess \ No newline at end of file +.htaccess \ No newline at end of file From c421cdc3231f6144cdd543b2dd7f4b6e3ce678a1 Mon Sep 17 00:00:00 2001 From: Zh G Date: Sat, 9 Feb 2013 16:32:05 +0000 Subject: [PATCH 103/180] cloud test --- index.php | 11 ++ module/Application/language/ar_SY.po | 184 +++++++++++++++++++++++++++ module/Application/language/cs_CZ.po | 153 ++++++++++++++++++++++ module/Application/language/de_DE.po | 153 ++++++++++++++++++++++ module/Application/language/en_US.po | 153 ++++++++++++++++++++++ module/Application/language/es_ES.po | 111 ++++++++++++++++ module/Application/language/fr_CA.po | 153 ++++++++++++++++++++++ module/Application/language/fr_FR.po | 153 ++++++++++++++++++++++ module/Application/language/it_IT.po | 154 ++++++++++++++++++++++ module/Application/language/ja_JP.po | 140 ++++++++++++++++++++ module/Application/language/nl_NL.po | 153 ++++++++++++++++++++++ module/Application/language/pl_PL.po | 153 ++++++++++++++++++++++ module/Application/language/tr_TR.po | 153 ++++++++++++++++++++++ 13 files changed, 1824 insertions(+) create mode 100644 index.php create mode 100644 module/Application/language/ar_SY.po create mode 100644 module/Application/language/cs_CZ.po create mode 100644 module/Application/language/de_DE.po create mode 100644 module/Application/language/en_US.po create mode 100644 module/Application/language/es_ES.po create mode 100644 module/Application/language/fr_CA.po create mode 100644 module/Application/language/fr_FR.po create mode 100644 module/Application/language/it_IT.po create mode 100644 module/Application/language/ja_JP.po create mode 100644 module/Application/language/nl_NL.po create mode 100644 module/Application/language/pl_PL.po create mode 100644 module/Application/language/tr_TR.po diff --git a/index.php b/index.php new file mode 100644 index 00000000..bc3b876e --- /dev/null +++ b/index.php @@ -0,0 +1,11 @@ + + + Hello World + + + Hello World from FMI

'; ?> + Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> + Hello World, Aleksander Aleksandrov


email:aleksaander_aleksandrov@abv.bg'; ?> + + + diff --git a/module/Application/language/ar_SY.po b/module/Application/language/ar_SY.po new file mode 100644 index 00000000..4e0565a7 --- /dev/null +++ b/module/Application/language/ar_SY.po @@ -0,0 +1,184 @@ +# +# tawfek daghistani , 2012. +# Tawfek Daghistani , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-07 13:58+0300\n" +"Last-Translator: Tawfek Daghistani \n" +"Language-Team: Arabic <>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: English\n" +"X-Poedit-Country: UNITED STATES\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +#: ../view/layout/layout.phtml:6 ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "الصفحة الرئيسية" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "جميع الحقوق محفوظة" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "أهلا بك في %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "" +"Congratulations! You have successfully installed the %sZF2 Skeleton " +"Application%s. You are currently running Zend Framework version %s. This " +"skeleton can serve as a simple starting point for you to begin building your " +"application on ZF2." +msgstr "" +"تهانينا! لقد قمت بتنصيب %sZF2 Skeleton Application%s . أنت الآن تستخدم مكتبة " +"زيند الإصدار %s . هذا التطبيق يمكن أن يكون لك نقطة بداية سهلة في بناء " +"برامجك الخاصة على مكتبة زيند " + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "اشتق مكتبة زيند على GitHub " + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "تابع أخر التطورات" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "" +"Zend Framework 2 is under active development. If you are interested in " +"following the development of ZF2, there is a special ZF2 portal on the " +"official Zend Framework website which provides links to the ZF2 %swiki%s, " +"%sdev blog%s, %sissue tracker%s, and much more. This is a great resource for " +"staying up to date with the latest developments!" +msgstr "" +"مكتبة زيند تخضع للتطوير المستمر , إذا كان لديك الرغبة في متابعة التطورات , " +"بإمكانك تصفح الموقع الرسمي للمكتبة الذي يحتوي على روابط إلى %swiki%s, %sdev " +"blog%s, %sissue tracker%s, ,و المزيد . هذه مصادر رائعة لمتابعة أخر التطورات" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "بوابة التطوير الخاصة ب زيند" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "تعرف على الإضافات" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "" +"The community is working on developing a community site to serve as a " +"repository and gallery for ZF2 modules. The project is available %son GitHub" +"%s. The site is currently live and currently contains a list of some of the " +"modules already available for ZF2." +msgstr "" +"المجتمع البرمجي يعمل على تطوير موقع خاص به ليكون كمصدر و معرض لإضافات ZF2 . " +"هذا المشروع موجود على %son GitHub%s . هذا الموقع يخضع للتطوير المستمر و " +"يحتوي على قائمة من الإضافات الخاصة ب ZF2 " + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "إكتشف إضافات ZF2 " + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "الدعم و المساعدة " + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "" +"If you need any help or support while developing with ZF2, you may reach us " +"via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or " +"feedback you may have regarding the beta releases. Alternatively, you may " +"subscribe and post questions to the %smailing lists%s." +msgstr "" +"إذا كنت تريد الحصول على دعم فني أو مساعدة في تطوير ZF2 , بإمكانك التواصل عبر " +"IRC: %s#zftalk.2 on Freenode%s. نحن نريد أن نسمع منك المزيد من الأسئلة , " +"الأراء و الملاحظات على النسخة التجربية من المكتبة , أو بإمكانك الإشتراك و " +"التفاعل أو وضع الأسئلة في القائمة البريدية %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "تواصل معنا في IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "حصل خطأ ما " + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "مزيد من المعلومات" + +#: ../view/error/index.phtml:11 ../view/error/index.phtml:35 +msgid "File" +msgstr "ملف" + +#: ../view/error/index.phtml:15 ../view/error/index.phtml:39 +msgid "Message" +msgstr "الرسالة" + +#: ../view/error/index.phtml:19 ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "تفاصيل الخطأ" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "الأخطاء السابقة" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "لايوجد خطأ" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "حصل خطأ 404 , الصفحة غير موجودة" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "المتحكم المطلوب غير قادر على إجابة الطلب" + +#: ../view/error/404.phtml:13 +msgid "" +"The requested controller could not be mapped to an existing controller class." +msgstr "لا يمكن ربط المتحكم المطلوب بأي من المتحكمات الموجودة حالياًَ" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "المتحكم المطلوب غير قادر على الإجابة " + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "الرابط المطلوب غير معرف لدى الموجه" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "لا يمكنني التحديد لماذا حصل الخطأ 404 في هذا الوقت " + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "المتحكم " + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "يوصل إلى %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "خطأ برمجي" diff --git a/module/Application/language/cs_CZ.po b/module/Application/language/cs_CZ.po new file mode 100644 index 00000000..2485e2d6 --- /dev/null +++ b/module/Application/language/cs_CZ.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-06 13:05+0100\n" +"Last-Translator: David Lukas \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Czech\n" +"X-Poedit-Country: CZECH REPUBLIC\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton aplikace" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Úvod" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Všechna práva vyhrazena." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Vítejte v %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Blahopřejeme! Úspěšně jste nainstalovali %sZF2 Skeleton Application%s. Právě používáte Zend Framework verze %s. Tato kostra aplikace vám poslouží jako jednoduchý výchozí bod, ze kterého můžete vyjít při tvorbě vlastní aplikace nad ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 na GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Sledujte vývoj" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 je aktivně vyvíjen. Chcete-li sledovat vývoj ZF2, máte na oficiálních webových stránkách Zend Framework k dispozici zvláštní portál ZF2, na kterém najdete odkazy na ZF2 %swiki%s, %svývojářský blog%s, %sissue tracker%s a mnoho dalšího. Tento portál je skvělý zdroj aktuálních informací o nejnovějším vývoji!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Vývojářský portál ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Objevte Moduly" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Komunita pracuje na vývoji komunitního webu, který bude sloužit jako archiv a galerie modulů ZF2. Tento projekt je dostupný %sna GitHub%s. Web je aktuálně v provozu a obsahuje seznam některých již dostupných modulů ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Prozkoumejte Moduly ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Pomoc & Podpora" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Budete-li při vývoji se ZF2 potřebovat jakoukoli pomoc nebo podporu, můžete nás zastihnout přes IRC: %s#zftalk.2 na Freenode%s. Budeme rádi za jakékoli vaše otázky nebo připomínky týkající se beta verzí. Případně se také můžete přihlásit k odběru a posílat otázky na naše %se-mailové distribuční seznamy%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Ozvěte se nám na IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Vyskytla se chyba" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Další informace" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Soubor" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Zpráva" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Trasování zásobníku (Stack trace)" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Předchozí výjimky" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Žádná výjimka není k dispozici" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Vyskytla se chyba 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Požadovaný controller nemohl vyřídit požadavek." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Požadovaný controller se nepodařilo namapovat na žádnou existující třídu controlleru." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Požadovaný controller nepodporuje vyřízení (controller not dispatchable)." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "S požadovaným URL nebyla při směrování (routing) nalezena shoda." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Momentálně nedokážeme určit, proč byla vygenerována chyba 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "je mapován na %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Výjimka" + diff --git a/module/Application/language/de_DE.po b/module/Application/language/de_DE.po new file mode 100644 index 00000000..0de15400 --- /dev/null +++ b/module/Application/language/de_DE.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 23:45-0700\n" +"PO-Revision-Date: 2012-07-06 08:18-0700\n" +"Last-Translator: Evan Coury \n" +"Language-Team: ZF Contributors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Startseite" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Alle Rechte vorbehalten." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Willkommen zu dem %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Herzlichen Glückwunsch! Sie haben die %sZF2 Skeleton Application%s erfolgreich installiert und benutzen gerade die Version %s des Zend Frameworks. Dieses Gerüst kann Ihnen als Einstiegspunkt, für Ihre weitere Entwicklung, basierend auf dem Zend Framework 2, dienen." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 auf GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Folge der Entwicklung" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Das Zend Framework 2 wird z.Z. aktiv weiterentwickelt. Sollten Sie daran interessiert sein, die Entwicklung von ZF2 zu verfolgen, so bietet Ihnen die offizielle Webseite einen eigens für das Zend Framework 2 eingerichteten Bereich, auf der Sie Verlinkungen zum ZF2 %sWiki%s, %sEntwickler Blog%s, einem %sFehlerverfolgungssystem%s und noch vielem mehr finden. Dieser Bereich ist eine hervorragende Quelle um stets aktuell zu bleiben." + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Entwickler Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Entdecken Sie Module" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Die Community arbeitet momentan an einer Community Seite, welche als Galerie für ZF2 Module dient. Dieses Projekt ist %sauf GitHub%s verfügbar. Die Webseite ist bereits Online und enthält eine Liste mit schon veröffentlichten Modulen für das Zend Framework 2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Erkunden Sie ZF2 Module" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Hilfe & Support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Sollten Sie Hilfe jeglicher Art bei der Entwicklung mit dem Zend Framework 2 benötigen, kontaktieren Sie uns doch einfach über das IRC: %s#zftalk.2 on Freenode%s. Wir freuen uns darauf, Ihnen bei Ihren Fragen zu helfen oder aber auch Ihre Meinung bezüglich der Beta Versionen zu hören. Alternativ können Sie auch die %smailing lists%s abonnieren und Ihre Fragen dort stellen." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Schreiben Sie uns im IRC an" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Ein Fehler ist aufgetreten" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Zusätzliche Information" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Datei" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Meldung" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stapelüberwachung" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Vorherige Ausnahme" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Es ist keine Ausnahme verfügbar" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Es trat ein 404 Fehler auf" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Der angeforderte Controller war nicht in der Lage die Anfrage zu verarbeiten." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Der angeforderte Controller konnte keiner Controller Klasse zugeordnet werden." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Der angeforderte Controller ist nicht aufrufbar." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Für die angeforderte URL konnte keine Übereinstimmung gefunden werden." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Zu diesem Zeitpunkt ist es uns nicht möglich zu bestimmen, warum ein 404 Fehler aufgetreten ist." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "wird aufgelöst in %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Ausnahme" + diff --git a/module/Application/language/en_US.po b/module/Application/language/en_US.po new file mode 100644 index 00000000..c1f203bf --- /dev/null +++ b/module/Application/language/en_US.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-05 22:17-0700\n" +"Last-Translator: Evan Coury \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: English\n" +"X-Poedit-Country: UNITED STATES\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "" + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "" + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "" + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "" + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "" + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "" + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "" + diff --git a/module/Application/language/es_ES.po b/module/Application/language/es_ES.po new file mode 100644 index 00000000..5170d3ce --- /dev/null +++ b/module/Application/language/es_ES.po @@ -0,0 +1,111 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-06 19:07+0100\n" +"PO-Revision-Date: 2012-07-06 19:09+0100\n" +"Last-Translator: Adolfo Abegg \n" +"Language-Team: ZF Contributors \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: Spanish\n" +"X-Poedit-Country: SPAIN\n" +"X-Poedit-SearchPath-0: ..\n" + +msgid "Skeleton Application" +msgstr "Aplicación Esqueleto" + +msgid "Home" +msgstr "Inicio" + +msgid "All rights reserved." +msgstr "Todos los derechos reservados" + +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenido al %sZend Framework 2%s" + +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "¡Felicitaciones! Haz instalado correctamente el %sla aplicación esqueleto del ZF2%s. Estás corriendo la versión %s del Zend Framework. Este esqueleto te servirá como un punto de inicio sencillo para empezar a construir tu aplicación con el ZF2." + +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Hacer un Fork del Zend Framework 2 en GitHub" + +msgid "Follow Development" +msgstr "Seguir el Desarrollo" + +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "El Zend Framework 2 está en pleno desarrollo. Si estás interesado en seguir el desarrollo del ZF2, existe un portal especial para el ZF2 en el sitio web oficial del Zend Framework el cual provee enlaces %sa la Wiki%s, %sal Blog de desarrollo%s, %sal issue tracker%s y mucho más. Este es un gran recurso para mantenerte al día con los últimos avances en el desarrollo!" + +msgid "ZF2 Development Portal" +msgstr "Portal de Desarrollo del ZF2" + +msgid "Discover Modules" +msgstr "Descubre Módulos" + +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La comunidad está trabajando en el desarrollo de una web comunitaria que servirá de repositorio y galería de los módulos del ZF2. El proyecto está disponible %sen GitHub%s. El sitio web está en línea y actualmente posee una lista de algunos módulos que ya están disponibles para el ZF2." + +msgid "Explore ZF2 Modules" +msgstr "Explora los módulos del ZF2" + +msgid "Help & Support" +msgstr "Ayuda & Soporte" + +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si necesitas alguna ayuda o soporte mientras estás desarrollando con el ZF2, puedes encontrarnos via IRC: %s#zftalk.2 en Freenode%s. Nos encantaría leer tus preguntas o cualquier feedback que puedas tener en relación a los lanzamientos de las versiones beta. También puedes subscribirte y enviar preguntas %sa la lista de correos%s" + +msgid "Ping us on IRC" +msgstr "Escríbenos en el IRC" + +msgid "An error occurred" +msgstr "Ha ocurrido un error" + +msgid "Additional information" +msgstr "Información adicional" + +msgid "File" +msgstr "Archivo" + +msgid "Message" +msgstr "Mensaje" + +msgid "Stack trace" +msgstr "Seguimiento de la pila (stack trace)" + +msgid "Previous exceptions" +msgstr "Excepciones anteriores" + +msgid "No Exception available" +msgstr "No hay ninguna Excepción disponible." + +msgid "A 404 error occurred" +msgstr "Ha ocurrido un error 404" + +msgid "The requested controller was unable to dispatch the request." +msgstr "El controlador solicitado no pudo ejecutar la petición." + +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "El controlador solicitado no se pudo mapear con una clase de controlador existente." + +msgid "The requested controller was not dispatchable." +msgstr "El controlador solicitado no es ejecutable." + +msgid "The requested URL could not be matched by routing." +msgstr "El ruteador no ha encontrado la ruta para la URL solicitada." + +msgid "We cannot determine at this time why a 404 was generated." +msgstr "No pudimos determinar por qué un error 404 ha sido generado." + +msgid "Controller" +msgstr "Controller" + +msgid "resolves to %s" +msgstr "se resuelve a %s" + +msgid "Exception" +msgstr "Excepción" + diff --git a/module/Application/language/fr_CA.po b/module/Application/language/fr_CA.po new file mode 100644 index 00000000..979261af --- /dev/null +++ b/module/Application/language/fr_CA.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-06 01:46-0500\n" +"PO-Revision-Date: 2012-07-06 02:08-0500\n" +"Last-Translator: EBB Dev \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: CANADA\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Une erreur 404 est survenue" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Le contrôleur demandé n'a pas pu acheminer la requête." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Le contrôleur demandé ne correspond pas à une classe contrôleur existante." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Le contrôleur demandé ne peut être acheminé." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "L'URL demandée n'a pas pu trouver de route correspondante." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nous ne pouvons pas déterminer pour le moment pourquoi une 404 a été générée." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Contrôleur" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "résout en %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exception" + +#: ../view/error/404.phtml:55 +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +msgid "Stack trace" +msgstr "Pile d'exécution" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Une erreur est survenue" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informations complémentaires" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Fichier" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Message" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Exceptions précédentes" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Aucune exception disponible" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenue dans %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Félicitations ! Vous avez installé %sZF2 Skeleton Application%s avec succès. Vous utilisez actuellement Zend Framework version %s. Cette structure peut vous servir comme point de départ simple pour démarrer la construction de votre application avec ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Faites un Fork de Zend Framework 2 sur GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Suivre le développement" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 est en cours de développement. Si vous êtes intéressé pour suivre l'évolution de ZF2, il existe un portail dédié à ZF2 sur le site officiel Zend Framework qui propose des liens vers le %swiki%s ZF2, le %sblogue de dev%s, le %ssuivi des problèmes%s, et bien plus encore. Il s'agit d'une excellente ressource pour rester à jour sur les dernières évolutions !" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portail sur le développement de ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Découvrez les modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La communauté travaille sur le développement d'un site communautaire avec l'objectif de servir de dépôt et de galerie pour les modules ZF2. Le projet est disponible %ssur GitHub%s. Le site est déjà en ligne, et contient une liste non exhaustive des modules déjà disponibles pour ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Explorer les modules ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aide & support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si vous avez besoin d'aide ou de soutient en développant avec ZF2, vous pouvez nous joindre sur IRC : %s#zftalk.2 sur Freenode%s. Nous aimerions connaître vos questions ou les commentaires que vous pourriez avoir au sujet des versions beta. Sinon, vous pouvez vous abonner, et poser des questions sur la %sliste de diffusion%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Rejoignez-nous sur IRC" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Accueil" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tous droits réservés." + diff --git a/module/Application/language/fr_FR.po b/module/Application/language/fr_FR.po new file mode 100644 index 00000000..49f89d92 --- /dev/null +++ b/module/Application/language/fr_FR.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:32-0700\n" +"PO-Revision-Date: 2012-07-05 23:36-0700\n" +"Last-Translator: Evan Coury \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: FRANCE\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Accueil" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tous droits réservés." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenue dans le %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Félicitations ! Vous avez installé avec succès le %sZF2 Skeleton Application%s. Vous utilisez actuellement Zend Framework version %s. Cette structure peut vous servir comme un point de départ simple pour démarrer la construction de votre application avec ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Faites un Fork de Zend Framework 2 sur GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Suivre le développement" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 est en cours de développement. Si vous êtes intéressé pour suivre l'évolution de ZF2, il existe un portail dédié à ZF2 sur le site officiel Zend Framework qui propose des liens vers le %swiki%s ZF2, %sdev blog%s, %ssuivi des problèmes%s, et bien plus encore. Il s'agit d'une excellente ressource pour rester à jour sur les dernières évolutions !" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portail sur le développement de ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Découvrez les modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La communauté travaille sur le développement d'un site communautaire avec l'objectif de servir de dépôt et de galerie pour les modules ZF2. Le projet est disponible %ssur GitHub%s. Le site est déjà en ligne, et contient une liste non exhaustive des modules déjà disponibles pour ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Explorer les modules ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aide & support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si vous avez besoin d'aide ou de support en développant avec ZF2, vous pouvez nous joindre sur IRC : %s#zftalk.2 sur Freenode%s. Nous aimerions avoir vos questions ou vos commentaires que vous pourriez avoir au sujet des versions bêta. Sinon, vous pouvez vous abonner, et poser des questions sur la %sliste de diffusion%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Rejoignez-nous sur IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Une erreur est survenue" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informations complémentaires" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Fichier" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Message" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Pile d'exécution" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Exceptions précédentes" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Aucune exception disponible" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Une erreur 404 est survenue" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Le contrôleur demandé n'a pas pu dispatcher la requête." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Le contrôleur demandé ne correspond pas à une classe existante de contrôleur." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Le contrôleur demandé n'est pas dispatchable." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "L'URL demandée n'a pas pu trouver de route correspondante." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nous ne pouvons pas déterminer pour le moment pourquoi une 404 a été générée." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Contrôleur" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "résout en %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exception" + diff --git a/module/Application/language/it_IT.po b/module/Application/language/it_IT.po new file mode 100644 index 00000000..6c1759c8 --- /dev/null +++ b/module/Application/language/it_IT.po @@ -0,0 +1,154 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 23:45-0700\n" +"PO-Revision-Date: 2012-07-12 22:14+0100\n" +"Last-Translator: Marco Pivetta \n" +"Language-Team: ZF Contributors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,-1,5,-1,-1,-1\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Pagina iniziale" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tutti i diritti sono riservati." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Benvenuto in %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Congratulazioni! Hai appena installato con successo %sZF2 Skeleton Application%s e stai utilizzando la versione %s di Zend Framework. Questa struttura può servirti come semplice punto di riferimento per iniziare a costruire un'applicazione basata su ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Crea un fork di Zend Framework 2 su GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Segui lo sviluppo" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 è in forte sviluppo. Se sei interessato a seguire lo sviluppo di ZF2, è presente un portale che fornisce link al %swiki%s, al %sdev blog%s, all'%sissue tracker%s e a molto altro riguardo a ZF2. Il Portale è un'ottima risorsa per rimanere aggiornati con gli ultimi sviluppi!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portale sullo sviluppo di ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Scopri i Moduli" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La community sta lavorando allo sviluppo di un sito che deve servire come raccolta e gallery di Moduli per ZF2. Il progetto è disponibile %son Github%s. Il sito è visitabile e al momento contiene una lista di alcuni dei Moduli già disponibili per ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Esplora i Moduli di ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aiuto & Supporto" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Qualora ti servisse aiuto o supporto mentre sviluppi con ZF2, puoi contattarci tramite IRC: %s#zftalk.2 on Freenode%s. Ci piacerebbe moltissimo ricevere le tue domande o qualunque feedback tu possa avere riguardo alle beta release. In alternativa, puoi iscriverti e inviare domande alla %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Contattaci su IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Si è verificato un errore" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informazioni aggiuntive" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "File" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Messaggio" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Eccezioni precedenti" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Non è disponibile alcuna eccezione" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Si è verificato un errore 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Il controller richiesto non è stato in grado di elaborare la richiesta." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Non è stato possibile mappare il controller richiesto ad una classe di tipo controller." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Il controller richiesto non è un oggetto dispatchable." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Non è stato possibile effettuare il match dell'indirizzo richiesto tramite routing." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "In questo momento non siamo in grado di determinare perchè sia stato generato un 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "viene risolto in %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Eccezione" + diff --git a/module/Application/language/ja_JP.po b/module/Application/language/ja_JP.po new file mode 100644 index 00000000..d6a953ee --- /dev/null +++ b/module/Application/language/ja_JP.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 19:30-0700\n" +"PO-Revision-Date: 2012-07-15 08:20+0900\n" +"Last-Translator: sasezaki \n" +"Language-Team: Japanese\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Japanese\n" +"X-Poedit-Country: Japan\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "%sZend Framework 2%s へようこそ" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "おめでとうございます! %sZF2 Skeleton Application%s のインストールに成功しました。 あなたは Zend Framework version %s を動作させています。このスケルトンはZF2上でのアプリケーション構築を始めるためにシンプルなスタートポイントを提供します。" + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "GitHub で Zend Framework 2 をフォーク" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "開発を追う" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 は鋭意開発中です。ZF2の開発進行にご関心がおありでしょうか、Zend Framework公式ウェブサイト上ではZF2特別ポータルがあり、 %swiki%s、 %sdev blog%s、 %sissue tracker%s、 などのZF2関連のものを提供しています。最新の開発状況に追随するためのすばらしいリソースです。" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 開発ポータル" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "モジュールを見つける" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "コミュニティーはZF2モジュールのためのリポジトリとギャラリーを提供するコミュニティーサイトを開発中です。プロジェクトは %s GitHub%s で利用可能です。サイトは現在運営されており、ZF2ですでに利用可能なモジュールのリストを持っています。" + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "ZF2モジュールを探す" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "ヘルプとサポート" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "ZF2 で開発中に何らかのお手伝いやサポートが必要な場合、IRC を通じて私たちと連絡することができます。: %s#zftalk.2 on Freenode%s ベータ版についてあなたが抱えるかもしれない質問やフィードバックを何でも聞きたいと望みます。あるいは、%smailing lists%s を購読したり質問をポストしたりできます。" + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "IRC で呼び出す" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "エラーが発生しました" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "追加の情報" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "ファイル" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "メッセージ" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "スタックトレース" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "前の例外" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "例外が利用できません" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "404エラーが発生しました" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "要求されたコントローラはリクエストをディスパッチできませんでした。" + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "要求されたコントローラは存在するコントローラクラスにマッピングできませんでした。" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "要求されたコントローラはディスパッチ不可能でした。" + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "要求されたURLはルーティングにマッチしませんでした。" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "404が生成された理由について現時点で判断できません。" + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "コントローラ" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "%s に解決" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "例外" + diff --git a/module/Application/language/nl_NL.po b/module/Application/language/nl_NL.po new file mode 100644 index 00000000..fa97eae1 --- /dev/null +++ b/module/Application/language/nl_NL.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-24 12:48+0100\n" +"Last-Translator: Walter Tamboer\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Dutch\n" +"X-Poedit-Country: NETHERLANDS\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Applicatie Fundering" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Home" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Alle rechten voorbehouden." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Welkom bij %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Gefeliciteerd! Je hebt de %sZF2 Applicatie Fundering%s succesvol geinstalleerd. Je gebruikt Zend Framework versie %s. Deze fundering biedt je een startpunt om je ZF2 applicatie op voort te bouwen." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 op GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Volg de Ontwikkeling" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 wordt actief ontwikkeld. Als je interesse hebt in het volgen van deze ontwikkelingen dan kun je de ZF2 portaal bezoeken op de officiële website van Zend Framework. Daar staan links naar de ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s en nog veel meer. Het is het perfecte middel om up-to-date te blijven met de ontwikkelingen." + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Ontwikkelaars Portaal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Ontdek Modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "De community werkt aan een eigen community website die dient als een bewaarplaats en galerij voor ZF2 modules. Het project is beschikbaar %sop GitHub%s. De site staat op dit moment live en bevat een lijst met modules die op dit moment beschikbaar zijn voor ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Verken ZF2 Modules" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Hulp & Support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Als je hulp nodig hebt tijdens het ontwikkelen met ZF2, dan kun je ons bereiken via IRC: %s#zftalk.2 op Freenode%s. We beantwoorde met alle liefde je vragen en zouden graag feedback krijgen betreffende de beta releases. Je kunt je ook abonneren op de %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Ping ons via IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Er is een fout opgetreden" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Additionele informatie" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Bestand" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Bericht" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stack trace" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Vorige excepties" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Geen exceptie beschikbaar" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "De pagina kon niet worden gevonden." + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "De opgevraagde controller kon deze aanvraag niet verwerken." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Er is geen mapping beschikbaar voor de opgevraagde controller." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "De opgevraagde controller is niet bruikbaar (dispatchable)." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Er is geen route gevonden die overeenkomt met de opgevraagde URL." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "We kunnen op dit moment niet achterhalen waarom de pagina niet kon worden gevonden." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "verwijst naar %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exceptie" + diff --git a/module/Application/language/pl_PL.po b/module/Application/language/pl_PL.po new file mode 100644 index 00000000..16fcc675 --- /dev/null +++ b/module/Application/language/pl_PL.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-28 20:33+0100\n" +"Last-Translator: Łukasz Rodziewicz \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Polish\n" +"X-Poedit-Country: POLAND\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Szkielet Aplikacji" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Strona startowa" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Wszelkie prawa zastrzeżone." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Witaj w %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Gratulacje! Z powodzeniem zainstalowałeś %sZF2 Skeleton Application%s. Aktualnie używasz Zend Framework w wersji %s. Ten szkielet może służyć jak prosty punkt startowy do budowy Twoich aplikacji na ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Forkuj Zend Framework 2 na GitHub'e" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Śledź prace programistyczne" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 jest w trakcie aktywnych prac programistycznych. Jeśli jesteś zainteresowany śledzeniem jego rozwoju, istnieje specialny portal ZF2 na oficjalnej stronie Zend Framework na którym dostępne są linki do ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, oraz wiele więcej. Jest to świetne miejsce by śledzić najnowsze zmiany!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Development Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Odkryj Moduły" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Społeczność pracuje nad stworzeniem społecznościowego serwisu który posłuży jako repozytorium i galeria dla modułów ZF2. Projekt wkrótce będzie dostępny na %son GitHub%s. Ta strona jest aktualnie online i udostępnia listę niektórych modułów dostępnych dla ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Odkryj Moduły ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Pomoc & Wsparcie" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Jeśli potrzebujesz jakiejkolwiek pomocy lub wsparcia podczas programowania na ZF2, możesz skontaktować się z nami via IRC: %s#zftalk.2 w sieci Freenode%s. Z przyjemnością wysłuchamy wszelkich pytań lub sugestii które możesz mieć odnoście wydań beta. Alternatywnie, możesz zapisać się i wysłać pytanie na %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Wyślij nam wiadomość na IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Wystąpił błąd" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Dodatkowe informacje" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Plik" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Komunikat" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stack trace" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Poprzedni wyjątek" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Brak dostępnego wyjątku" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Wystąpił błąd 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Żądany kontroler nie mógł zmapować żądania." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Żądany kontroler nie mógł być zmapowany na isteniejącą klasę kontrolera." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Żądany kontroler nie mógł zostać zmapowany." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Żądany adres URL nie mógł zostać powiązany z routing'iem." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nie możemy określić tym razem dlaczego wygenerowano błąd 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Kontroler" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "rozwiązuje na %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Wyjątek" + diff --git a/module/Application/language/tr_TR.po b/module/Application/language/tr_TR.po new file mode 100644 index 00000000..5fbdbd7a --- /dev/null +++ b/module/Application/language/tr_TR.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-06 13:19+0200\n" +"Last-Translator: H.H.G. multistore \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Turkish\n" +"X-Poedit-Country: TURKEY\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Anasayfa" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tüm haklar saklıdır." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "%sZend Framework 2%s'a hoş geldiniz" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Tebrikler! %sZF2 Skeleton Application%s'u başarıyla yüklediniz. Şu anda Zend Framework %s sürüm ile çalışıyorsunuz. Bu iskelet ZF2 üzerinde uygulama oluşturmak için basit bir başlangıç ​​noktası olarak hizmet verebilir." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Zend Framework 2'yi GitHub'da fork edin" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Gelişimi izleyin" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 aktif geliştirilmektedir. Eğer ZF2'nin gelişimi ile ilgileniyorsanız, ZF2 için resmi Zend Framework websitesinde özel portal mevcut, orada ZF2 %swiki%s'ye, %sDEV blog%s'a, %ssorun takibi%s'ne bağlantılarını ve çok daha fazlasını sunar. Bu son gelişmeler ile güncel kalmak için büyük bir kaynaktır!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Development Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Modülleri keşfedin" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Topluluk ZF2 modülleri için bir depo ve galeri olarak hizmet edecek bir topluluk sitesi geliştirme üzerinde çalışıyor. Proje %sGitHub%s'da mevcut. Site şu anda canlı ve ZF2 için bazı mevcut modüllerin listesini içerir." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "ZF2 Modüllerini keşfedin" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Yardım & Destek" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "ZF2 ile geliştirirken herhangi yardım veya desteğe ihtiyacınız varsa, bize IRC: %sFreenode #zftalk.2%s üzerinden ulaşabilirsiniz. Beta sürümleri ile ilgili olabilecek herhangi bir sorunuzu ya da yorumlarınızı duymak isteriz. Alternatif olarak %smailing listelerine%s abone olup sorularınızı sorabilirsiniz." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "IRC bizi pingleyin" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "An error occurred" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Ek bilgiler" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Klasör" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Mesaj" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Denetleyici" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Önceki istisnalar" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "İstisna yok" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Bir 404 hatası oluştu" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Talep edilen denetleyici işlemi işlemesi mümkün değildir." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Talep edilen denetleyiciye uygun denetleyici sınıfı tahsis edilemedi." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Talep edilen denetleyici çağrılabilir değildir." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "İstenen URL yönlendirmede tahsis edilemedi" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Neden 404 hatasının oluştuğunu şu an belirleyemiyoruz." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Denetleyici" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "Buraya çözümlenir: %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "İstisna" + From 1b47837ee50377f5e2c4694a5652e2ef507aaa09 Mon Sep 17 00:00:00 2001 From: Zh G Date: Sat, 9 Feb 2013 19:15:40 +0200 Subject: [PATCH 104/180] added how to upload local.php file instructions Instructions to safe upload your local.php file on phpcloud.com --- ...oud_local_php_file_upload_instructions.txt | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 phpcloud_local_php_file_upload_instructions.txt diff --git a/phpcloud_local_php_file_upload_instructions.txt b/phpcloud_local_php_file_upload_instructions.txt new file mode 100644 index 00000000..34ffa838 --- /dev/null +++ b/phpcloud_local_php_file_upload_instructions.txt @@ -0,0 +1,30 @@ +How to upload local.php file for zend skeleton application on phpcloud.com step by step tutorial +------------------------------------------------------------------------------------------------ + + +1) Download FileZilla from: http://filezilla-project.org/ +2) Open FileZilla -> Settings: + Connection + SFTP + Add new key... + +And add your private key for phpcloud.com. +(FileZilla is able to convert non PuTTy compatible keys too like those +generated with github ssh keygen application.) + +4) Press OK. + +5) In host text box type: your-container-name.my.phpcloud.com +6) In user text box type: your-container-name +7) In password password box type: your-phpcloud-password +8) In port text box type: 22 +9) Press "Quick Connect" + +10) On the remote server open: applications/your-project-name/config/autoload directory. +11) Drag and drop your local.php file there. + +12) Test the result - visit: http://your-container-name.my.phpcloud.com/your-project-name/album + +.......................................... + +made by zhgzhg \ No newline at end of file From 8c26c7ff108d27d38c47d31cd85b126fb350ef31 Mon Sep 17 00:00:00 2001 From: cl-server Date: Tue, 12 Feb 2013 16:27:42 +0000 Subject: [PATCH 105/180] init --- .htaccess | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .htaccess diff --git a/.htaccess b/.htaccess new file mode 100644 index 00000000..912ca125 --- /dev/null +++ b/.htaccess @@ -0,0 +1,4 @@ + + Order allow,deny + Deny from all + From 60d5f37fe6de2543f04064bf91e82c97d925d30f Mon Sep 17 00:00:00 2001 From: wingman Date: Tue, 12 Feb 2013 16:32:55 +0000 Subject: [PATCH 106/180] Initial commit --- .gitignore | 9 + LICENSE.txt | 27 + README.md | 33 + composer.json | 22 + composer.phar | Bin 0 -> 570295 bytes config/application.config.php | 15 + config/autoload/.gitignore | 2 + config/autoload/README.md | 8 + config/autoload/global.php | 16 + config/autoload/local.php.dist | 16 + data/cache/.gitignore | 2 + init_autoloader.php | 49 + module/Application/Module.php | 39 + module/Application/config/module.config.php | 91 ++ module/Application/language/ar_SY.mo | Bin 0 -> 5526 bytes module/Application/language/ar_SY.po | 184 +++ module/Application/language/cs_CZ.mo | Bin 0 -> 5005 bytes module/Application/language/cs_CZ.po | 153 +++ module/Application/language/de_DE.mo | Bin 0 -> 5126 bytes module/Application/language/de_DE.po | 153 +++ module/Application/language/en_US.mo | Bin 0 -> 545 bytes module/Application/language/en_US.po | 153 +++ module/Application/language/es_ES.mo | Bin 0 -> 5063 bytes module/Application/language/es_ES.po | 111 ++ module/Application/language/fr_CA.mo | Bin 0 -> 5074 bytes module/Application/language/fr_CA.po | 153 +++ module/Application/language/fr_FR.mo | Bin 0 -> 5077 bytes module/Application/language/fr_FR.po | 153 +++ module/Application/language/it_IT.mo | Bin 0 -> 4922 bytes module/Application/language/it_IT.po | 154 +++ module/Application/language/ja_JP.mo | Bin 0 -> 5185 bytes module/Application/language/ja_JP.po | 140 +++ module/Application/language/nl_NL.mo | Bin 0 -> 4815 bytes module/Application/language/nl_NL.po | 153 +++ module/Application/language/pl_PL.mo | Bin 0 -> 4934 bytes module/Application/language/pl_PL.po | 153 +++ module/Application/language/tr_TR.mo | Bin 0 -> 4785 bytes module/Application/language/tr_TR.po | 153 +++ .../Controller/IndexController.php | 21 + .../view/application/index/index.phtml | 26 + module/Application/view/error/404.phtml | 61 + module/Application/view/error/index.phtml | 62 + module/Application/view/layout/layout.phtml | 57 + public/.htaccess | 7 + public/css/bootstrap-responsive.min.css | 3 + public/css/bootstrap.min.css | 610 +++++++++ public/css/style.css | 37 + public/images/favicon.ico | Bin 0 -> 1406 bytes public/images/zf2-logo.png | Bin 0 -> 738 bytes public/index.php | 12 + public/js/html5.js | 4 + public/js/jquery-1.7.2.min.js | 4 + vendor/.gitignore | 5 + vendor/README.md | 1 + vendor/doctrine/common/.gitignore | 4 + vendor/doctrine/common/.gitmodules | 3 + vendor/doctrine/common/.travis.yml | 5 + vendor/doctrine/common/LICENSE | 504 ++++++++ vendor/doctrine/common/README.md | 12 + vendor/doctrine/common/UPGRADE_TO_2_1 | 39 + vendor/doctrine/common/UPGRADE_TO_2_2 | 61 + vendor/doctrine/common/build.properties | 6 + vendor/doctrine/common/build.xml | 59 + vendor/doctrine/common/composer.json | 21 + .../Common/Annotations/Annotation.php | 75 ++ .../Annotations/Annotation/Attribute.php | 47 + .../Annotations/Annotation/Attributes.php | 37 + .../Annotation/IgnoreAnnotation.php | 44 + .../Annotations/Annotation/Required.php | 33 + .../Common/Annotations/Annotation/Target.php | 105 ++ .../Annotations/AnnotationException.php | 111 ++ .../Common/Annotations/AnnotationReader.php | 303 +++++ .../Common/Annotations/AnnotationRegistry.php | 129 ++ .../Common/Annotations/CachedReader.php | 179 +++ .../Doctrine/Common/Annotations/DocLexer.php | 140 +++ .../Doctrine/Common/Annotations/DocParser.php | 891 +++++++++++++ .../Common/Annotations/FileCacheReader.php | 209 +++ .../Common/Annotations/IndexedReader.php | 94 ++ .../Doctrine/Common/Annotations/PhpParser.php | 203 +++ .../Doctrine/Common/Annotations/Reader.php | 35 + .../Annotations/SimpleAnnotationReader.php | 152 +++ .../lib/Doctrine/Common/Cache/ApcCache.php | 97 ++ .../lib/Doctrine/Common/Cache/ArrayCache.php | 96 ++ .../lib/Doctrine/Common/Cache/Cache.php | 102 ++ .../Doctrine/Common/Cache/CacheProvider.php | 188 +++ .../Doctrine/Common/Cache/MemcacheCache.php | 121 ++ .../Doctrine/Common/Cache/MemcachedCache.php | 124 ++ .../Doctrine/Common/Cache/WinCacheCache.php | 92 ++ .../lib/Doctrine/Common/Cache/XcacheCache.php | 110 ++ .../Doctrine/Common/Cache/ZendDataCache.php | 84 ++ .../lib/Doctrine/Common/ClassLoader.php | 262 ++++ .../Common/Collections/ArrayCollection.php | 447 +++++++ .../Common/Collections/Collection.php | 243 ++++ .../lib/Doctrine/Common/CommonException.php | 28 + .../common/lib/Doctrine/Common/Comparable.php | 47 + .../common/lib/Doctrine/Common/EventArgs.php | 69 + .../lib/Doctrine/Common/EventManager.php | 136 ++ .../lib/Doctrine/Common/EventSubscriber.php | 45 + .../common/lib/Doctrine/Common/Lexer.php | 266 ++++ .../Doctrine/Common/NotifyPropertyChanged.php | 45 + .../Persistence/AbstractManagerRegistry.php | 224 ++++ .../Common/Persistence/ConnectionRegistry.php | 63 + .../Persistence/Event/LifecycleEventArgs.php | 77 ++ .../Event/LoadClassMetadataEventArgs.php | 76 ++ .../Persistence/Event/ManagerEventArgs.php | 59 + .../Persistence/Event/OnClearEventArgs.php | 84 ++ .../Persistence/Event/PreUpdateEventArgs.php | 129 ++ .../Common/Persistence/ManagerRegistry.php | 112 ++ .../Mapping/AbstractClassMetadataFactory.php | 359 ++++++ .../Persistence/Mapping/ClassMetadata.php | 165 +++ .../Mapping/ClassMetadataFactory.php | 74 ++ .../Mapping/Driver/AnnotationDriver.php | 214 ++++ .../Mapping/Driver/DefaultFileLocator.php | 169 +++ .../Persistence/Mapping/Driver/FileDriver.php | 178 +++ .../Mapping/Driver/FileLocator.php | 69 + .../Mapping/Driver/MappingDriver.php | 56 + .../Mapping/Driver/MappingDriverChain.php | 125 ++ .../Persistence/Mapping/Driver/PHPDriver.php | 70 ++ .../Mapping/Driver/StaticPHPDriver.php | 131 ++ .../Mapping/Driver/SymfonyFileLocator.php | 198 +++ .../Persistence/Mapping/MappingException.php | 57 + .../Persistence/Mapping/ReflectionService.php | 80 ++ .../Mapping/RuntimeReflectionService.php | 102 ++ .../Mapping/StaticReflectionService.php | 107 ++ .../Common/Persistence/ObjectManager.php | 143 +++ .../Common/Persistence/ObjectManagerAware.php | 49 + .../Common/Persistence/ObjectRepository.php | 78 ++ .../Common/Persistence/PersistentObject.php | 233 ++++ .../lib/Doctrine/Common/Persistence/Proxy.php | 60 + .../Common/PropertyChangedListener.php | 48 + .../lib/Doctrine/Common/Util/ClassUtils.php | 103 ++ .../common/lib/Doctrine/Common/Util/Debug.php | 123 ++ .../lib/Doctrine/Common/Util/Inflector.php | 72 ++ .../common/lib/Doctrine/Common/Version.php | 55 + vendor/doctrine/common/phpunit.xml.dist | 31 + vendor/doctrine/common/tests/.gitignore | 3 + .../Common/Annotations/AbstractReaderTest.php | 538 ++++++++ .../Annotations/AnnotationReaderTest.php | 13 + .../Common/Annotations/CachedReaderTest.php | 56 + .../Tests/Common/Annotations/DocLexerTest.php | 27 + .../Common/Annotations/DocParserTest.php | 1118 +++++++++++++++++ .../Annotations/FileCacheReaderTest.php | 40 + .../Annotation/AnnotWithDefaultValue.php | 10 + .../Fixtures/Annotation/Autoload.php | 10 + .../Annotations/Fixtures/Annotation/Route.php | 11 + .../Fixtures/Annotation/Secure.php | 18 + .../Fixtures/Annotation/Template.php | 14 + .../Fixtures/Annotation/Version.php | 11 + .../Fixtures/AnnotationTargetAll.php | 14 + .../Fixtures/AnnotationTargetAnnotation.php | 14 + .../Fixtures/AnnotationTargetClass.php | 15 + .../Fixtures/AnnotationTargetMethod.php | 15 + .../AnnotationTargetPropertyMethod.php | 14 + .../Fixtures/AnnotationWithAttributes.php | 119 ++ .../AnnotationWithRequiredAttributes.php | 50 + ...ithRequiredAttributesWithoutContructor.php | 24 + .../AnnotationWithTargetSyntaxError.php | 11 + .../Fixtures/AnnotationWithVarType.php | 62 + .../Annotations/Fixtures/ClassDDC1660.php | 30 + ...assWithAnnotationWithTargetSyntaxError.php | 21 + .../ClassWithAnnotationWithVarType.php | 31 + .../ClassWithFullyQualifiedUseStatements.php | 11 + ...lassWithInvalidAnnotationTargetAtClass.php | 17 + ...assWithInvalidAnnotationTargetAtMethod.php | 20 + ...sWithInvalidAnnotationTargetAtProperty.php | 24 + .../ClassWithValidAnnotationTarget.php | 41 + .../Annotations/Fixtures/Controller.php | 300 +++++ ...erentNamespacesPerFileWithClassAsFirst.php | 15 + ...ferentNamespacesPerFileWithClassAsLast.php | 15 + ...EqualNamespacesPerFileWithClassAsFirst.php | 13 + .../EqualNamespacesPerFileWithClassAsLast.php | 12 + ...lobalNamespacesPerFileWithClassAsFirst.php | 12 + ...GlobalNamespacesPerFileWithClassAsLast.php | 12 + .../InvalidAnnotationUsageButIgnoredClass.php | 14 + .../Fixtures/InvalidAnnotationUsageClass.php | 10 + .../Fixtures/MultipleClassesInFile.php | 9 + .../MultipleImportsInUseStatement.php | 10 + .../NamespaceAndClassCommentedOut.php | 20 + .../NamespaceWithClosureDeclaration.php | 15 + .../Fixtures/NamespacedSingleClassLOC1000.php | 1009 +++++++++++++++ .../Annotations/Fixtures/NoAnnotation.php | 5 + .../Fixtures/NonNamespacedClass.php | 10 + .../Fixtures/SingleClassLOC1000.php | 1006 +++++++++++++++ .../Annotations/Fixtures/TestInterface.php | 13 + .../Common/Annotations/PerformanceTest.php | 194 +++ .../Common/Annotations/PhpParserTest.php | 179 +++ .../SimpleAnnotationReaderTest.php | 97 ++ .../Common/Annotations/Ticket/DCOM55Test.php | 65 + .../Annotations/Ticket/DCOM58Entity.php | 8 + .../Common/Annotations/Ticket/DCOM58Test.php | 112 ++ .../Common/Annotations/TopLevelAnnotation.php | 8 + .../Tests/Common/Cache/ApcCacheTest.php | 20 + .../Tests/Common/Cache/ArrayCacheTest.php | 13 + .../Doctrine/Tests/Common/Cache/CacheTest.php | 87 ++ .../Tests/Common/Cache/MemcacheCacheTest.php | 38 + .../Tests/Common/Cache/MemcachedCacheTest.php | 40 + .../Tests/Common/Cache/WinCacheCacheTest.php | 20 + .../Tests/Common/Cache/XcacheCacheTest.php | 20 + .../Tests/Common/Cache/ZendDataCacheTest.php | 20 + .../Doctrine/Tests/Common/ClassLoaderTest.php | 45 + .../Common/ClassLoaderTest/ClassA.class.php | 6 + .../Common/ClassLoaderTest/ClassB.class.php | 6 + .../Common/ClassLoaderTest/ClassC.class.php | 6 + .../Tests/Common/ClassLoaderTest/ClassD.php | 5 + .../Common/Collections/CollectionTest.php | 195 +++ .../Tests/Common/DoctrineExceptionTest.php | 0 .../Tests/Common/EventManagerTest.php | 88 ++ .../Persistence/Mapping/ChainDriverTest.php | 94 ++ .../Mapping/ClassMetadataFactoryTest.php | 134 ++ .../Mapping/DefaultFileLocatorTest.php | 90 ++ .../Persistence/Mapping/FileDriverTest.php | 142 +++ .../Persistence/Mapping/PHPDriverTest.php | 18 + .../Mapping/RuntimeReflectionServiceTest.php | 70 ++ .../Mapping/StaticPHPDriverTest.php | 35 + .../Mapping/StaticReflectionServiceTest.php | 70 ++ .../Mapping/SymfonyFileLocatorTest.php | 88 ++ .../Persistence/Mapping/_files/TestEntity.php | 3 + .../Persistence/Mapping/_files/global.yml | 1 + .../Persistence/Mapping/_files/stdClass.yml | 1 + .../Persistence/PersistentObjectTest.php | 247 ++++ .../Tests/Common/Util/ClassUtilsTest.php | 100 ++ .../Doctrine/Tests/Common/Util/DebugTest.php | 27 + .../tests/Doctrine/Tests/DoctrineTestCase.php | 10 + .../common/tests/Doctrine/Tests/TestInit.php | 31 + .../common/tests/NativePhpunitTask.php | 246 ++++ vendor/doctrine/common/tests/README.markdown | 27 + 226 files changed, 20736 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 composer.json create mode 100644 composer.phar create mode 100644 config/application.config.php create mode 100644 config/autoload/.gitignore create mode 100644 config/autoload/README.md create mode 100644 config/autoload/global.php create mode 100644 config/autoload/local.php.dist create mode 100644 data/cache/.gitignore create mode 100644 init_autoloader.php create mode 100644 module/Application/Module.php create mode 100644 module/Application/config/module.config.php create mode 100644 module/Application/language/ar_SY.mo create mode 100644 module/Application/language/ar_SY.po create mode 100644 module/Application/language/cs_CZ.mo create mode 100644 module/Application/language/cs_CZ.po create mode 100644 module/Application/language/de_DE.mo create mode 100644 module/Application/language/de_DE.po create mode 100644 module/Application/language/en_US.mo create mode 100644 module/Application/language/en_US.po create mode 100644 module/Application/language/es_ES.mo create mode 100644 module/Application/language/es_ES.po create mode 100644 module/Application/language/fr_CA.mo create mode 100644 module/Application/language/fr_CA.po create mode 100644 module/Application/language/fr_FR.mo create mode 100644 module/Application/language/fr_FR.po create mode 100644 module/Application/language/it_IT.mo create mode 100644 module/Application/language/it_IT.po create mode 100644 module/Application/language/ja_JP.mo create mode 100644 module/Application/language/ja_JP.po create mode 100644 module/Application/language/nl_NL.mo create mode 100644 module/Application/language/nl_NL.po create mode 100644 module/Application/language/pl_PL.mo create mode 100644 module/Application/language/pl_PL.po create mode 100644 module/Application/language/tr_TR.mo create mode 100644 module/Application/language/tr_TR.po create mode 100644 module/Application/src/Application/Controller/IndexController.php create mode 100644 module/Application/view/application/index/index.phtml create mode 100644 module/Application/view/error/404.phtml create mode 100644 module/Application/view/error/index.phtml create mode 100644 module/Application/view/layout/layout.phtml create mode 100644 public/.htaccess create mode 100644 public/css/bootstrap-responsive.min.css create mode 100644 public/css/bootstrap.min.css create mode 100644 public/css/style.css create mode 100644 public/images/favicon.ico create mode 100644 public/images/zf2-logo.png create mode 100644 public/index.php create mode 100644 public/js/html5.js create mode 100644 public/js/jquery-1.7.2.min.js create mode 100644 vendor/.gitignore create mode 100644 vendor/README.md create mode 100644 vendor/doctrine/common/.gitignore create mode 100644 vendor/doctrine/common/.gitmodules create mode 100644 vendor/doctrine/common/.travis.yml create mode 100644 vendor/doctrine/common/LICENSE create mode 100644 vendor/doctrine/common/README.md create mode 100644 vendor/doctrine/common/UPGRADE_TO_2_1 create mode 100644 vendor/doctrine/common/UPGRADE_TO_2_2 create mode 100644 vendor/doctrine/common/build.properties create mode 100644 vendor/doctrine/common/build.xml create mode 100644 vendor/doctrine/common/composer.json create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/CommonException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Comparable.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventManager.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Lexer.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Version.php create mode 100644 vendor/doctrine/common/phpunit.xml.dist create mode 100644 vendor/doctrine/common/tests/.gitignore create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/CachedReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Autoload.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Route.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Secure.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetAll.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetPropertyMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithAttributes.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithTargetSyntaxError.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithVarType.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithAnnotationWithTargetSyntaxError.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithAnnotationWithVarType.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithFullyQualifiedUseStatements.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtProperty.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithValidAnnotationTarget.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Controller.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/EqualNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/EqualNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/GlobalNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/GlobalNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/InvalidAnnotationUsageButIgnoredClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/InvalidAnnotationUsageClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/MultipleClassesInFile.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/MultipleImportsInUseStatement.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespaceAndClassCommentedOut.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespaceWithClosureDeclaration.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespacedSingleClassLOC1000.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NonNamespacedClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/SingleClassLOC1000.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PerformanceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Test.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/CacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassB.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassC.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassD.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/CollectionTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/TestInit.php create mode 100644 vendor/doctrine/common/tests/NativePhpunitTask.php create mode 100644 vendor/doctrine/common/tests/README.markdown diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..ad907fa5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +nbproject +._* +.~lock.* +.buildpath +.DS_Store +.idea +.project +.settings +composer.lock diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..36e97601 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,27 @@ +Copyright (c) 2005-2012, Zend Technologies USA, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Zend Technologies USA, Inc. nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..4e7d164a --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +ZendSkeletonApplication +======================= + +Introduction +------------ +This is a simple, skeleton application using the ZF2 MVC layer and module +systems. This application is meant to be used as a starting place for those +looking to get their feet wet with ZF2. + + +Installation +------------ + +Using Composer (recommended) +---------------------------- +The recommended way to get a working copy of this project is to clone the repository +and use composer to install dependencies: + + cd my/project/dir + git clone git://github.com/zendframework/ZendSkeletonApplication.git + cd ZendSkeletonApplication + php composer.phar install + +Using Git submodules +-------------------- +Alternatively, you can install using native git submodules: + + git clone git://github.com/zendframework/ZendSkeletonApplication.git --recursive + +Virtual Host +------------ +Afterwards, set up a virtual host to point to the public/ directory of the +project and you should be ready to go! diff --git a/composer.json b/composer.json new file mode 100644 index 00000000..b70734ed --- /dev/null +++ b/composer.json @@ -0,0 +1,22 @@ +{ + "name": "zendframework/skeleton-application", + "description": "Skeleton Application for ZF2", + "license": "BSD-3-Clause", + "keywords": [ + "framework", + "zf2" + ], + "homepage": "http://framework.zend.com/", + "repositories": [ + { + "type": "composer", + "url": "http://packages.zendframework.com/" + } + ], + "require": { + "php": ">=5.3.3", + "zendframework/zendframework": "2.*", + "zendframework/zendservice-recaptcha": "2.*", + "doctrine/common": ">=2.1" + } +} diff --git a/composer.phar b/composer.phar new file mode 100644 index 0000000000000000000000000000000000000000..48edaa6149f3581df05a06f283f27ad50ff879de GIT binary patch literal 570295 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 literal 0 HcmV?d00001 diff --git a/config/application.config.php b/config/application.config.php new file mode 100644 index 00000000..6504dea7 --- /dev/null +++ b/config/application.config.php @@ -0,0 +1,15 @@ + array( + 'Application', + ), + 'module_listener_options' => array( + 'config_glob_paths' => array( + 'config/autoload/{,*.}{global,local}.php', + ), + 'module_paths' => array( + './module', + './vendor', + ), + ), +); diff --git a/config/autoload/.gitignore b/config/autoload/.gitignore new file mode 100644 index 00000000..1a83fda6 --- /dev/null +++ b/config/autoload/.gitignore @@ -0,0 +1,2 @@ +local.php +*.local.php diff --git a/config/autoload/README.md b/config/autoload/README.md new file mode 100644 index 00000000..4e504db0 --- /dev/null +++ b/config/autoload/README.md @@ -0,0 +1,8 @@ +About this directory: +===================== + +By default, this application is configured to load all configs in +`./config/autoload/{,*.}{global,local}.php`. Doing this provides a +location for a developer to drop in configuration override files provided by +modules, as well as cleanly provide individual, application-wide config files +for things like database connections, etc. diff --git a/config/autoload/global.php b/config/autoload/global.php new file mode 100644 index 00000000..1473720f --- /dev/null +++ b/config/autoload/global.php @@ -0,0 +1,16 @@ +add('Zend', $zf2Path . '/Zend'); + } else { + include $zf2Path . '/Zend/Loader/AutoloaderFactory.php'; + Zend\Loader\AutoloaderFactory::factory(array( + 'Zend\Loader\StandardAutoloader' => array( + 'autoregister_zf' => true + ) + )); + } +} + +if (!class_exists('Zend\Loader\AutoloaderFactory')) { + throw new RuntimeException('Unable to load ZF2. Run `php composer.phar install` or define a ZF2_PATH environment variable.'); +} diff --git a/module/Application/Module.php b/module/Application/Module.php new file mode 100644 index 00000000..86d9d4e2 --- /dev/null +++ b/module/Application/Module.php @@ -0,0 +1,39 @@ +getApplication()->getServiceManager()->get('translator'); + $eventManager = $e->getApplication()->getEventManager(); + $moduleRouteListener = new ModuleRouteListener(); + $moduleRouteListener->attach($eventManager); + } + + public function getConfig() + { + return include __DIR__ . '/config/module.config.php'; + } + + public function getAutoloaderConfig() + { + return array( + 'Zend\Loader\StandardAutoloader' => array( + 'namespaces' => array( + __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, + ), + ), + ); + } +} diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php new file mode 100644 index 00000000..a6dd62b8 --- /dev/null +++ b/module/Application/config/module.config.php @@ -0,0 +1,91 @@ + array( + 'routes' => array( + 'home' => array( + 'type' => 'Zend\Mvc\Router\Http\Literal', + 'options' => array( + 'route' => '/', + 'defaults' => array( + 'controller' => 'Application\Controller\Index', + 'action' => 'index', + ), + ), + ), + // The following is a route to simplify getting started creating + // new controllers and actions without needing to create a new + // module. Simply drop new controllers in, and you can access them + // using the path /application/:controller/:action + 'application' => array( + 'type' => 'Literal', + 'options' => array( + 'route' => '/application', + 'defaults' => array( + '__NAMESPACE__' => 'Application\Controller', + 'controller' => 'Index', + 'action' => 'index', + ), + ), + 'may_terminate' => true, + 'child_routes' => array( + 'default' => array( + 'type' => 'Segment', + 'options' => array( + 'route' => '/[:controller[/:action]]', + 'constraints' => array( + 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', + 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', + ), + 'defaults' => array( + ), + ), + ), + ), + ), + ), + ), + 'service_manager' => array( + 'factories' => array( + 'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory', + ), + ), + 'translator' => array( + 'locale' => 'en_US', + 'translation_file_patterns' => array( + array( + 'type' => 'gettext', + 'base_dir' => __DIR__ . '/../language', + 'pattern' => '%s.mo', + ), + ), + ), + 'controllers' => array( + 'invokables' => array( + 'Application\Controller\Index' => 'Application\Controller\IndexController' + ), + ), + 'view_manager' => array( + 'display_not_found_reason' => true, + 'display_exceptions' => true, + 'doctype' => 'HTML5', + 'not_found_template' => 'error/404', + 'exception_template' => 'error/index', + 'template_map' => array( + 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', + 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', + 'error/404' => __DIR__ . '/../view/error/404.phtml', + 'error/index' => __DIR__ . '/../view/error/index.phtml', + ), + 'template_path_stack' => array( + __DIR__ . '/../view', + ), + ), +); diff --git a/module/Application/language/ar_SY.mo b/module/Application/language/ar_SY.mo new file mode 100644 index 0000000000000000000000000000000000000000..fa7ae166939da5c016a79122da666e4ff85e3cf8 GIT binary patch literal 5526 zcmb7|%X1u86~-?l1dzik51s+80fkWU46^K$!#F0$mJ}Q8pt8mZ32b_1u4X#w>7MjM ziYSUIzhp%eVFQ0aFp9=1+p@47$0-)D;jw{Y0oA?9jtx~TS+D_q=XTFS!XYrFo-^I| z+;hHj&Ueo3(p&f4{S(DUb3G*2yOerVhL))ZdT~ zAxGr?Zlykqd=UA5PLLt4~8Ej-^+dXJ-Od& z$PaS=8>HC#Gg5H<6}b!fFQj7Mu6vXk=jXj_K7o7^Sw{X4`2_M8$gd#(ffWDy-j~~- zMV?~+3rO+vOThn=`#&J}bN_psXyje@D)l+!7m$MEDY-}Q+sF@b|NRf-daocQKbuI& z>#vYNQ*RaPe?dx~@4=bi7)O2@c@p_2>~)a*scDiaeoi69j*Aq%Wu(OaGvvpRw~>e0 z_ebQD+&@5)Uqn`slgM8qzmD96vFDJ_ARj?qLrT6fT){cp$t{6MFyHer>`q2z5}eCt+wBYNF9_V>j>}PrLqH5Vjq;Qxl%2L$}$A zBORK^gbSuoRulft-A4ky89H&|*je`= zK*d~HS6gnRqn^dO<7U3SGY*siIQqImZ0L$sT)-#hI-I$C%zlQ>PQO_ z#V$sNlI;vBMQ&`9HpIu!5R)4R;gSuoDV@P@A*67ooij>EZFDCLUNH4oeDy=2P<@8v zNq!=v6}p$5HzM4D~q7J-nr(9WHmj*N!@$dm+hlGb5u&xt6qIe#{`8%j5z9@;$-X@!d!hBghOR*i_8Z{8L?fN7%Mu$AdE_qvQkt91* z#e38EhFK_s@>%0S6Kk4bw|#7lk48$$JTwOM42|u0YNw_YH1Qiu8K*8y(&LznjMp}yAjy2;C*+ci!Q7miFKrKC z(bO#4m@y0x2)f`lOa!C+dGeCCr&t?}7TtMwG}^;2KO3&mcNX1UzUh@wfMwUm?B&OSu`v`&CmAzxOzqS=p!e>pJofmbWBbrM?nH5^8ajSN1VLEQ zRcCR|%Hp$B0@sk+nwd2C*azufVd3kNlA6GkRJbgDXCdVHWKz~)R?n)2&`%<_tU zyynIu-zv=nhPQ{(H_Q@)un`>xD+Y@=%s`=sv!bW`CZne{SUM6UOoXM1KK1mm>eQs3 ztxi;@W(VtsIVx!ARz;Tw4`(@n>a7_bm&RBqkIZ;U=y)ZL({@zRe#hQMhsF=;{O6%Z z{N0E4e(B(dO0T3hvvWGVn%+t;+TPux)Aj5ePfxRUNvCgStLc``&Sxv>Wv4rk{JPNmSQ&+MxteinRy^@{A#v9n!?pXF|m2PAgaK48#?W>z6`L{vwuK8yE%CCQ*_46>AD4*RgP0*i@|d`6kL+>1(9!Iu}G)vsI9k zOGP(`L#Sts3VBzAzPZDmlhZ;Wsn3eu<|!`#rDT(kS||kFyJSQtAmA<+0e3~{u-t=Z$+1ifbOtE;rn%qIJEZtJ@d`tV-n(d%{OTZEEUwcqZ}3eDieQBa zIG{dIMzXe%US=aK<$-uCQr)i))+Hr(ig!(_DPD!cd5x&9FbHQwCRbop(a{6Mc}fM! z8I)fmx&n;wjXGH{qtSo7om#+K!U73gNr1ExBSuPVDGLYtMUW&C>w4Zo^1f>K2{&)y z_SHOop;Q+fm+t)LS_H)WkdVZ0;YZNZhOA4i>`K2|Gyy=|A&w2`!(+ypY_Xk7VzUb} z26`hwI@C@S#;0W>otnOmM!K`@w#^zg-5_}@Id6)o+pGGvcirtXst*UqS8c7pBCP1q zT_VFcgOKkW(<-bY&C)G7tA@(hr_eUIMdFG{)y=1deJF#Wo8Gbs#KA3`t)$(-0a6Sq zAZ=zZ7g}gs&Mw&UlW9EK!3v27c6y_(K;Jjph0LqNJSS2+6oEmL*jTN3duC|@l}D?5 z{~&us71rL)cyZ_nr#EH%4O)(5T(*H0gNsQ2Pa^{Z0z&eXcDHAMVL?G;5!1GZI0U71 z>-m9HoY|s~Pj~r8hV8^`aAa9-ZZKUhW*1Q89P3JR%NZo6=k}Lac?)M, 2012. +# Tawfek Daghistani , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-07 13:58+0300\n" +"Last-Translator: Tawfek Daghistani \n" +"Language-Team: Arabic <>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: English\n" +"X-Poedit-Country: UNITED STATES\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +#: ../view/layout/layout.phtml:6 ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "الصفحة الرئيسية" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "جميع الحقوق محفوظة" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "أهلا بك في %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "" +"Congratulations! You have successfully installed the %sZF2 Skeleton " +"Application%s. You are currently running Zend Framework version %s. This " +"skeleton can serve as a simple starting point for you to begin building your " +"application on ZF2." +msgstr "" +"تهانينا! لقد قمت بتنصيب %sZF2 Skeleton Application%s . أنت الآن تستخدم مكتبة " +"زيند الإصدار %s . هذا التطبيق يمكن أن يكون لك نقطة بداية سهلة في بناء " +"برامجك الخاصة على مكتبة زيند " + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "اشتق مكتبة زيند على GitHub " + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "تابع أخر التطورات" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "" +"Zend Framework 2 is under active development. If you are interested in " +"following the development of ZF2, there is a special ZF2 portal on the " +"official Zend Framework website which provides links to the ZF2 %swiki%s, " +"%sdev blog%s, %sissue tracker%s, and much more. This is a great resource for " +"staying up to date with the latest developments!" +msgstr "" +"مكتبة زيند تخضع للتطوير المستمر , إذا كان لديك الرغبة في متابعة التطورات , " +"بإمكانك تصفح الموقع الرسمي للمكتبة الذي يحتوي على روابط إلى %swiki%s, %sdev " +"blog%s, %sissue tracker%s, ,و المزيد . هذه مصادر رائعة لمتابعة أخر التطورات" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "بوابة التطوير الخاصة ب زيند" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "تعرف على الإضافات" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "" +"The community is working on developing a community site to serve as a " +"repository and gallery for ZF2 modules. The project is available %son GitHub" +"%s. The site is currently live and currently contains a list of some of the " +"modules already available for ZF2." +msgstr "" +"المجتمع البرمجي يعمل على تطوير موقع خاص به ليكون كمصدر و معرض لإضافات ZF2 . " +"هذا المشروع موجود على %son GitHub%s . هذا الموقع يخضع للتطوير المستمر و " +"يحتوي على قائمة من الإضافات الخاصة ب ZF2 " + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "إكتشف إضافات ZF2 " + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "الدعم و المساعدة " + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "" +"If you need any help or support while developing with ZF2, you may reach us " +"via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or " +"feedback you may have regarding the beta releases. Alternatively, you may " +"subscribe and post questions to the %smailing lists%s." +msgstr "" +"إذا كنت تريد الحصول على دعم فني أو مساعدة في تطوير ZF2 , بإمكانك التواصل عبر " +"IRC: %s#zftalk.2 on Freenode%s. نحن نريد أن نسمع منك المزيد من الأسئلة , " +"الأراء و الملاحظات على النسخة التجربية من المكتبة , أو بإمكانك الإشتراك و " +"التفاعل أو وضع الأسئلة في القائمة البريدية %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "تواصل معنا في IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "حصل خطأ ما " + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "مزيد من المعلومات" + +#: ../view/error/index.phtml:11 ../view/error/index.phtml:35 +msgid "File" +msgstr "ملف" + +#: ../view/error/index.phtml:15 ../view/error/index.phtml:39 +msgid "Message" +msgstr "الرسالة" + +#: ../view/error/index.phtml:19 ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "تفاصيل الخطأ" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "الأخطاء السابقة" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "لايوجد خطأ" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "حصل خطأ 404 , الصفحة غير موجودة" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "المتحكم المطلوب غير قادر على إجابة الطلب" + +#: ../view/error/404.phtml:13 +msgid "" +"The requested controller could not be mapped to an existing controller class." +msgstr "لا يمكن ربط المتحكم المطلوب بأي من المتحكمات الموجودة حالياًَ" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "المتحكم المطلوب غير قادر على الإجابة " + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "الرابط المطلوب غير معرف لدى الموجه" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "لا يمكنني التحديد لماذا حصل الخطأ 404 في هذا الوقت " + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "المتحكم " + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "يوصل إلى %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "خطأ برمجي" diff --git a/module/Application/language/cs_CZ.mo b/module/Application/language/cs_CZ.mo new file mode 100644 index 0000000000000000000000000000000000000000..46f2c0f637a83e5aea25000e19c7016663ff5d98 GIT binary patch literal 5005 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 QV;@(@2=$5oVl3(S4+(UTng9R* literal 0 HcmV?d00001 diff --git a/module/Application/language/cs_CZ.po b/module/Application/language/cs_CZ.po new file mode 100644 index 00000000..2485e2d6 --- /dev/null +++ b/module/Application/language/cs_CZ.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-06 13:05+0100\n" +"Last-Translator: David Lukas \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Czech\n" +"X-Poedit-Country: CZECH REPUBLIC\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton aplikace" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Úvod" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Všechna práva vyhrazena." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Vítejte v %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Blahopřejeme! Úspěšně jste nainstalovali %sZF2 Skeleton Application%s. Právě používáte Zend Framework verze %s. Tato kostra aplikace vám poslouží jako jednoduchý výchozí bod, ze kterého můžete vyjít při tvorbě vlastní aplikace nad ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 na GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Sledujte vývoj" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 je aktivně vyvíjen. Chcete-li sledovat vývoj ZF2, máte na oficiálních webových stránkách Zend Framework k dispozici zvláštní portál ZF2, na kterém najdete odkazy na ZF2 %swiki%s, %svývojářský blog%s, %sissue tracker%s a mnoho dalšího. Tento portál je skvělý zdroj aktuálních informací o nejnovějším vývoji!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Vývojářský portál ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Objevte Moduly" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Komunita pracuje na vývoji komunitního webu, který bude sloužit jako archiv a galerie modulů ZF2. Tento projekt je dostupný %sna GitHub%s. Web je aktuálně v provozu a obsahuje seznam některých již dostupných modulů ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Prozkoumejte Moduly ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Pomoc & Podpora" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Budete-li při vývoji se ZF2 potřebovat jakoukoli pomoc nebo podporu, můžete nás zastihnout přes IRC: %s#zftalk.2 na Freenode%s. Budeme rádi za jakékoli vaše otázky nebo připomínky týkající se beta verzí. Případně se také můžete přihlásit k odběru a posílat otázky na naše %se-mailové distribuční seznamy%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Ozvěte se nám na IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Vyskytla se chyba" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Další informace" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Soubor" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Zpráva" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Trasování zásobníku (Stack trace)" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Předchozí výjimky" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Žádná výjimka není k dispozici" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Vyskytla se chyba 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Požadovaný controller nemohl vyřídit požadavek." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Požadovaný controller se nepodařilo namapovat na žádnou existující třídu controlleru." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Požadovaný controller nepodporuje vyřízení (controller not dispatchable)." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "S požadovaným URL nebyla při směrování (routing) nalezena shoda." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Momentálně nedokážeme určit, proč byla vygenerována chyba 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "je mapován na %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Výjimka" + diff --git a/module/Application/language/de_DE.mo b/module/Application/language/de_DE.mo new file mode 100644 index 0000000000000000000000000000000000000000..fcea0366faf48b28a5e7b083f717dc36c6dda9c4 GIT binary patch literal 5126 zcma)3*uf4mr6|b{+*LLC)HQhBcmFejo zs;XzatB4a42M!=15C;Sj%00lr;$U$Zi4zClP7rsH5H}7;{9bj>&UlFvTD$Y6yQ|*c z?|t>=?Gwj-oNztQ|7ZDs`h7|ACFJq<^TG8i@|R5bIEfE$AV0+Y4?kGj{VDP( z?%zU+zTY7~g8VZwVg1|4Rlff9i6q%Zo?vqu`7PuHzG6B0r7%0#aOD zLw*u@38|2GkP^oPDf_>Vd;@(yLE>U^@?-V7=aA2Fe*r0Zd$o}Rl$yDeYb=u$CT2;FPlbcW$YJD`yZ5kDv_U))a zJENk1MPRq9iozB>bs!{ zvUxu>qnNtQ`=h)h010yTcFX1_*|M3tTGdIenS7+q z=;7!kwOfrwr3=Zma%ht4-ROH^NU1LNRbSQ-kgpf1NgsnMt1U@P6C3*C(Q@23)MVA@ zw67|!##XEAx2~*_$S)prsnehxUD$HQ6lG>4zjw_GnaT-R($zPb{9yIlmGKg?7t>vQ z>F9KDXduGCnVxnrt5W%n2^zz>(cYkSJrBkeRGx(F&pq>1$EVJA3`R1l<->v{?AI6? zYMV=Bx%I*0W3mn0bk8I=OLbTbrN=DO9kRb8iwT$H5^b{M%-ELPn_1y}vKz$z;B;z| zJ={&p;jk)f0Ki@e=0pYi7xJnX7I_Q|TQ`Wb$}?4zfjTO9BJJ~{1Cq*0`s(NwaiQ*(qdP|f6a(imi*N)PTvMEl6l! z4S5chyiNKfDe|XS@0r3td%}r#O%6<=YIyBYhFU%C6DjjT$EzKBSm(*nl~T~E$RHG* zNnbgAb;*wAaUjdhF zEW2G>zj`!)iRnbNK__qp03F-Rco0<#$V=UcqV2Sw*nvImm-&Vhs*{(!`p$Y^ksMlT zV4OUXmL67U8^VzdaYyfZATh{c1N){X;t-}8YvpULl^50OSJuwG$oG{M7PfA|C~_hlUH4VBa(?aX`FhB191 z>DJWdm^QdV(EIAb&|EUy(r9kK4XnPgbVC=t3RY|F89l`NEtb+&wo|d$s|yF+76}i$ zymUbA9^Hih+t;@@=fR(CuPn)a0Mgpq9}!G2_rsS*IaKkIqLZ9A;o|MRt=9SZI`Oq@ zTx%1*gvr;``Hl@sueNqd!|c#{+3drOnZH3Nqp%6h%okjS?P=8hnrhD<&H`IgSLruh z%-@g;BHZW2=B@4Zo3G8^>~ip={T)=bR#4VnN;WAqji?O0Aj8d;=|iweSKZ`Z<)?3k z14awba{bZK#;98+?E|NA={lybIfsgNvWb#Lflww&dL}sdpx_*KwI)vHeEKjQOsc}C z{Zne!8s?pj;ZWe)yG=HXPIN0MmsV;9B5PcbwuexQDo{X}#p#SrMp*+{l!9`9WJ=)l z+^`I0UeY&xh`R&$OI`05DABoB1Ou^}o*z}kAS|oy^r7Q5Tre>lAjr)kOl&&HtD?88 zI@;rmbU$HZZ+OI>VsgMKv_CQip(8W2b`cX%Pdmwa;VxRPBMk%~osuEnLVn_dKgQ|n~AW9(6zYG{Q> z{x@VP%k)98(EYL+$cZ{2rDQ2;2LUQ8DJJ0S$}BZ~*ddsV^Wi7GfLp9+q0m^)ZOl_bd_9;xjFHCpF3YIZK&a6%eSp%% zsY?x}4+;T{pg3x*L40Ji!eYq;9s?J!Mzf7?8KlW%ZJ297#P<}*zjQ~kiH zBBvjWDzgRF-NK?>S+WfNbD;!jlB*iFKv8UtIY1-QId+>4i^s@72D3mj&Y?(S&O?f; znUgyahH)+4V$rKt3Jy#Y`yAi;(>L=-SVjqBGD(3xxP+q^ZPN!`3LONng5tViIOnB% z1zAVuhIXWC*z z{JHapDoN?#WcPB;tY&~{&tSTs0{@RX$z&lR3fs7<3nbp%{)Ar~^#(Xvn&1YV5m|D* z=t`GJlaRg!2SjtPlGi?VwGEL3V^LsCX}Mb2aQdL`7j2Xdu=5|GoCSZz1id-QZ3S325l6x zfl%lh9D(^r)QgLxl=\n" +"Language-Team: ZF Contributors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Startseite" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Alle Rechte vorbehalten." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Willkommen zu dem %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Herzlichen Glückwunsch! Sie haben die %sZF2 Skeleton Application%s erfolgreich installiert und benutzen gerade die Version %s des Zend Frameworks. Dieses Gerüst kann Ihnen als Einstiegspunkt, für Ihre weitere Entwicklung, basierend auf dem Zend Framework 2, dienen." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 auf GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Folge der Entwicklung" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Das Zend Framework 2 wird z.Z. aktiv weiterentwickelt. Sollten Sie daran interessiert sein, die Entwicklung von ZF2 zu verfolgen, so bietet Ihnen die offizielle Webseite einen eigens für das Zend Framework 2 eingerichteten Bereich, auf der Sie Verlinkungen zum ZF2 %sWiki%s, %sEntwickler Blog%s, einem %sFehlerverfolgungssystem%s und noch vielem mehr finden. Dieser Bereich ist eine hervorragende Quelle um stets aktuell zu bleiben." + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Entwickler Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Entdecken Sie Module" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Die Community arbeitet momentan an einer Community Seite, welche als Galerie für ZF2 Module dient. Dieses Projekt ist %sauf GitHub%s verfügbar. Die Webseite ist bereits Online und enthält eine Liste mit schon veröffentlichten Modulen für das Zend Framework 2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Erkunden Sie ZF2 Module" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Hilfe & Support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Sollten Sie Hilfe jeglicher Art bei der Entwicklung mit dem Zend Framework 2 benötigen, kontaktieren Sie uns doch einfach über das IRC: %s#zftalk.2 on Freenode%s. Wir freuen uns darauf, Ihnen bei Ihren Fragen zu helfen oder aber auch Ihre Meinung bezüglich der Beta Versionen zu hören. Alternativ können Sie auch die %smailing lists%s abonnieren und Ihre Fragen dort stellen." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Schreiben Sie uns im IRC an" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Ein Fehler ist aufgetreten" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Zusätzliche Information" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Datei" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Meldung" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stapelüberwachung" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Vorherige Ausnahme" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Es ist keine Ausnahme verfügbar" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Es trat ein 404 Fehler auf" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Der angeforderte Controller war nicht in der Lage die Anfrage zu verarbeiten." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Der angeforderte Controller konnte keiner Controller Klasse zugeordnet werden." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Der angeforderte Controller ist nicht aufrufbar." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Für die angeforderte URL konnte keine Übereinstimmung gefunden werden." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Zu diesem Zeitpunkt ist es uns nicht möglich zu bestimmen, warum ein 404 Fehler aufgetreten ist." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "wird aufgelöst in %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Ausnahme" + diff --git a/module/Application/language/en_US.mo b/module/Application/language/en_US.mo new file mode 100644 index 0000000000000000000000000000000000000000..972a28ab34c2f0d90cabf56f0d021c5f205bbc09 GIT binary patch literal 545 zcmaJ+O;5r=5XI=JN6#Mi;L*WCV!(=quaXc!i4ehb)vOfK!O`$uD#=6e|OmacsLHr?6s=z73-+k!ZznDgs*g(XHw}45ig~6 zNSCu{0L@ZYSY4onkZmPOr-5kB6?qRZF_\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: English\n" +"X-Poedit-Country: UNITED STATES\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "" + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "" + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "" + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "" + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "" + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "" + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "" + diff --git a/module/Application/language/es_ES.mo b/module/Application/language/es_ES.mo new file mode 100644 index 0000000000000000000000000000000000000000..3728554767333faa67772174898cf3de1d245970 GIT binary patch literal 5063 zcmai&&5s;M8OAG+@UaO55=@*)yz{h}at&GPZZ|3a_*Bt}$2$siwPjro25} z?XK=w&x!+QB*X>&fJh*bgQZB303jq0djJjyP8@TMgv5~pT;TUs_k8SPk&$QLsp+cs z`+e#ezx~vsKT*6i@8{(Gh*D=nzK1`&{)qe-@=wT*Bj0Y<|3rS2_0oHl`Umnk6?8-$U|G{fIwLCLWcjV*9{~#6T9)F)wt9*Qd!&}I&A-l*QA}=C;gS>$J7gFqh`2&sq9po*} z-$ja@-{Jf_tp9@i1nXa7MB@J|^3%w7kYfL_CzSd(@>!(Bf9gX`UNlnHt4PV~B_t-* z9i*J=BhMlakP^>Nk+`mYg?tUWzeURaC!bVm8TkzI6!H>M{Mc#NcahJt{yy?W&ixE2 zasHVi>>!sY(i!A;k>`;=Kwd%~AwP$Fgkp$)&m$|&_mEP*U*Hr=MVX@?h?p;t518Et&aZX6{pKO&s{#ycWj>Ojna(lfiL&<*p>lTQPBEzG~l$Gcyyvr+1ta^gCmDhbcaJlZ+E=%P(-CI_^vV9VY$jZiOSEdc zv}5O4+iBr~dRR-Uol1hLN|RW%OALu0jq2Q0bal|uh@uyz3&}PMn}Vxi(iZx$w8Z2p zUru6x1DOmyOG8S}jGB&;rnb5${au?>Vrv!(g_?Cp)BH5Im|@d=YBI7K_0PXb=wHJu zG82+D?e}z`n?y=ZTf^F9^hSzv)7(v6>&66>HrAcayLIzAk=9wNb6-(h4R|C&9`tE1 zU(2waJR&YMBXsg)Q3yPET&5&=Cuv>WotZ$9B`0$S7M>q4>f%M}LLpvA&EI8voy#V% zIXx89(5mmM+Z5a6QK_X-M=mF!6?@2Y<;dH?kR(M=73%|=Td+`o^0v)rlc*Z7I}Tf` z%Rxz*7hphdGuS3mCwEFg>pTTzOd>-v?JbEaM(($piRx^ooo_Zb$XZ0;>F_UHM@u)E)UxVq zg@H>um+L|3?D{pmwEfy{=Zbg+_I0jeb4{AWeb-H>I=iLG0}=RgP4`lt?RnkfW*X>=Ca#PuUL6STb?L6JE?qbIpa$_e zyVi^dVnbh%>2m!V9YJ3_-0P6{iifWrQo`oY*5=mwJn(bfl_fbub98nm1%Xude)Xjy z114V4Oi>wZb?MgbM(6x|pZK|F%g%b9c!BmceZKFinL8xtTb*rh;T4^4*a;AshU*M8 zy4wite8XjK0_JtNrn~bmr-7~Mox2YB{YS*WpF6Pa^*<{FvhWU{F@K9~)_pfhQ zsEgxJfRSIUxg0>cO+d4S-3?IF0+PE@~@aN9ttMOqmncLkSeVEfT03 z?BkH(0xpjpkPl0674)NkAyF7?W2iRSz1s0)My60UV}07oO?Ncm zHPPt;N~gboXH#PKMRh%LE_hjL(x!@nHhpt9R5{gSN9G0Rmnq4cw`NxZSS<{-v`(%P zS|iL*a=v?N<7~s3rAekN&W4uRE!4jq!Fk{Lmf}4GUU6RVC=xun&*p#*^=N_N_Ke!G zkICkKdopwAcf0Seg)yR`Y-=!Naz3n literal 0 HcmV?d00001 diff --git a/module/Application/language/es_ES.po b/module/Application/language/es_ES.po new file mode 100644 index 00000000..5170d3ce --- /dev/null +++ b/module/Application/language/es_ES.po @@ -0,0 +1,111 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-06 19:07+0100\n" +"PO-Revision-Date: 2012-07-06 19:09+0100\n" +"Last-Translator: Adolfo Abegg \n" +"Language-Team: ZF Contributors \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: Spanish\n" +"X-Poedit-Country: SPAIN\n" +"X-Poedit-SearchPath-0: ..\n" + +msgid "Skeleton Application" +msgstr "Aplicación Esqueleto" + +msgid "Home" +msgstr "Inicio" + +msgid "All rights reserved." +msgstr "Todos los derechos reservados" + +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenido al %sZend Framework 2%s" + +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "¡Felicitaciones! Haz instalado correctamente el %sla aplicación esqueleto del ZF2%s. Estás corriendo la versión %s del Zend Framework. Este esqueleto te servirá como un punto de inicio sencillo para empezar a construir tu aplicación con el ZF2." + +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Hacer un Fork del Zend Framework 2 en GitHub" + +msgid "Follow Development" +msgstr "Seguir el Desarrollo" + +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "El Zend Framework 2 está en pleno desarrollo. Si estás interesado en seguir el desarrollo del ZF2, existe un portal especial para el ZF2 en el sitio web oficial del Zend Framework el cual provee enlaces %sa la Wiki%s, %sal Blog de desarrollo%s, %sal issue tracker%s y mucho más. Este es un gran recurso para mantenerte al día con los últimos avances en el desarrollo!" + +msgid "ZF2 Development Portal" +msgstr "Portal de Desarrollo del ZF2" + +msgid "Discover Modules" +msgstr "Descubre Módulos" + +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La comunidad está trabajando en el desarrollo de una web comunitaria que servirá de repositorio y galería de los módulos del ZF2. El proyecto está disponible %sen GitHub%s. El sitio web está en línea y actualmente posee una lista de algunos módulos que ya están disponibles para el ZF2." + +msgid "Explore ZF2 Modules" +msgstr "Explora los módulos del ZF2" + +msgid "Help & Support" +msgstr "Ayuda & Soporte" + +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si necesitas alguna ayuda o soporte mientras estás desarrollando con el ZF2, puedes encontrarnos via IRC: %s#zftalk.2 en Freenode%s. Nos encantaría leer tus preguntas o cualquier feedback que puedas tener en relación a los lanzamientos de las versiones beta. También puedes subscribirte y enviar preguntas %sa la lista de correos%s" + +msgid "Ping us on IRC" +msgstr "Escríbenos en el IRC" + +msgid "An error occurred" +msgstr "Ha ocurrido un error" + +msgid "Additional information" +msgstr "Información adicional" + +msgid "File" +msgstr "Archivo" + +msgid "Message" +msgstr "Mensaje" + +msgid "Stack trace" +msgstr "Seguimiento de la pila (stack trace)" + +msgid "Previous exceptions" +msgstr "Excepciones anteriores" + +msgid "No Exception available" +msgstr "No hay ninguna Excepción disponible." + +msgid "A 404 error occurred" +msgstr "Ha ocurrido un error 404" + +msgid "The requested controller was unable to dispatch the request." +msgstr "El controlador solicitado no pudo ejecutar la petición." + +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "El controlador solicitado no se pudo mapear con una clase de controlador existente." + +msgid "The requested controller was not dispatchable." +msgstr "El controlador solicitado no es ejecutable." + +msgid "The requested URL could not be matched by routing." +msgstr "El ruteador no ha encontrado la ruta para la URL solicitada." + +msgid "We cannot determine at this time why a 404 was generated." +msgstr "No pudimos determinar por qué un error 404 ha sido generado." + +msgid "Controller" +msgstr "Controller" + +msgid "resolves to %s" +msgstr "se resuelve a %s" + +msgid "Exception" +msgstr "Excepción" + diff --git a/module/Application/language/fr_CA.mo b/module/Application/language/fr_CA.mo new file mode 100644 index 0000000000000000000000000000000000000000..956a0d9d90577e1c8366e18ddc2efc7397c014ef GIT binary patch literal 5074 zcmai%O>i7X6~~7VzLY?~!GwSqX=b|L$Nzow zf8Rd$_|GCP#phZ1yf2ErDDpABxc-RzB=S$lPa)r)-Tw>u3GSEPA4UH}K8swE`^Tf` zG6!{_UAAX>=`)lOKxc>uE z^!)`Xe*GQ!1oA(~h<#6dFp5_B_enPIAisfZBY%v%hWriktH^hdV*jNN*ZTL6x7mLe zDRzE`^MB?3&&bbl{}3b3A>TqigZ$e}{u}ui>&`t{`*HrGwZ02TiT?`n)5tX>CZq4q z?qg(&``3|z#~Vm_|6Al1`hGvVf9k2){xe9y|0Sg8`xa8-kCBpx`^XpA_ao$0?teuR zZX*AI>>#@=lDH3$d&plPpGUrfd;$3!PW+JlYe-B-Zvis55or#7Ap%|^1qaLoT-YA` zBK(kl*(;Z%L;U+ZpYwb^!$aOuR^gJ`Y%Wq9eU^{l zAeYol)Kix`mz8lYcPfwL$~luny(F=v%`=@Un+=-LA?qn+?@#CQH<&(_?d(y8|^b&f_ZT+G>Afz4DF5SZ6Bu zth85Jc{?srJSw#-MNg62tW?CRj_|h3Ro@J4ruvml6M4^5r}W$_g%Lb%M?_n?oH$&x zVSSwAf!fKFDm6a3em^!vfbRPJBFzavf^6Py+SEjwY|RhVhMAZ&FUBS-c|;&*;#w7Z z-?Zh8svq4jX`x=!g-63WE}zddXYLDVNfNtC5h?K zmLu`#V%RsMfG>R=ADkEnW#G(EyMU@>zHds6;nZkv(ArB&<1#W2AV+i0eAV}{vwee+ zglze8!4mfC8X9YxN@S_^rN_r;hjPbm zaXxxfNk)661XVg6n`oaH;(R==GFwvBUP&Q}UX(6?trr$~TL#b;>d_fuvSsd$LV!c* z4E~pbl$sgW6(vP&RN?ZwCN9O+Nhl=hq(bWAr?|xoi{@REf@;t|e-u-{nqH(Q1T~cp zl&6|R3Z^r|N~hFDf^!Xajce@yfHNWQRNn1d+eBKWiOTYl>NA61)>w7gwj+lVrhU?!dzPLt0(DNUSf!3(5I=EUz+IBsQB(0fw3S zc65hi>ntcW6zbS!09vvJoJ$LCha*4=LshH~O=g&dGAQqulrjmb8Fr_~*6Om4B+UzB zK<(1lI*rb*l!R7U!j#dmG)YrqGCJC7HUnf<{gM zUG^9G4<}SV&4=}!^}YfeTI#?!c_e*4uFy7SaL%TA@NP&YmU03yl4BFic|xYqS7&Sk83)s?<2m%iKD%?(7N^=)&+OicVX9gM|Z);KNb=}}j;=MVQdgyPXIk6RsHw3njWv?t`oaCirv zLm~JI;*wRImvd^vjLhK!(_`rfZK;lEU(SKVQdTG0HmAoh7F*V& zM_o{_iUL^AgNEr$k0~{2f~KlYvm99)2Z}U($T=9cGcFm*sG!#?!;ug=_RL6Fm*KQP|bD{2Ep{WfB`jhs1TOJv#|yM@9BY-vV>q8>cg*fiR+H8defeI^2PGFj2G0S?GF z6Q;B>BMmPaCp7m>%ol3~z$SUl1n0YGN$^`-fK#Z`6iS{ha;Tf3NH{lKpiH2h>FF;8 z;z{lo7!LjjP9b}<3YE7f=AE-rC6k;K>k8v{jf^~qTs_WwpjmCTXR|yz?RBUQ-N&+V z7ZuweBII5+&$*oVO*Jfg;Rtema6AqMl?<^(n$@e~N;FGb>!{mI0b!W*)Qx zPBVPw72!EHD4OYU0^&5_qq+pbCiSpl?z58I@S|kAAy&F7=`f~?Fcek=m(Latd#Rgn zR0)=x_EqTjI-}`I-WO(N2O;})$4IPn$@ERiKrmHsGty-gKnW_~)Q}|U0<}FOXe^gw z2kKD+0C?h3P2z>3u`oCimQ9cEPJb?SmI_884-`XPeFABXJIMpwk*=UZ;pm^+#z)aG zw+Ei$U+B#36`^Gbr$)v)qp}sP3g}6}PaQ~^{AM9Ap=ZKn>3wlJq0*sCxGA2vy0K4` zD4d!v4cag-uExU3PHzh2?LF0nVKsdt3>YXQ+-iFKf9%g=;75zBt|yjIHI(3aXf7O* z_LLta5;5V=Xq#*DNBY886}awIxeY\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: CANADA\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Une erreur 404 est survenue" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Le contrôleur demandé n'a pas pu acheminer la requête." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Le contrôleur demandé ne correspond pas à une classe contrôleur existante." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Le contrôleur demandé ne peut être acheminé." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "L'URL demandée n'a pas pu trouver de route correspondante." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nous ne pouvons pas déterminer pour le moment pourquoi une 404 a été générée." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Contrôleur" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "résout en %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exception" + +#: ../view/error/404.phtml:55 +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +msgid "Stack trace" +msgstr "Pile d'exécution" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Une erreur est survenue" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informations complémentaires" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Fichier" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Message" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Exceptions précédentes" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Aucune exception disponible" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenue dans %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Félicitations ! Vous avez installé %sZF2 Skeleton Application%s avec succès. Vous utilisez actuellement Zend Framework version %s. Cette structure peut vous servir comme point de départ simple pour démarrer la construction de votre application avec ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Faites un Fork de Zend Framework 2 sur GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Suivre le développement" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 est en cours de développement. Si vous êtes intéressé pour suivre l'évolution de ZF2, il existe un portail dédié à ZF2 sur le site officiel Zend Framework qui propose des liens vers le %swiki%s ZF2, le %sblogue de dev%s, le %ssuivi des problèmes%s, et bien plus encore. Il s'agit d'une excellente ressource pour rester à jour sur les dernières évolutions !" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portail sur le développement de ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Découvrez les modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La communauté travaille sur le développement d'un site communautaire avec l'objectif de servir de dépôt et de galerie pour les modules ZF2. Le projet est disponible %ssur GitHub%s. Le site est déjà en ligne, et contient une liste non exhaustive des modules déjà disponibles pour ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Explorer les modules ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aide & support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si vous avez besoin d'aide ou de soutient en développant avec ZF2, vous pouvez nous joindre sur IRC : %s#zftalk.2 sur Freenode%s. Nous aimerions connaître vos questions ou les commentaires que vous pourriez avoir au sujet des versions beta. Sinon, vous pouvez vous abonner, et poser des questions sur la %sliste de diffusion%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Rejoignez-nous sur IRC" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Accueil" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tous droits réservés." + diff --git a/module/Application/language/fr_FR.mo b/module/Application/language/fr_FR.mo new file mode 100644 index 0000000000000000000000000000000000000000..28f1932ad37233a88a93cdd0dc86a9c817716d66 GIT binary patch literal 5077 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 literal 0 HcmV?d00001 diff --git a/module/Application/language/fr_FR.po b/module/Application/language/fr_FR.po new file mode 100644 index 00000000..49f89d92 --- /dev/null +++ b/module/Application/language/fr_FR.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:32-0700\n" +"PO-Revision-Date: 2012-07-05 23:36-0700\n" +"Last-Translator: Evan Coury \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: FRANCE\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Accueil" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tous droits réservés." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenue dans le %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Félicitations ! Vous avez installé avec succès le %sZF2 Skeleton Application%s. Vous utilisez actuellement Zend Framework version %s. Cette structure peut vous servir comme un point de départ simple pour démarrer la construction de votre application avec ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Faites un Fork de Zend Framework 2 sur GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Suivre le développement" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 est en cours de développement. Si vous êtes intéressé pour suivre l'évolution de ZF2, il existe un portail dédié à ZF2 sur le site officiel Zend Framework qui propose des liens vers le %swiki%s ZF2, %sdev blog%s, %ssuivi des problèmes%s, et bien plus encore. Il s'agit d'une excellente ressource pour rester à jour sur les dernières évolutions !" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portail sur le développement de ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Découvrez les modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La communauté travaille sur le développement d'un site communautaire avec l'objectif de servir de dépôt et de galerie pour les modules ZF2. Le projet est disponible %ssur GitHub%s. Le site est déjà en ligne, et contient une liste non exhaustive des modules déjà disponibles pour ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Explorer les modules ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aide & support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si vous avez besoin d'aide ou de support en développant avec ZF2, vous pouvez nous joindre sur IRC : %s#zftalk.2 sur Freenode%s. Nous aimerions avoir vos questions ou vos commentaires que vous pourriez avoir au sujet des versions bêta. Sinon, vous pouvez vous abonner, et poser des questions sur la %sliste de diffusion%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Rejoignez-nous sur IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Une erreur est survenue" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informations complémentaires" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Fichier" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Message" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Pile d'exécution" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Exceptions précédentes" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Aucune exception disponible" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Une erreur 404 est survenue" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Le contrôleur demandé n'a pas pu dispatcher la requête." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Le contrôleur demandé ne correspond pas à une classe existante de contrôleur." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Le contrôleur demandé n'est pas dispatchable." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "L'URL demandée n'a pas pu trouver de route correspondante." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nous ne pouvons pas déterminer pour le moment pourquoi une 404 a été générée." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Contrôleur" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "résout en %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exception" + diff --git a/module/Application/language/it_IT.mo b/module/Application/language/it_IT.mo new file mode 100644 index 0000000000000000000000000000000000000000..3656ac349512a2f60b0ea2ad8658554c27c13cdf GIT binary patch literal 4922 zcmai%O>87b6~_w*5KJIT5tAyDF#p|`R7VF^H-fWUvO?S;q;hwIh zt9!imi4)?M6ITcl2Tlkf#4QqH&m6gO$RR>VkvIS+6!^XB9?#gDur1rKKkC(c@BcpP z@4r6r$j=nl*Z6&g-^V_p)Hjg-LCW>kN0oXC`Ag&%kbh{O|BU<`&+j1LL;e%FB+nmH z>H_jTx-y`2fj}8u8~zY-h+%^8DkEH+FxD{4CGE zK+1l? zeu5M%e*S5mk#8eK?=Q%&ApeE@FY>};O}rOAqtxR(KaG@lpF@h?RiwnTgA|r0D$$xrQIVM~eQtIP)y>A4t)Aibb;iBJzFYHRJ)Z56G_}-$Xu-{2THXQls=L z(jk|Te?)#2`3`agI|9DocacBx2wV~8r;&1r4|0i)ToQ}KAs7j6asgTN2`El4(i|_T zAxtTtjP>yO_*SVewerhI!B?;pKLi7*2T3Q8#@Ydj`L(XEtX|Q!EPbhclGJ5sQ?;I^ zu5vy%nRfZmmlGpTYCX$z=|-l-@4WExnQ`K423d{O+U+b}%S{>>n zu^|lWEIVfBP?;>VsjkLWuY@FvVC;epvmFzY>*%vKK^q<1q{#57GG!(E6yD{PCRTln zx0TleJ94=m)GkZqJ8w&E=3Z%x;Bi+GZB=^WDAi3D5|0OZ$ES5>gW9~8*dju=d9TPk z0Z5RuuUjs&Y713=q;J}(&3rMjdBrONITu$??7ifwTlGNQvRR=onn`g@@7G1)%Szqy z6RWm|(f8Z}smYJ^Sk@6xXcpM!*8s*c$M`>W^w0B;+8bhxjru$>FJiSO%pXnKGg( znIG87U^ufTSaw~{DqH4c9zc%go`rf4lF|(r;@)ehxm zMpnJ-^=UG+nX=3bKz~;j6E5Hqt=cW^)OnumEO9{{;9}w@lR9@5MH{r#nW&+&fTdYj z6kHWCStz&C;_?D ziVV=={_|G}3)yPAdYte>*DIn1ac^t%pF+xencmW7pV({ zcp)i$$nrXuMPhTN6k%w$@2a~b+vIUmOC3&J4xkllz`1hZb~Fa0I5Wli$mW(&Cv)(w z%_x(&HM8vORO+n+C23yha=lC6noONvDG9Cflp$gg>48~|$zGOjFB7~9;E zEg2(%pJcVIOVN=;#}?u#G+bq-3C2O{ugU+R}94KKH*Sv zb$D?kL#<0~eGi>{R5Q*x2i8moVM}jFZ@EFu4nbc(8FoOu;^T`aB=D>fLF{brY|ar_ z>#i<|K2_2=I4+2&viGWQ6&ds5nx>t~V5{%mIoRsFFkdGQ4{h1m%o8soysuvvxN7OO z&aStRhR*lxF#|FUw`pfKY~!=@1veP;bnCdUyYrW`!20?nn$G0&FB`rl!ec&c?(M9< z{QCUM4et*praTON-C4VQ?&s?1i@Cx+M^rN2#dc>E>)j=_@AUm&3ukbYJz1dh8Zu+0 z!_{`feNITF(`GbsxI%i=L0wf&J4Q(9%Z=i$%lejKYvy2X zW`s!mV93qLk`%DC)~r^~QX?HHjMEI>%$=OjRGyBQ(IBB!czKRYboDE8M#F)sl1S>( z=%T*=yU30lYzXVjv0x!cjs`42Q3{Na4>`37H;g)JGYDA%koHpyVXLPiVcNH&+Ce*Xn7T}ujgq#M z%yF0=J{Ya;iSd>?tvfp9EO+v1*TD1yehCLs@Jel>dC4p(WpWW>RK#e*rMwmx2)A`Y zFpGTfGI06$R2ka1Oq}$NZF^L9qIOzSxmwxq_T4CIV~2eQk| zBAXaW>O)x8$a#2HE-fX8D@`*H!fCREQ&-#5^vcW;aKMJl2=AJu9t298*c5D?x_yRH zQA3%TQWa9+_%YAFq@3&vyJBcHhhJOEk+}haNfO}12R$QR=rm;)D_KfYZ)b9_jhMdv zdTn&chJ z7UE77NH_3bL+hczfxP*DfX-}FAf|&eG|-}c+R{4N0j!fTNo1A$BM4wEpNj_pCqP%- zu=&*HGBnua19@G;C{kiAi=*7BfA-GlV)S5VQj>F179SRQ8I5#lC7k1Cw26uHM;eU`FAR}b zno|F>sPTh|?>Pl0l8yik;WVL!IVcR=n5{TB@rZ*l&d5\n" +"Language-Team: ZF Contributors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,-1,5,-1,-1,-1\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Pagina iniziale" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tutti i diritti sono riservati." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Benvenuto in %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Congratulazioni! Hai appena installato con successo %sZF2 Skeleton Application%s e stai utilizzando la versione %s di Zend Framework. Questa struttura può servirti come semplice punto di riferimento per iniziare a costruire un'applicazione basata su ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Crea un fork di Zend Framework 2 su GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Segui lo sviluppo" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 è in forte sviluppo. Se sei interessato a seguire lo sviluppo di ZF2, è presente un portale che fornisce link al %swiki%s, al %sdev blog%s, all'%sissue tracker%s e a molto altro riguardo a ZF2. Il Portale è un'ottima risorsa per rimanere aggiornati con gli ultimi sviluppi!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portale sullo sviluppo di ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Scopri i Moduli" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La community sta lavorando allo sviluppo di un sito che deve servire come raccolta e gallery di Moduli per ZF2. Il progetto è disponibile %son Github%s. Il sito è visitabile e al momento contiene una lista di alcuni dei Moduli già disponibili per ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Esplora i Moduli di ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aiuto & Supporto" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Qualora ti servisse aiuto o supporto mentre sviluppi con ZF2, puoi contattarci tramite IRC: %s#zftalk.2 on Freenode%s. Ci piacerebbe moltissimo ricevere le tue domande o qualunque feedback tu possa avere riguardo alle beta release. In alternativa, puoi iscriverti e inviare domande alla %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Contattaci su IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Si è verificato un errore" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informazioni aggiuntive" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "File" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Messaggio" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Eccezioni precedenti" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Non è disponibile alcuna eccezione" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Si è verificato un errore 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Il controller richiesto non è stato in grado di elaborare la richiesta." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Non è stato possibile mappare il controller richiesto ad una classe di tipo controller." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Il controller richiesto non è un oggetto dispatchable." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Non è stato possibile effettuare il match dell'indirizzo richiesto tramite routing." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "In questo momento non siamo in grado di determinare perchè sia stato generato un 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "viene risolto in %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Eccezione" + diff --git a/module/Application/language/ja_JP.mo b/module/Application/language/ja_JP.mo new file mode 100644 index 0000000000000000000000000000000000000000..66b6f3ccb4213eae7758f2b6cd6bfb94f6f23a06 GIT binary patch literal 5185 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 literal 0 HcmV?d00001 diff --git a/module/Application/language/ja_JP.po b/module/Application/language/ja_JP.po new file mode 100644 index 00000000..d6a953ee --- /dev/null +++ b/module/Application/language/ja_JP.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 19:30-0700\n" +"PO-Revision-Date: 2012-07-15 08:20+0900\n" +"Last-Translator: sasezaki \n" +"Language-Team: Japanese\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Japanese\n" +"X-Poedit-Country: Japan\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "%sZend Framework 2%s へようこそ" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "おめでとうございます! %sZF2 Skeleton Application%s のインストールに成功しました。 あなたは Zend Framework version %s を動作させています。このスケルトンはZF2上でのアプリケーション構築を始めるためにシンプルなスタートポイントを提供します。" + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "GitHub で Zend Framework 2 をフォーク" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "開発を追う" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 は鋭意開発中です。ZF2の開発進行にご関心がおありでしょうか、Zend Framework公式ウェブサイト上ではZF2特別ポータルがあり、 %swiki%s、 %sdev blog%s、 %sissue tracker%s、 などのZF2関連のものを提供しています。最新の開発状況に追随するためのすばらしいリソースです。" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 開発ポータル" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "モジュールを見つける" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "コミュニティーはZF2モジュールのためのリポジトリとギャラリーを提供するコミュニティーサイトを開発中です。プロジェクトは %s GitHub%s で利用可能です。サイトは現在運営されており、ZF2ですでに利用可能なモジュールのリストを持っています。" + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "ZF2モジュールを探す" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "ヘルプとサポート" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "ZF2 で開発中に何らかのお手伝いやサポートが必要な場合、IRC を通じて私たちと連絡することができます。: %s#zftalk.2 on Freenode%s ベータ版についてあなたが抱えるかもしれない質問やフィードバックを何でも聞きたいと望みます。あるいは、%smailing lists%s を購読したり質問をポストしたりできます。" + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "IRC で呼び出す" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "エラーが発生しました" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "追加の情報" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "ファイル" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "メッセージ" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "スタックトレース" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "前の例外" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "例外が利用できません" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "404エラーが発生しました" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "要求されたコントローラはリクエストをディスパッチできませんでした。" + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "要求されたコントローラは存在するコントローラクラスにマッピングできませんでした。" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "要求されたコントローラはディスパッチ不可能でした。" + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "要求されたURLはルーティングにマッチしませんでした。" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "404が生成された理由について現時点で判断できません。" + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "コントローラ" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "%s に解決" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "例外" + diff --git a/module/Application/language/nl_NL.mo b/module/Application/language/nl_NL.mo new file mode 100644 index 0000000000000000000000000000000000000000..a03a3328cfb393bb53fab0b04298f56255c8086f GIT binary patch literal 4815 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 literal 0 HcmV?d00001 diff --git a/module/Application/language/nl_NL.po b/module/Application/language/nl_NL.po new file mode 100644 index 00000000..fa97eae1 --- /dev/null +++ b/module/Application/language/nl_NL.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-24 12:48+0100\n" +"Last-Translator: Walter Tamboer\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Dutch\n" +"X-Poedit-Country: NETHERLANDS\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Applicatie Fundering" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Home" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Alle rechten voorbehouden." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Welkom bij %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Gefeliciteerd! Je hebt de %sZF2 Applicatie Fundering%s succesvol geinstalleerd. Je gebruikt Zend Framework versie %s. Deze fundering biedt je een startpunt om je ZF2 applicatie op voort te bouwen." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 op GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Volg de Ontwikkeling" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 wordt actief ontwikkeld. Als je interesse hebt in het volgen van deze ontwikkelingen dan kun je de ZF2 portaal bezoeken op de officiële website van Zend Framework. Daar staan links naar de ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s en nog veel meer. Het is het perfecte middel om up-to-date te blijven met de ontwikkelingen." + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Ontwikkelaars Portaal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Ontdek Modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "De community werkt aan een eigen community website die dient als een bewaarplaats en galerij voor ZF2 modules. Het project is beschikbaar %sop GitHub%s. De site staat op dit moment live en bevat een lijst met modules die op dit moment beschikbaar zijn voor ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Verken ZF2 Modules" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Hulp & Support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Als je hulp nodig hebt tijdens het ontwikkelen met ZF2, dan kun je ons bereiken via IRC: %s#zftalk.2 op Freenode%s. We beantwoorde met alle liefde je vragen en zouden graag feedback krijgen betreffende de beta releases. Je kunt je ook abonneren op de %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Ping ons via IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Er is een fout opgetreden" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Additionele informatie" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Bestand" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Bericht" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stack trace" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Vorige excepties" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Geen exceptie beschikbaar" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "De pagina kon niet worden gevonden." + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "De opgevraagde controller kon deze aanvraag niet verwerken." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Er is geen mapping beschikbaar voor de opgevraagde controller." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "De opgevraagde controller is niet bruikbaar (dispatchable)." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Er is geen route gevonden die overeenkomt met de opgevraagde URL." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "We kunnen op dit moment niet achterhalen waarom de pagina niet kon worden gevonden." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "verwijst naar %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exceptie" + diff --git a/module/Application/language/pl_PL.mo b/module/Application/language/pl_PL.mo new file mode 100644 index 0000000000000000000000000000000000000000..0df3fc6d1c60bd28da8262ba9698a293a35d4155 GIT binary patch literal 4934 zcmb7`PmCm09mh)r(EsytZD| z6xHG4#*G(^7d@BiGwHn{9biW&yFO7N_T&|s^0JS zet*C3_x3%v{UYL0d>@qW$D-&l!H@I9^=I%4;9tNmf^X07-vd9-{mLhz=-=Rj;ELSe z7Db-}?*l&#J_6ngu7P}_GyL2Go&&!Qet&-d7RV?189(=8!_UDxxc~L--M+sCKg0c> zK+*RPQ0#gKyc2vMjF7wYlTozJ-@6dL06q)$!JmT9fH%NzgZ~9(|HnVo>E8igMScv* zK7Yjc|8W0T@ILPUz$UWa-$9AfJD~V~$6ZnMH}C;a{CyV``S(CnMYrAE`Fl4g{weUQ z;41hqcp4PFL-4cUTi`DH{sa_#|3cXV;Je`0z}s0Q@%zRcp9IDK7s30HdkuV+`+_8F zgTDdS!1qCk%NjiZ!I4*tK z6~j_jbrz)jL+W)`tC8L}%GYshyx*&{tVOf0be5S!RU@NT{To~BY9}?Bsa&BpCzH&^ zLBXo;2MxM3D%e+4NSAd{*kY*OFh!!aN}Zd=m8se{rN>m%_0{gkdgT`yV_m3Vv(jE^ z*VY9#A$$ajlWGh#!PbUTSpjjcvv z(TO0JYocm&JW{n+`&O%S7f){x$cLwUP;Po?qL-aIOor0?EYky`zb%V#m*C=Uv|XBg>$o?I z#QErhN;2B1#Hp&(v59u^A$ECQ7q+6Ry^=x{y(m2rY<*;rw^az*k$Nl*KH18ZZE$cX zoxy)8NU52;t0*aIqb8*ro4As_4qYKphZWKlKgBKEuxQye8Bq=TmycrVSJR91ghWlb zJ>{t;L5b;nW2G}{Bf+>u>=vf=LjXz>@=oQwdhtA-)>)zoSCL!=dBh`L3@9&GOS2sp z5fi!=Ixabx2t7DVCM8%WVLiG!)1D+tOqK>5dEe0LVnt&8M68gUf5`H>kVUfRLMVh` zuD%~#BH6kKN)3gY+k${rtRc>oC2q}#AO%vD-G``bg4z zga*_$jjglj_)1A=T_muKj-^Q!H73;2S91;!u7uAFG|k@pC0oKX5sX5*;{z z=OPuzabjW%`HM-yFZ`vrM9}T++3wY?4m4&!dc=DRfl#3PHZh)xDpKOowWnxX^^HyK zsz1R$j8KEj4ZAz*eNAv^snnG6Ncudl(UwD;b2bmw4XMORP9P{bHlYro@m74RCn0kL zydyU;nPZ439Cg`06p3`UkA>Jq?6YYn^uXQKLMquDY^B*~mRxZ-1W!1ajhc@Y* zs)xR}>o(NN_A9%+(_$Ii*E_?W8)|*+rb-p zB3=w@sIRwcbdEP$>NIU;2Q|99dS<%UBmNcdo|}?N5nIaO&V_Rq&MsqdvcI+>;?zrT zx1HcyW!|j5Imuv-rxlG=dQ*Mp)!nV$Q_FQ?`kpC!XN%Yg+i$3+2DV!HUT@nO=8N7- zriCgKf1b)g;oMWRT(EFqgI<7}M$0#+T@7Wlym;mO=F4Z6FHUiY(CVWN)n7i`;cSXW z+dS^A@uI&HU21)GaAjg=m(^f)`QS<-4I7 zs%JM^xMX^KCTLVct&S~F1I*8KDbhu^w@Keinh@b z&3?&rH~XDLjy}Zz#=@LrxAC-)$)`-~@o}ftW#4Yld6e_nDZc&~^d4b=Z<>3`I%tRf>9scJQedo z3(kHIMagij6ArF0VoB!mo7aah*c8ikfFZgb3--3Xpq_IO!56e6QbTv~=E zXGPWKs?<{mmGH#Vt{}shCFVnChkOn_+e(jBBTReixbjivt&q}2&ZiXik>t{0k{&6~ z1%1p}jmLd8=Od95nit*=lUNsCTE;Angt1s(x@qIa^$Cf(1Rdh;#xHU)AHL+AAT5sB zYs{Ho#$CB#%`v}N)YTNxS#+%OSKEe>@2sORUslxBU)!2;1KWd!0X?Bel m73B>rjlHx=%QNxL1`-$-PS}moveXqb7miASb}fw+(f\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Polish\n" +"X-Poedit-Country: POLAND\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Szkielet Aplikacji" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Strona startowa" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Wszelkie prawa zastrzeżone." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Witaj w %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Gratulacje! Z powodzeniem zainstalowałeś %sZF2 Skeleton Application%s. Aktualnie używasz Zend Framework w wersji %s. Ten szkielet może służyć jak prosty punkt startowy do budowy Twoich aplikacji na ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Forkuj Zend Framework 2 na GitHub'e" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Śledź prace programistyczne" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 jest w trakcie aktywnych prac programistycznych. Jeśli jesteś zainteresowany śledzeniem jego rozwoju, istnieje specialny portal ZF2 na oficjalnej stronie Zend Framework na którym dostępne są linki do ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, oraz wiele więcej. Jest to świetne miejsce by śledzić najnowsze zmiany!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Development Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Odkryj Moduły" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Społeczność pracuje nad stworzeniem społecznościowego serwisu który posłuży jako repozytorium i galeria dla modułów ZF2. Projekt wkrótce będzie dostępny na %son GitHub%s. Ta strona jest aktualnie online i udostępnia listę niektórych modułów dostępnych dla ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Odkryj Moduły ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Pomoc & Wsparcie" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Jeśli potrzebujesz jakiejkolwiek pomocy lub wsparcia podczas programowania na ZF2, możesz skontaktować się z nami via IRC: %s#zftalk.2 w sieci Freenode%s. Z przyjemnością wysłuchamy wszelkich pytań lub sugestii które możesz mieć odnoście wydań beta. Alternatywnie, możesz zapisać się i wysłać pytanie na %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Wyślij nam wiadomość na IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Wystąpił błąd" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Dodatkowe informacje" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Plik" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Komunikat" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stack trace" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Poprzedni wyjątek" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Brak dostępnego wyjątku" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Wystąpił błąd 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Żądany kontroler nie mógł zmapować żądania." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Żądany kontroler nie mógł być zmapowany na isteniejącą klasę kontrolera." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Żądany kontroler nie mógł zostać zmapowany." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Żądany adres URL nie mógł zostać powiązany z routing'iem." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nie możemy określić tym razem dlaczego wygenerowano błąd 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Kontroler" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "rozwiązuje na %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Wyjątek" + diff --git a/module/Application/language/tr_TR.mo b/module/Application/language/tr_TR.mo new file mode 100644 index 0000000000000000000000000000000000000000..952882142e8f6f0863f0fb0c08efdf31590512d3 GIT binary patch literal 4785 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\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Turkish\n" +"X-Poedit-Country: TURKEY\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Anasayfa" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tüm haklar saklıdır." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "%sZend Framework 2%s'a hoş geldiniz" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Tebrikler! %sZF2 Skeleton Application%s'u başarıyla yüklediniz. Şu anda Zend Framework %s sürüm ile çalışıyorsunuz. Bu iskelet ZF2 üzerinde uygulama oluşturmak için basit bir başlangıç ​​noktası olarak hizmet verebilir." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Zend Framework 2'yi GitHub'da fork edin" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Gelişimi izleyin" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 aktif geliştirilmektedir. Eğer ZF2'nin gelişimi ile ilgileniyorsanız, ZF2 için resmi Zend Framework websitesinde özel portal mevcut, orada ZF2 %swiki%s'ye, %sDEV blog%s'a, %ssorun takibi%s'ne bağlantılarını ve çok daha fazlasını sunar. Bu son gelişmeler ile güncel kalmak için büyük bir kaynaktır!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Development Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Modülleri keşfedin" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Topluluk ZF2 modülleri için bir depo ve galeri olarak hizmet edecek bir topluluk sitesi geliştirme üzerinde çalışıyor. Proje %sGitHub%s'da mevcut. Site şu anda canlı ve ZF2 için bazı mevcut modüllerin listesini içerir." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "ZF2 Modüllerini keşfedin" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Yardım & Destek" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "ZF2 ile geliştirirken herhangi yardım veya desteğe ihtiyacınız varsa, bize IRC: %sFreenode #zftalk.2%s üzerinden ulaşabilirsiniz. Beta sürümleri ile ilgili olabilecek herhangi bir sorunuzu ya da yorumlarınızı duymak isteriz. Alternatif olarak %smailing listelerine%s abone olup sorularınızı sorabilirsiniz." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "IRC bizi pingleyin" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "An error occurred" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Ek bilgiler" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Klasör" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Mesaj" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Denetleyici" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Önceki istisnalar" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "İstisna yok" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Bir 404 hatası oluştu" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Talep edilen denetleyici işlemi işlemesi mümkün değildir." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Talep edilen denetleyiciye uygun denetleyici sınıfı tahsis edilemedi." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Talep edilen denetleyici çağrılabilir değildir." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "İstenen URL yönlendirmede tahsis edilemedi" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Neden 404 hatasının oluştuğunu şu an belirleyemiyoruz." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Denetleyici" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "Buraya çözümlenir: %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "İstisna" + diff --git a/module/Application/src/Application/Controller/IndexController.php b/module/Application/src/Application/Controller/IndexController.php new file mode 100644 index 00000000..a1aafaee --- /dev/null +++ b/module/Application/src/Application/Controller/IndexController.php @@ -0,0 +1,21 @@ + +

translate('Welcome to %sZend Framework 2%s'), '', '') ?>

+
+

translate('Fork Zend Framework 2 on GitHub') ?> »

+

translate('Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2.'), '', '', \Zend\Version\Version::VERSION) ?>

+ +
+ +
+

translate('Follow Development') ?>

+

translate('Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!'), '', '', '', '', '', '') ?>

+

translate('ZF2 Development Portal') ?> »

+
+ +
+

translate('Discover Modules') ?>

+

translate('The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2.'), '', '') ?>

+

translate('Explore ZF2 Modules') ?> »

+
+ +
+

translate('Help & Support') ?>

+

translate('If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We\'d love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s.'), '', '', '', '') ?>

+

translate('Ping us on IRC') ?> »

+
+
diff --git a/module/Application/view/error/404.phtml b/module/Application/view/error/404.phtml new file mode 100644 index 00000000..3edd37a8 --- /dev/null +++ b/module/Application/view/error/404.phtml @@ -0,0 +1,61 @@ +

translate('A 404 error occurred') ?>

+

message ?>

+ +reason) && $this->reason): ?> + +reason) { + case 'error-controller-cannot-dispatch': + $reasonMessage = $this->translate('The requested controller was unable to dispatch the request.'); + break; + case 'error-controller-not-found': + $reasonMessage = $this->translate('The requested controller could not be mapped to an existing controller class.'); + break; + case 'error-controller-invalid': + $reasonMessage = $this->translate('The requested controller was not dispatchable.'); + break; + case 'error-router-no-match': + $reasonMessage = $this->translate('The requested URL could not be matched by routing.'); + break; + default: + $reasonMessage = $this->translate('We cannot determine at this time why a 404 was generated.'); + break; +} +?> + +

+ + + +controller) && $this->controller): ?> + +
+
translate('Controller') ?>:
+
escapeHtml($this->controller) ?> +controller_class) + && $this->controller_class + && $this->controller_class != $this->controller +) { + echo '(' . sprintf($this->translate('resolves to %s'), $this->escapeHtml($this->controller_class)) . ')'; +} +?> +
+
+ + + +exception) && $this->exception): ?> + +

translate('Exception') ?>:

+ +

escapeHtml($this->exception->getMessage()) ?>

+ +

translate('Stack trace') ?>:

+ +
+exception->getTraceAsString() ?>
+
+ + diff --git a/module/Application/view/error/index.phtml b/module/Application/view/error/index.phtml new file mode 100644 index 00000000..5165cd8e --- /dev/null +++ b/module/Application/view/error/index.phtml @@ -0,0 +1,62 @@ +

translate('An error occurred') ?>

+

message ?>

+ +display_exceptions) && $this->display_exceptions): ?> + +exception) && $this->exception instanceof Exception): ?> +
+

translate('Additional information') ?>:

+

exception); ?>

+
+
translate('File') ?>:
+
+
exception->getFile() ?>:exception->getLine() ?>
+
+
translate('Message') ?>:
+
+
exception->getMessage() ?>
+
+
translate('Stack trace') ?>:
+
+
exception->getTraceAsString() ?>
+
+
+exception->getPrevious(); + if ($e) : +?> +
+

translate('Previous exceptions') ?>:

+
    + +
  • +

    +
    +
    translate('File') ?>:
    +
    +
    getFile() ?>:getLine() ?>
    +
    +
    translate('Message') ?>:
    +
    +
    getMessage() ?>
    +
    +
    translate('Stack trace') ?>:
    +
    +
    getTraceAsString() ?>
    +
    +
    +
  • + getPrevious(); + endwhile; + ?> +
+ + + + +

translate('No Exception available') ?>

+ + + + diff --git a/module/Application/view/layout/layout.phtml b/module/Application/view/layout/layout.phtml new file mode 100644 index 00000000..d5af45f6 --- /dev/null +++ b/module/Application/view/layout/layout.phtml @@ -0,0 +1,57 @@ +doctype(); ?> + + + + + headTitle('ZF2 '. $this->translate('Skeleton Application'))->setSeparator(' - ')->setAutoEscape(false) ?> + + headMeta()->appendName('viewport', 'width=device-width, initial-scale=1.0') ?> + + + headLink(array('rel' => 'shortcut icon', 'type' => 'image/vnd.microsoft.icon', 'href' => $this->basePath() . '/images/favicon.ico')) + ->prependStylesheet($this->basePath() . '/css/bootstrap-responsive.min.css') + ->prependStylesheet($this->basePath() . '/css/style.css') + ->prependStylesheet($this->basePath() . '/css/bootstrap.min.css') ?> + + + headScript()->prependFile($this->basePath() . '/js/html5.js', 'text/javascript', array('conditional' => 'lt IE 9',)) + ->prependFile($this->basePath() . '/js/jquery-1.7.2.min.js') ?> + + + + + + + +
+ + content; ?> + +
+ +
+

© 2005 - 2012 by Zend Technologies Ltd. translate('All rights reserved.') ?>

+
+ +
+ + inlineScript() ?> + + diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 00000000..10d71d77 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,7 @@ +RewriteEngine On +RewriteCond %{REQUEST_FILENAME} -s [OR] +RewriteCond %{REQUEST_FILENAME} -l [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteBase /fmi +RewriteRule ^.*$ - [NC,L] +RewriteRule ^.*$ index.php [NC,L] diff --git a/public/css/bootstrap-responsive.min.css b/public/css/bootstrap-responsive.min.css new file mode 100644 index 00000000..bc3f2ab7 --- /dev/null +++ b/public/css/bootstrap-responsive.min.css @@ -0,0 +1,3 @@ + +.hidden{display:none;visibility:hidden;} +@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:768px){.container{width:auto;padding:0 20px;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;}}@media (min-width:768px) and (max-width:980px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .span1{width:42px;} .span2{width:104px;} .span3{width:166px;} .span4{width:228px;} .span5{width:290px;} .span6{width:352px;} .span7{width:414px;} .span8{width:476px;} .span9{width:538px;} .span10{width:600px;} .span11{width:662px;} .span12,.container{width:724px;} .offset1{margin-left:82px;} .offset2{margin-left:144px;} .offset3{margin-left:206px;} .offset4{margin-left:268px;} .offset5{margin-left:330px;} .offset6{margin-left:392px;} .offset7{margin-left:454px;} .offset8{margin-left:516px;} .offset9{margin-left:578px;} .offset10{margin-left:640px;} .offset11{margin-left:702px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.801104972%;} .row-fluid .span2{width:14.364640883%;} .row-fluid .span3{width:22.928176794%;} .row-fluid .span4{width:31.491712705%;} .row-fluid .span5{width:40.055248616%;} .row-fluid .span6{width:48.618784527%;} .row-fluid .span7{width:57.182320438000005%;} .row-fluid .span8{width:65.74585634900001%;} .row-fluid .span9{width:74.30939226%;} .row-fluid .span10{width:82.87292817100001%;} .row-fluid .span11{width:91.436464082%;} .row-fluid .span12{width:99.999999993%;} input.span1,textarea.span1,.uneditable-input.span1{width:32px;} input.span2,textarea.span2,.uneditable-input.span2{width:94px;} input.span3,textarea.span3,.uneditable-input.span3{width:156px;} input.span4,textarea.span4,.uneditable-input.span4{width:218px;} input.span5,textarea.span5,.uneditable-input.span5{width:280px;} input.span6,textarea.span6,.uneditable-input.span6{width:342px;} input.span7,textarea.span7,.uneditable-input.span7{width:404px;} input.span8,textarea.span8,.uneditable-input.span8{width:466px;} input.span9,textarea.span9,.uneditable-input.span9{width:528px;} input.span10,textarea.span10,.uneditable-input.span10{width:590px;} input.span11,textarea.span11,.uneditable-input.span11{width:652px;} input.span12,textarea.span12,.uneditable-input.span12{width:714px;}}@media (max-width:980px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .span1{width:70px;} .span2{width:170px;} .span3{width:270px;} .span4{width:370px;} .span5{width:470px;} .span6{width:570px;} .span7{width:670px;} .span8{width:770px;} .span9{width:870px;} .span10{width:970px;} .span11{width:1070px;} .span12,.container{width:1170px;} .offset1{margin-left:130px;} .offset2{margin-left:230px;} .offset3{margin-left:330px;} .offset4{margin-left:430px;} .offset5{margin-left:530px;} .offset6{margin-left:630px;} .offset7{margin-left:730px;} .offset8{margin-left:830px;} .offset9{margin-left:930px;} .offset10{margin-left:1030px;} .offset11{margin-left:1130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.982905983%;} .row-fluid .span2{width:14.529914530000001%;} .row-fluid .span3{width:23.076923077%;} .row-fluid .span4{width:31.623931624%;} .row-fluid .span5{width:40.170940171000005%;} .row-fluid .span6{width:48.717948718%;} .row-fluid .span7{width:57.264957265%;} .row-fluid .span8{width:65.81196581200001%;} .row-fluid .span9{width:74.358974359%;} .row-fluid .span10{width:82.905982906%;} .row-fluid .span11{width:91.45299145300001%;} .row-fluid .span12{width:100%;} input.span1,textarea.span1,.uneditable-input.span1{width:60px;} input.span2,textarea.span2,.uneditable-input.span2{width:160px;} input.span3,textarea.span3,.uneditable-input.span3{width:260px;} input.span4,textarea.span4,.uneditable-input.span4{width:360px;} input.span5,textarea.span5,.uneditable-input.span5{width:460px;} input.span6,textarea.span6,.uneditable-input.span6{width:560px;} input.span7,textarea.span7,.uneditable-input.span7{width:660px;} input.span8,textarea.span8,.uneditable-input.span8{width:760px;} input.span9,textarea.span9,.uneditable-input.span9{width:860px;} input.span10,textarea.span10,.uneditable-input.span10{width:960px;} input.span11,textarea.span11,.uneditable-input.span11{width:1060px;} input.span12,textarea.span12,.uneditable-input.span12{width:1160px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}} diff --git a/public/css/bootstrap.min.css b/public/css/bootstrap.min.css new file mode 100644 index 00000000..b01f92e6 --- /dev/null +++ b/public/css/bootstrap.min.css @@ -0,0 +1,610 @@ +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} +audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} +audio:not([controls]){display:none;} +html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} +a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +a:hover,a:active{outline:0;} +sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} +sup{top:-0.5em;} +sub{bottom:-0.25em;} +img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;} +button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} +button,input{*overflow:visible;line-height:normal;} +button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} +button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} +input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} +input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} +textarea{overflow:auto;vertical-align:top;} +body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;} +a{color:#0088cc;text-decoration:none;} +a:hover{color:#005580;text-decoration:underline;} +.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} +.row:after{clear:both;} +[class*="span"]{float:left;margin-left:20px;} +.span1{width:60px;} +.span2{width:140px;} +.span3{width:220px;} +.span4{width:300px;} +.span5{width:380px;} +.span6{width:460px;} +.span7{width:540px;} +.span8{width:620px;} +.span9{width:700px;} +.span10{width:780px;} +.span11{width:860px;} +.span12,.container{width:940px;} +.offset1{margin-left:100px;} +.offset2{margin-left:180px;} +.offset3{margin-left:260px;} +.offset4{margin-left:340px;} +.offset5{margin-left:420px;} +.offset6{margin-left:500px;} +.offset7{margin-left:580px;} +.offset8{margin-left:660px;} +.offset9{margin-left:740px;} +.offset10{margin-left:820px;} +.offset11{margin-left:900px;} +.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} +.row-fluid:after{clear:both;} +.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;} +.row-fluid>[class*="span"]:first-child{margin-left:0;} +.row-fluid .span1{width:6.382978723%;} +.row-fluid .span2{width:14.89361702%;} +.row-fluid .span3{width:23.404255317%;} +.row-fluid .span4{width:31.914893614%;} +.row-fluid .span5{width:40.425531911%;} +.row-fluid .span6{width:48.93617020799999%;} +.row-fluid .span7{width:57.446808505%;} +.row-fluid .span8{width:65.95744680199999%;} +.row-fluid .span9{width:74.468085099%;} +.row-fluid .span10{width:82.97872339599999%;} +.row-fluid .span11{width:91.489361693%;} +.row-fluid .span12{width:99.99999998999999%;} +.container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";} +.container:after{clear:both;} +.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";} +.container-fluid:after{clear:both;} +p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;} +.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;} +h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;} +h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;} +h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;} +h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;} +h4,h5,h6{line-height:18px;} +h4{font-size:14px;}h4 small{font-size:12px;} +h5{font-size:12px;} +h6{font-size:11px;color:#999999;text-transform:uppercase;} +.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;} +.page-header h1{line-height:1;} +ul,ol{padding:0;margin:0 0 9px 25px;} +ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} +ul{list-style:disc;} +ol{list-style:decimal;} +li{line-height:18px;} +ul.unstyled{margin-left:0;list-style:none;} +dl{margin-bottom:18px;} +dt,dd{line-height:18px;} +dt{font-weight:bold;} +dd{margin-left:9px;} +hr{margin:18px 0;border:0;border-top:1px solid #e5e5e5;border-bottom:1px solid #ffffff;} +strong{font-weight:bold;} +em{font-style:italic;} +.muted{color:#999999;} +abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;} +blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;} +blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} +blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} +q:before,q:after,blockquote:before,blockquote:after{content:"";} +address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;} +small{font-size:100%;} +cite{font-style:normal;} +code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} +pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;}pre.prettyprint{margin-bottom:18px;} +pre code{padding:0;background-color:transparent;} +form{margin:0 0 18px;} +fieldset{padding:0;margin:0;border:0;} +legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;} +label,input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;} +label{display:block;margin-bottom:5px;color:#333333;} +input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.uneditable-textarea{width:auto;height:auto;} +label input,label textarea,label select{display:block;} +input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:0;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +input[type="file"]{padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;} +select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;} +select{width:220px;background-color:#ffffff;} +select[multiple],select[size]{height:auto;} +input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +textarea{height:auto;} +input[type="hidden"]{display:none;} +.radio,.checkbox{padding-left:18px;} +.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;} +.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} +.radio.inline,.checkbox.inline{display:inline-block;margin-bottom:0;vertical-align:middle;} +.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} +.controls>.radio.inline:first-child,.controls>.checkbox.inline:first-child{padding-top:0;} +input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;} +input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;} +input[type="file"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.input-mini{width:60px;} +.input-small{width:90px;} +.input-medium{width:150px;} +.input-large{width:210px;} +.input-xlarge{width:270px;} +.input-xxlarge{width:530px;} +input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;} +input.span1,textarea.span1,.uneditable-input.span1{width:50px;} +input.span2,textarea.span2,.uneditable-input.span2{width:130px;} +input.span3,textarea.span3,.uneditable-input.span3{width:210px;} +input.span4,textarea.span4,.uneditable-input.span4{width:290px;} +input.span5,textarea.span5,.uneditable-input.span5{width:370px;} +input.span6,textarea.span6,.uneditable-input.span6{width:450px;} +input.span7,textarea.span7,.uneditable-input.span7{width:530px;} +input.span8,textarea.span8,.uneditable-input.span8{width:610px;} +input.span9,textarea.span9,.uneditable-input.span9{width:690px;} +input.span10,textarea.span10,.uneditable-input.span10{width:770px;} +input.span11,textarea.span11,.uneditable-input.span11{width:850px;} +input.span12,textarea.span12,.uneditable-input.span12{width:930px;} +input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;} +.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} +.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;} +.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} +.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} +.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;} +.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} +.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} +.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;} +.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} +input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} +.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;} +.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} +:-moz-placeholder{color:#999999;} +::-webkit-input-placeholder{color:#999999;} +.help-block{margin-top:5px;margin-bottom:0;color:#999999;} +.help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;} +.input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";} +.input-prepend:after,.input-append:after{clear:both;} +.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;} +.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;} +.input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;} +.input-prepend .add-on{*margin-top:1px;} +.input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-append .uneditable-input{border-right-color:#ccc;} +.input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;} +.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;} +.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input{display:inline-block;margin-bottom:0;} +.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;} +.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;} +.control-group{margin-bottom:9px;} +.form-horizontal legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;} +.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";} +.form-horizontal .control-group:after{clear:both;} +.form-horizontal .control-group>label{float:left;width:140px;padding-top:5px;text-align:right;} +.form-horizontal .controls{margin-left:160px;} +.form-horizontal .form-actions{padding-left:160px;} +table{max-width:100%;border-collapse:collapse;border-spacing:0;} +.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;border-top:1px solid #ddd;} +.table th{font-weight:bold;vertical-align:bottom;} +.table td{vertical-align:top;} +.table thead:first-child tr th,.table thead:first-child tr td{border-top:0;} +.table tbody+tbody{border-top:2px solid #ddd;} +.table-condensed th,.table-condensed td{padding:4px 5px;} +.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;} +.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} +.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;} +.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;} +.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;} +.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;} +.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} +table .span1{float:none;width:44px;margin-left:0;} +table .span2{float:none;width:124px;margin-left:0;} +table .span3{float:none;width:204px;margin-left:0;} +table .span4{float:none;width:284px;margin-left:0;} +table .span5{float:none;width:364px;margin-left:0;} +table .span6{float:none;width:444px;margin-left:0;} +table .span7{float:none;width:524px;margin-left:0;} +table .span8{float:none;width:604px;margin-left:0;} +table .span9{float:none;width:684px;margin-left:0;} +table .span10{float:none;width:764px;margin-left:0;} +table .span11{float:none;width:844px;margin-left:0;} +table .span12{float:none;width:924px;margin-left:0;} +[class^="icon-"]{display:inline-block;width:14px;height:14px;vertical-align:text-top;background-image:url(../img/glyphicons-halflings.png);background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child{*margin-left:0;} +.icon-white{background-image:url(../img/glyphicons-halflings-white.png);} +.icon-glass{background-position:0 0;} +.icon-music{background-position:-24px 0;} +.icon-search{background-position:-48px 0;} +.icon-envelope{background-position:-72px 0;} +.icon-heart{background-position:-96px 0;} +.icon-star{background-position:-120px 0;} +.icon-star-empty{background-position:-144px 0;} +.icon-user{background-position:-168px 0;} +.icon-film{background-position:-192px 0;} +.icon-th-large{background-position:-216px 0;} +.icon-th{background-position:-240px 0;} +.icon-th-list{background-position:-264px 0;} +.icon-ok{background-position:-288px 0;} +.icon-remove{background-position:-312px 0;} +.icon-zoom-in{background-position:-336px 0;} +.icon-zoom-out{background-position:-360px 0;} +.icon-off{background-position:-384px 0;} +.icon-signal{background-position:-408px 0;} +.icon-cog{background-position:-432px 0;} +.icon-trash{background-position:-456px 0;} +.icon-home{background-position:0 -24px;} +.icon-file{background-position:-24px -24px;} +.icon-time{background-position:-48px -24px;} +.icon-road{background-position:-72px -24px;} +.icon-download-alt{background-position:-96px -24px;} +.icon-download{background-position:-120px -24px;} +.icon-upload{background-position:-144px -24px;} +.icon-inbox{background-position:-168px -24px;} +.icon-play-circle{background-position:-192px -24px;} +.icon-repeat{background-position:-216px -24px;} +.icon-refresh{background-position:-240px -24px;} +.icon-list-alt{background-position:-264px -24px;} +.icon-lock{background-position:-287px -24px;} +.icon-flag{background-position:-312px -24px;} +.icon-headphones{background-position:-336px -24px;} +.icon-volume-off{background-position:-360px -24px;} +.icon-volume-down{background-position:-384px -24px;} +.icon-volume-up{background-position:-408px -24px;} +.icon-qrcode{background-position:-432px -24px;} +.icon-barcode{background-position:-456px -24px;} +.icon-tag{background-position:0 -48px;} +.icon-tags{background-position:-25px -48px;} +.icon-book{background-position:-48px -48px;} +.icon-bookmark{background-position:-72px -48px;} +.icon-print{background-position:-96px -48px;} +.icon-camera{background-position:-120px -48px;} +.icon-font{background-position:-144px -48px;} +.icon-bold{background-position:-167px -48px;} +.icon-italic{background-position:-192px -48px;} +.icon-text-height{background-position:-216px -48px;} +.icon-text-width{background-position:-240px -48px;} +.icon-align-left{background-position:-264px -48px;} +.icon-align-center{background-position:-288px -48px;} +.icon-align-right{background-position:-312px -48px;} +.icon-align-justify{background-position:-336px -48px;} +.icon-list{background-position:-360px -48px;} +.icon-indent-left{background-position:-384px -48px;} +.icon-indent-right{background-position:-408px -48px;} +.icon-facetime-video{background-position:-432px -48px;} +.icon-picture{background-position:-456px -48px;} +.icon-pencil{background-position:0 -72px;} +.icon-map-marker{background-position:-24px -72px;} +.icon-adjust{background-position:-48px -72px;} +.icon-tint{background-position:-72px -72px;} +.icon-edit{background-position:-96px -72px;} +.icon-share{background-position:-120px -72px;} +.icon-check{background-position:-144px -72px;} +.icon-move{background-position:-168px -72px;} +.icon-step-backward{background-position:-192px -72px;} +.icon-fast-backward{background-position:-216px -72px;} +.icon-backward{background-position:-240px -72px;} +.icon-play{background-position:-264px -72px;} +.icon-pause{background-position:-288px -72px;} +.icon-stop{background-position:-312px -72px;} +.icon-forward{background-position:-336px -72px;} +.icon-fast-forward{background-position:-360px -72px;} +.icon-step-forward{background-position:-384px -72px;} +.icon-eject{background-position:-408px -72px;} +.icon-chevron-left{background-position:-432px -72px;} +.icon-chevron-right{background-position:-456px -72px;} +.icon-plus-sign{background-position:0 -96px;} +.icon-minus-sign{background-position:-24px -96px;} +.icon-remove-sign{background-position:-48px -96px;} +.icon-ok-sign{background-position:-72px -96px;} +.icon-question-sign{background-position:-96px -96px;} +.icon-info-sign{background-position:-120px -96px;} +.icon-screenshot{background-position:-144px -96px;} +.icon-remove-circle{background-position:-168px -96px;} +.icon-ok-circle{background-position:-192px -96px;} +.icon-ban-circle{background-position:-216px -96px;} +.icon-arrow-left{background-position:-240px -96px;} +.icon-arrow-right{background-position:-264px -96px;} +.icon-arrow-up{background-position:-289px -96px;} +.icon-arrow-down{background-position:-312px -96px;} +.icon-share-alt{background-position:-336px -96px;} +.icon-resize-full{background-position:-360px -96px;} +.icon-resize-small{background-position:-384px -96px;} +.icon-plus{background-position:-408px -96px;} +.icon-minus{background-position:-433px -96px;} +.icon-asterisk{background-position:-456px -96px;} +.icon-exclamation-sign{background-position:0 -120px;} +.icon-gift{background-position:-24px -120px;} +.icon-leaf{background-position:-48px -120px;} +.icon-fire{background-position:-72px -120px;} +.icon-eye-open{background-position:-96px -120px;} +.icon-eye-close{background-position:-120px -120px;} +.icon-warning-sign{background-position:-144px -120px;} +.icon-plane{background-position:-168px -120px;} +.icon-calendar{background-position:-192px -120px;} +.icon-random{background-position:-216px -120px;} +.icon-comment{background-position:-240px -120px;} +.icon-magnet{background-position:-264px -120px;} +.icon-chevron-up{background-position:-288px -120px;} +.icon-chevron-down{background-position:-313px -119px;} +.icon-retweet{background-position:-336px -120px;} +.icon-shopping-cart{background-position:-360px -120px;} +.icon-folder-close{background-position:-384px -120px;} +.icon-folder-open{background-position:-408px -120px;} +.icon-resize-vertical{background-position:-432px -119px;} +.icon-resize-horizontal{background-position:-456px -118px;} +.dropdown{position:relative;} +.dropdown-toggle{*margin-bottom:-3px;} +.dropdown-toggle:active,.open .dropdown-toggle{outline:0;} +.caret{display:inline-block;width:0;height:0;text-indent:-99999px;*text-indent:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"\2193";} +.dropdown .caret{margin-top:8px;margin-left:2px;} +.dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);} +.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;max-width:220px;_width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.bottom-up{top:auto;bottom:100%;margin-bottom:2px;} +.dropdown-menu .divider{height:1px;margin:5px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;} +.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#555555;white-space:nowrap;} +.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;} +.dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);} +.dropdown.open .dropdown-menu{display:block;} +.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} +.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;} +.collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;} +.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;} +.btn{display:inline-block;padding:4px 10px 4px;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#fafafa;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;*margin-left:.3em;}.btn:first-child{*margin-left:0;} +.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} +.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;color:rgba(0, 0, 0, 0.5);outline:0;} +.btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.btn-large .icon{margin-top:1px;} +.btn-small{padding:5px 9px;font-size:11px;line-height:16px;} +.btn-small .icon{margin-top:-1px;} +.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;} +.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active{color:rgba(255, 255, 255, 0.75);} +.btn-primary{background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-ms-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(top, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0044cc;} +.btn-primary:active,.btn-primary.active{background-color:#003399 \9;} +.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;} +.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} +.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;} +.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} +.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;} +.btn-success:active,.btn-success.active{background-color:#408140 \9;} +.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;} +.btn-info:active,.btn-info.active{background-color:#24748c \9;} +button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} +button.btn.large,input[type="submit"].btn.large{*padding-top:7px;*padding-bottom:7px;} +button.btn.small,input[type="submit"].btn.small{*padding-top:3px;*padding-bottom:3px;} +.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";} +.btn-group:after{clear:both;} +.btn-group:first-child{*margin-left:0;} +.btn-group+.btn-group{margin-left:5px;} +.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;} +.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} +.btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} +.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} +.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;} +.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} +.btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:5px;*padding-bottom:5px;} +.btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);} +.btn .caret{margin-top:7px;margin-left:0;} +.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);} +.btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret{border-top-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);} +.btn-small .caret{margin-top:4px;} +.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.alert,.alert-heading{color:#c09853;} +.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;} +.alert-success{background-color:#dff0d8;border-color:#d6e9c6;} +.alert-success,.alert-success .alert-heading{color:#468847;} +.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;} +.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading{color:#b94a48;} +.alert-info{background-color:#d9edf7;border-color:#bce8f1;} +.alert-info,.alert-info .alert-heading{color:#3a87ad;} +.alert-block{padding-top:14px;padding-bottom:14px;} +.alert-block>p,.alert-block>ul{margin-bottom:0;} +.alert-block p+p{margin-top:5px;} +.nav{margin-left:0;margin-bottom:18px;list-style:none;} +.nav>li>a{display:block;} +.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} +.nav-list{padding-left:14px;padding-right:14px;margin-bottom:0;} +.nav-list>li>a,.nav-list .nav-header{display:block;padding:3px 15px;margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} +.nav-list .nav-header{font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-transform:uppercase;} +.nav-list>li+.nav-header{margin-top:9px;} +.nav-list .active>a,.nav-list .active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} +.nav-list [class^="icon-"]{margin-right:2px;} +.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";} +.nav-tabs:after,.nav-pills:after{clear:both;} +.nav-tabs>li,.nav-pills>li{float:left;} +.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} +.nav-tabs{border-bottom:1px solid #ddd;} +.nav-tabs>li{margin-bottom:-1px;} +.nav-tabs>li>a{padding-top:9px;padding-bottom:9px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} +.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} +.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.nav-pills .active>a,.nav-pills .active>a:hover{color:#ffffff;background-color:#0088cc;} +.nav-stacked>li{float:none;} +.nav-stacked>li>a{margin-right:0;} +.nav-tabs.nav-stacked{border-bottom:0;} +.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} +.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} +.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} +.nav-pills.nav-stacked>li>a{margin-bottom:3px;} +.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} +.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;} +.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;margin-top:6px;} +.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;} +.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;} +.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;} +.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} +.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;opacity:1;filter:alpha(opacity=100);} +.tabs-stacked .open>a:hover{border-color:#999999;} +.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";} +.tabbable:after{clear:both;} +.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;} +.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} +.tab-content>.active,.pill-content>.active{display:block;} +.tabs-below .nav-tabs{border-top:1px solid #ddd;} +.tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;} +.tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} +.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;} +.tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;} +.tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} +.tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} +.tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} +.tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} +.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} +.tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} +.tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} +.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} +.navbar{overflow:visible;margin-bottom:18px;} +.navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);} +.btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;} +.btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;} +.btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} +.btn-navbar .icon-bar+.icon-bar{margin-top:3px;} +.nav-collapse.collapse{height:auto;} +.navbar .brand:hover{text-decoration:none;} +.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;} +.navbar .navbar-text{margin-bottom:0;line-height:40px;color:#999999;}.navbar .navbar-text a:hover{color:#ffffff;background-color:transparent;} +.navbar .btn,.navbar .btn-group{margin-top:5px;} +.navbar .btn-group .btn{margin-top:0;} +.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";} +.navbar-form:after{clear:both;} +.navbar-form input,.navbar-form select{display:inline-block;margin-top:5px;margin-bottom:0;} +.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} +.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} +.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;color:rgba(255, 255, 255, 0.75);background:#666;background:rgba(255, 255, 255, 0.3);border:1px solid #111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query :-moz-placeholder{color:#eeeeee;} +.navbar-search .search-query::-webkit-input-placeholder{color:#eeeeee;} +.navbar-search .search-query:hover{color:#ffffff;background-color:#999999;background-color:rgba(255, 255, 255, 0.5);} +.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} +.navbar-fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030;} +.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} +.navbar .nav.pull-right{float:right;} +.navbar .nav>li{display:block;float:left;} +.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} +.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;} +.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;background-color:rgba(0, 0, 0, 0.5);} +.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;} +.navbar .nav.pull-right{margin-left:10px;margin-right:0;} +.navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} +.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} +.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;} +.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);} +.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;} +.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;} +.navbar .nav.pull-right .dropdown-menu{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before{left:auto;right:12px;} +.navbar .nav.pull-right .dropdown-menu:after{left:auto;right:13px;} +.breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;} +.breadcrumb .divider{padding:0 5px;color:#999999;} +.breadcrumb .active a{color:#333333;} +.pagination{height:36px;margin:18px 0;} +.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} +.pagination li{display:inline;} +.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;} +.pagination a:hover,.pagination .active a{background-color:#f5f5f5;} +.pagination .active a{color:#999999;cursor:default;} +.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;} +.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.pagination-centered{text-align:center;} +.pagination-right{text-align:right;} +.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";} +.pager:after{clear:both;} +.pager li{display:inline;} +.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} +.pager a:hover{text-decoration:none;background-color:#f5f5f5;} +.pager .next a{float:right;} +.pager .previous a{float:left;} +.modal-open .dropdown-menu{z-index:2050;} +.modal-open .dropdown.open{*z-index:2050;} +.modal-open .popover{z-index:2060;} +.modal-open .tooltip{z-index:2070;} +.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} +.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} +.modal{position:fixed;top:50%;left:50%;z-index:1050;max-height:500px;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} +.modal.fade.in{top:50%;} +.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} +.modal-body{padding:15px;} +.modal-footer{padding:14px 15px 15px;margin-bottom:0;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";} +.modal-footer:after{clear:both;} +.modal-footer .btn{float:right;margin-left:5px;margin-bottom:0;} +.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} +.tooltip.top{margin-top:-2px;} +.tooltip.right{margin-left:2px;} +.tooltip.bottom{margin-top:2px;} +.tooltip.left{margin-left:-2px;} +.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.tooltip-arrow{position:absolute;width:0;height:0;} +.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;} +.popover.right{margin-left:5px;} +.popover.bottom{margin-top:5px;} +.popover.left{margin-left:-5px;} +.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.popover .arrow{position:absolute;width:0;height:0;} +.popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);} +.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;} +.popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;} +.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";} +.thumbnails:after{clear:both;} +.thumbnails>li{float:left;margin:0 0 18px 20px;} +.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);} +a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} +.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} +.thumbnail .caption{padding:9px;} +.label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.label-important{background-color:#b94a48;} +.label-warning{background-color:#f89406;} +.label-success{background-color:#468847;} +.label-info{background-color:#3a87ad;} +@-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} +.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} +.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} +.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);} +.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);} +.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);} +.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.accordion{margin-bottom:18px;} +.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.accordion-heading{border-bottom:0;} +.accordion-heading .accordion-toggle{display:block;padding:8px 15px;} +.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} +.carousel{position:relative;margin-bottom:18px;line-height:1;} +.carousel-inner{overflow:hidden;width:100%;position:relative;} +.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;} +.carousel .item>img{display:block;line-height:1;} +.carousel .active,.carousel .next,.carousel .prev{display:block;} +.carousel .active{left:0;} +.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;} +.carousel .next{left:100%;} +.carousel .prev{left:-100%;} +.carousel .next.left,.carousel .prev.right{left:0;} +.carousel .active.left{left:-100%;} +.carousel .active.right{left:100%;} +.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} +.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} +.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);} +.carousel-caption h4,.carousel-caption p{color:#ffffff;} +.hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;} +.hero-unit p{font-size:18px;font-weight:200;line-height:27px;} +.pull-right{float:right;} +.pull-left{float:left;} +.hide{display:none;} +.show{display:block;} +.invisible{visibility:hidden;} diff --git a/public/css/style.css b/public/css/style.css new file mode 100644 index 00000000..28af8659 --- /dev/null +++ b/public/css/style.css @@ -0,0 +1,37 @@ +body { + padding-top: 60px; + padding-bottom: 40px; +} + +.zf-green { + color: #68b604; +} + +.btn-success { + background-color: #57a900; + background-image: -moz-linear-gradient(top, #70d900, #57a900); + background-image: -ms-linear-gradient(top, #70d900, #57a900); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#70d900), to(#57a900)); + background-image: -webkit-linear-gradient(top, #70d900, #57a900); + background-image: -o-linear-gradient(top, #70d900, #57a900); + background-image: linear-gradient(top, #70d900, #57a900); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#70d900', endColorstr='#57a900', GradientType=0); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #57a900; +} + +.btn-success:active, .btn-success.active { + background-color: #57a900; +} + +div.container a.brand { + background: url("../images/zf2-logo.png") no-repeat scroll 0 10px transparent; + margin-left: 0; + padding: 8px 20px 12px 40px; +} diff --git a/public/images/favicon.ico b/public/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..17f119909ffcba66c8a48cba1050d724ab0a51aa GIT binary patch literal 1406 zcmeH{u@S;B3`L(4!_kq77D~2&f)%m@8>CIi3Rxj5&{O4(F&KaWl5ZuLa4BgmpX9H9 z`YL`QaC$|7#dQTcp`$WT2c=`93TJ2EqV#>w00001b5ch_0Itp) z=>Px#24YJ`L;!yP_W%GgN~tse000SaNLh0L04^f{04^f|c%?sf00007bV*G`2iyV+ z0u~zPmpWDe00Lr3L_t(I%azo>i(FL{2k_6yUMCTM712~SHnN3^LXZ#>#6mD{K>q+S zX(BTq2r-aC&_W?)Kx6SHAYz+Fn|-UGg{D#q@kj43WQ(W}QBZutvDmjev$Joqn*)z` zx!n6b_xnBHb7I_-lIg1mkJx`4z((?5a5tV$o(yi!+&@Tx2+;xVFVZx_aXf%ea3pTw zz=& z*KA7NE5{=1(-GdEtJD{D)gIf$xG8VowH+1R9lzF9d;hp8Cvg#v;TN1QJ&Es)a4EB6 zlK#nXw&z@AdSR|r`@17O)2%PzXt!R)mC_@{hd3M|rRdt~`z5`4L;AAE*sb(4E>DKr zcVERJ{Dg0?5({kJiSSaU?AW|pSMAxQrfkZjWC_xn=92RG&mP?K#vF4 za9gH`@MmYF>p7EgOP%X=)!yiw{*-V5$C87=q2#_v)&Aa-_&C;awXWJ1OP6>h_%s*lEe?=BYch#lx|Y3run(); diff --git a/public/js/html5.js b/public/js/html5.js new file mode 100644 index 00000000..6692336c --- /dev/null +++ b/public/js/html5.js @@ -0,0 +1,4 @@ +// iepp v2.1pre @jon_neal & @aFarkas github.com/aFarkas/iepp +// html5shiv @rem remysharp.com/html5-enabling-script +// Dual licensed under the MIT or GPL Version 2 licenses +/*@cc_on(function(a,b){function r(a){var b=-1;while(++b").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( +a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f +.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); diff --git a/vendor/.gitignore b/vendor/.gitignore new file mode 100644 index 00000000..4578c85a --- /dev/null +++ b/vendor/.gitignore @@ -0,0 +1,5 @@ +!.gitignore +.composer +composer +zendframework +autoload.php diff --git a/vendor/README.md b/vendor/README.md new file mode 100644 index 00000000..52144c94 --- /dev/null +++ b/vendor/README.md @@ -0,0 +1 @@ +This vendor/ directory is where third-party modules should be installed. diff --git a/vendor/doctrine/common/.gitignore b/vendor/doctrine/common/.gitignore new file mode 100644 index 00000000..fb5e79d6 --- /dev/null +++ b/vendor/doctrine/common/.gitignore @@ -0,0 +1,4 @@ +build/ +logs/ +reports/ +dist/ diff --git a/vendor/doctrine/common/.gitmodules b/vendor/doctrine/common/.gitmodules new file mode 100644 index 00000000..51f08435 --- /dev/null +++ b/vendor/doctrine/common/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/vendor/doctrine-build-common"] + path = lib/vendor/doctrine-build-common + url = git://github.com/doctrine/doctrine-build-common.git diff --git a/vendor/doctrine/common/.travis.yml b/vendor/doctrine/common/.travis.yml new file mode 100644 index 00000000..4464d4f7 --- /dev/null +++ b/vendor/doctrine/common/.travis.yml @@ -0,0 +1,5 @@ +language: php + +php: + - 5.3 + - 5.4 diff --git a/vendor/doctrine/common/LICENSE b/vendor/doctrine/common/LICENSE new file mode 100644 index 00000000..1c03f74b --- /dev/null +++ b/vendor/doctrine/common/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/vendor/doctrine/common/README.md b/vendor/doctrine/common/README.md new file mode 100644 index 00000000..c63f7627 --- /dev/null +++ b/vendor/doctrine/common/README.md @@ -0,0 +1,12 @@ +# Doctrine Common + +[![Build Status](https://secure.travis-ci.org/doctrine/common.png)](http://travis-ci.org/doctrine/common) + +The Doctrine Common project is a library that provides extensions to core PHP functionality. + +## More resources: + +* [Website](http://www.doctrine-project.org) +* [Documentation](http://www.doctrine-project.org/projects/common/current/docs/en) +* [Issue Tracker](http://www.doctrine-project.org/jira/browse/DCOM) +* [Downloads](http://github.com/doctrine/common/downloads) diff --git a/vendor/doctrine/common/UPGRADE_TO_2_1 b/vendor/doctrine/common/UPGRADE_TO_2_1 new file mode 100644 index 00000000..891a2e5c --- /dev/null +++ b/vendor/doctrine/common/UPGRADE_TO_2_1 @@ -0,0 +1,39 @@ +This document details all the possible changes that you should investigate when updating +your project from Doctrine Common 2.0.x to 2.1 + +## AnnotationReader changes + +The annotation reader was heavily refactored between 2.0 and 2.1-RC1. In theory the operation of the new reader should be backwards compatible, but it has to be setup differently to work that way: + + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\'); + // new code necessary starting here + $reader->setIgnoreNotImportedAnnotations(true); + $reader->setEnableParsePhpImports(false); + $reader = new \Doctrine\Common\Annotations\CachedReader( + new \Doctrine\Common\Annotations\IndexedReader($reader), new ArrayCache() + ); + +## Annotation Base class or @Annotation + +Beginning after 2.1-RC2 you have to either extend ``Doctrine\Common\Annotations\Annotation`` or add @Annotation to your annotations class-level docblock, otherwise the class will simply be ignored. + +## Removed methods on AnnotationReader + +* AnnotationReader::setAutoloadAnnotations() +* AnnotationReader::getAutoloadAnnotations() +* AnnotationReader::isAutoloadAnnotations() + +## AnnotationRegistry + +Autoloading through the PHP autoloader is removed from the 2.1 AnnotationReader. Instead you have to use the global AnnotationRegistry for loading purposes: + + \Doctrine\Common\Annotations\AnnotationRegistry::registerFile($fileWithAnnotations); + \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespace($namespace, $dirs = null); + \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespaces($namespaces); + \Doctrine\Common\Annotations\AnnotationRegistry::registerLoader($callable); + +The $callable for registering a loader accepts a class as first and only parameter and must try to silently autoload it. On success true has to be returned. +The registerAutoloadNamespace function registers a PSR-0 compatible silent autoloader for all classes with the given namespace in the given directories. +If null is passed as directory the include path will be used. + diff --git a/vendor/doctrine/common/UPGRADE_TO_2_2 b/vendor/doctrine/common/UPGRADE_TO_2_2 new file mode 100644 index 00000000..1d93a131 --- /dev/null +++ b/vendor/doctrine/common/UPGRADE_TO_2_2 @@ -0,0 +1,61 @@ +This document details all the possible changes that you should investigate when +updating your project from Doctrine Common 2.1 to 2.2: + +## Annotation Changes + +- AnnotationReader::setIgnoreNotImportedAnnotations has been removed, you need to + add ignore annotation names which are supposed to be ignored via + AnnotationReader::addGlobalIgnoredName + +- AnnotationReader::setAutoloadAnnotations was deprecated by the AnnotationRegistry + in 2.1 and has been removed in 2.2 + +- AnnotationReader::setEnableParsePhpImports was added to ease transition to the new + annotation mechanism in 2.1 and is removed in 2.2 + +- AnnotationReader::isParsePhpImportsEnabled is removed (see above) + +- AnnotationReader::setDefaultAnnotationNamespace was deprecated in favor of explicit + configuration in 2.1 and will be removed in 2.2 (for isolated projects where you + have full-control over _all_ available annotations, we offer a dedicated reader + class ``SimpleAnnotationReader``) + +- AnnotationReader::setAnnotationCreationFunction was deprecated in 2.1 and will be + removed in 2.2. We only offer two creation mechanisms which cannot be changed + anymore to allow the same reader instance to work with all annotations regardless + of which library they are coming from. + +- AnnotationReader::setAnnotationNamespaceAlias was deprecated in 2.1 and will be + removed in 2.2 (see setDefaultAnnotationNamespace) + +- If you use a class as annotation which has not the @Annotation marker in it's + class block, we will now throw an exception instead of silently ignoring it. You + can however still achieve the previous behavior using the @IgnoreAnnotation, or + AnnotationReader::addGlobalIgnoredName (the exception message will contain detailed + instructions when you run into this problem). + +## Cache Changes + +- Renamed old AbstractCache to CacheProvider + +- Dropped the support to the following functions of all cache providers: + + - CacheProvider::deleteByWildcard + + - CacheProvider::deleteByRegEx + + - CacheProvider::deleteByPrefix + + - CacheProvider::deleteBySuffix + +- CacheProvider::deleteAll will not remove ALL entries, it will only mark them as invalid + +- CacheProvider::flushAll will remove ALL entries, namespaced or not + +- Added support to MemcachedCache + +- Added support to WincacheCache + +## ClassLoader Changes + +- ClassLoader::fileExistsInIncludePath() no longer exists. Use the native stream_resolve_include_path() PHP function \ No newline at end of file diff --git a/vendor/doctrine/common/build.properties b/vendor/doctrine/common/build.properties new file mode 100644 index 00000000..ff311a45 --- /dev/null +++ b/vendor/doctrine/common/build.properties @@ -0,0 +1,6 @@ +# Project Name +project.name=DoctrineCommon + +# Version class and file +project.version_class = Doctrine\Common\Version +project.version_file = lib/Doctrine/Common/Version.php diff --git a/vendor/doctrine/common/build.xml b/vendor/doctrine/common/build.xml new file mode 100644 index 00000000..71a9a500 --- /dev/null +++ b/vendor/doctrine/common/build.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DoctrineCommon + Doctrine Common PHP Extensions + pear.doctrine-project.org + The Doctrine Common package contains shared code between the other packages. + + + + + LGPL + + + - + + + + + + + diff --git a/vendor/doctrine/common/composer.json b/vendor/doctrine/common/composer.json new file mode 100644 index 00000000..f995f6c6 --- /dev/null +++ b/vendor/doctrine/common/composer.json @@ -0,0 +1,21 @@ +{ + "name": "doctrine/common", + "type": "library","version":"2.2.3", + "description": "Common Library for Doctrine projects", + "keywords": ["collections", "spl", "eventmanager", "annotations", "persistence"], + "homepage": "http://www.doctrine-project.org", + "license": "LGPL", + "authors": [ + {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"}, + {"name": "Roman Borschel", "email": "roman@code-factory.org"}, + {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"}, + {"name": "Jonathan Wage", "email": "jonwage@gmail.com"}, + {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"} + ], + "require": { + "php": ">=5.3.2" + }, + "autoload": { + "psr-0": { "Doctrine\\Common": "lib/" } + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php new file mode 100644 index 00000000..62512522 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php @@ -0,0 +1,75 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Annotations class + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class Annotation +{ + /** + * Value property. Common among all derived classes. + * + * @var string + */ + public $value; + + /** + * Constructor + * + * @param array $data Key-value for properties to be defined in this class + */ + public final function __construct(array $data) + { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + /** + * Error handler for unknown property accessor in Annotation class. + * + * @param string $name Unknown property name + */ + public function __get($name) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } + + /** + * Error handler for unknown property mutator in Annotation class. + * + * @param string $name Unkown property name + * @param mixed $value Property value + */ + public function __set($name, $value) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php new file mode 100644 index 00000000..21597b14 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php @@ -0,0 +1,47 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the attribute type during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attribute +{ + /** + * @var string + */ + public $name; + + /** + * @var string + */ + public $type; + + /** + * @var boolean + */ + public $required = false; +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php new file mode 100644 index 00000000..6e314be4 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php @@ -0,0 +1,37 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the types of all declared attributes during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attributes +{ + /** + * @var array + */ + public $value; +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php new file mode 100644 index 00000000..1b2b20ac --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php @@ -0,0 +1,44 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser to ignore specific + * annotations during the parsing process. + * + * @Annotation + * @author Johannes M. Schmitt + */ +final class IgnoreAnnotation +{ + public $names; + + public function __construct(array $values) + { + if (is_string($values['value'])) { + $values['value'] = array($values['value']); + } + if (!is_array($values['value'])) { + throw new \RuntimeException(sprintf('@IgnoreAnnotation expects either a string name, or an array of strings, but got %s.', json_encode($values['value']))); + } + + $this->names = $values['value']; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php new file mode 100644 index 00000000..7b89a022 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php @@ -0,0 +1,33 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check if that attribute is required during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Required +{ +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php new file mode 100644 index 00000000..c41896ad --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php @@ -0,0 +1,105 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the annotation target during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Target +{ + const TARGET_CLASS = 1; + const TARGET_METHOD = 2; + const TARGET_PROPERTY = 4; + const TARGET_ANNOTATION = 8; + const TARGET_ALL = 15; + + /** + * @var array + */ + private static $map = array( + 'ALL' => self::TARGET_ALL, + 'CLASS' => self::TARGET_CLASS, + 'METHOD' => self::TARGET_METHOD, + 'PROPERTY' => self::TARGET_PROPERTY, + 'ANNOTATION' => self::TARGET_ANNOTATION, + ); + + /** + * @var array + */ + public $value; + + /** + * Targets as bitmask. + * + * @var integer + */ + public $targets; + + /** + * Literal target declaration. + * + * @var integer + */ + public $literal; + + /** + * Annotation construct + * + * @param array $values + */ + public function __construct(array $values) + { + if (!isset($values['value'])){ + $values['value'] = null; + } + if (is_string($values['value'])){ + $values['value'] = array($values['value']); + } + if (!is_array($values['value'])){ + throw new \InvalidArgumentException( + sprintf('@Target expects either a string value, or an array of strings, "%s" given.', + is_object($values['value']) ? get_class($values['value']) : gettype($values['value']) + ) + ); + } + + $bitmask = 0; + foreach ($values['value'] as $literal) { + if(!isset(self::$map[$literal])){ + throw new \InvalidArgumentException( + sprintf('Invalid Target "%s". Available targets: [%s]', + $literal, implode(', ', array_keys(self::$map))) + ); + } + $bitmask += self::$map[$literal]; + } + + $this->targets = $bitmask; + $this->value = $values['value']; + $this->literal = implode(', ', $this->value); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php new file mode 100644 index 00000000..fdc1913a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php @@ -0,0 +1,111 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Description of AnnotationException + * + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class AnnotationException extends \Exception +{ + /** + * Creates a new AnnotationException describing a Syntax error. + * + * @param string $message Exception message + * @return AnnotationException + */ + public static function syntaxError($message) + { + return new self('[Syntax Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing a Semantical error. + * + * @param string $message Exception message + * @return AnnotationException + */ + public static function semanticalError($message) + { + return new self('[Semantical Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing an error which occurred during + * the creation of the annotation. + * + * @since 2.2 + * @param string $message + * @return AnnotationException + */ + public static function creationError($message) + { + return new self('[Creation Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing an type error of an attribute. + * + * @since 2.2 + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * @param mixed $actual + * @return AnnotationException + */ + public static function typeError($attributeName, $annotationName, $context, $expected, $actual) + { + return new self(sprintf( + '[Type Error] Attribute "%s" of @%s declared on %s expects %s, but got %s.', + $attributeName, + $annotationName, + $context, + $expected, + is_object($actual) ? 'an instance of '.get_class($actual) : gettype($actual) + )); + } + + /** + * Creates a new AnnotationException describing an required error of an attribute. + * + * @since 2.2 + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * @return AnnotationException + */ + public static function requiredError($attributeName, $annotationName, $context, $expected) + { + return new self(sprintf( + '[Type Error] Attribute "%s" of @%s declared on %s expects %s. This value should not be null.', + $attributeName, + $annotationName, + $context, + $expected + )); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php new file mode 100644 index 00000000..be87728b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php @@ -0,0 +1,303 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\IgnoreAnnotation; +use Doctrine\Common\Annotations\Annotation\Target; +use Closure; +use ReflectionClass; +use ReflectionMethod; +use ReflectionProperty; + +/** + * A reader for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +final class AnnotationReader implements Reader +{ + /** + * Global map for imports. + * + * @var array + */ + private static $globalImports = array( + 'ignoreannotation' => 'Doctrine\Common\Annotations\Annotation\IgnoreAnnotation', + ); + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names are case sensitive. + * + * @var array + */ + private static $globalIgnoredNames = array( + 'access'=> true, 'author'=> true, 'copyright'=> true, 'deprecated'=> true, + 'example'=> true, 'ignore'=> true, 'internal'=> true, 'link'=> true, 'see'=> true, + 'since'=> true, 'tutorial'=> true, 'version'=> true, 'package'=> true, + 'subpackage'=> true, 'name'=> true, 'global'=> true, 'param'=> true, + 'return'=> true, 'staticvar'=> true, 'category'=> true, 'staticVar'=> true, + 'static'=> true, 'var'=> true, 'throws'=> true, 'inheritdoc'=> true, + 'inheritDoc'=> true, 'license'=> true, 'todo'=> true, 'deprecated'=> true, + 'deprec'=> true, 'author'=> true, 'property' => true, 'method' => true, + 'abstract'=> true, 'exception'=> true, 'magic' => true, 'api' => true, + 'final'=> true, 'filesource'=> true, 'throw' => true, 'uses' => true, + 'usedby'=> true, 'private' => true, 'Annotation' => true, 'override' => true, + 'codeCoverageIgnore' => true, 'codeCoverageIgnoreStart' => true, 'codeCoverageIgnoreEnd' => true, + 'Required' => true, 'Attribute' => true, 'Attributes' => true, + 'Target' => true, 'SuppressWarnings' => true, + 'ingroup' => true, 'code' => true, 'endcode' => true, + 'package_version' => true, + ); + + /** + * Add a new annotation to the globally ignored annotation names with regard to exception handling. + * + * @param string $name + */ + static public function addGlobalIgnoredName($name) + { + self::$globalIgnoredNames[$name] = true; + } + + /** + * Annotations Parser + * + * @var Doctrine\Common\Annotations\DocParser + */ + private $parser; + + /** + * Annotations Parser used to collect parsing metadata + * + * @var Doctrine\Common\Annotations\DocParser + */ + private $preParser; + + /** + * PHP Parser used to collect imports. + * + * @var Doctrine\Common\Annotations\PhpParser + */ + private $phpParser; + + /** + * In-memory cache mechanism to store imported annotations per class. + * + * @var array + */ + private $imports = array(); + + /** + * In-memory cache mechanism to store ignored annotations per class. + * + * @var array + */ + private $ignoredAnnotationNames = array(); + + /** + * Constructor. + * + * Initializes a new AnnotationReader. + */ + public function __construct() + { + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/IgnoreAnnotation.php'); + + $this->parser = new DocParser; + + $this->preParser = new DocParser; + $this->preParser->setImports(self::$globalImports); + $this->preParser->setIgnoreNotImportedAnnotations(true); + + $this->phpParser = new PhpParser; + } + + /** + * Gets the annotations applied to a class. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @return array An array of Annotations. + */ + public function getClassAnnotations(ReflectionClass $class) + { + $this->parser->setTarget(Target::TARGET_CLASS); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($class->getDocComment(), 'class ' . $class->getName()); + } + + /** + * Gets a class annotation. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getClassAnnotation(ReflectionClass $class, $annotationName) + { + $annotations = $this->getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets the annotations applied to a property. + * + * @param ReflectionProperty $property The ReflectionProperty of the property + * from which the annotations should be read. + * @return array An array of Annotations. + */ + public function getPropertyAnnotations(ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + $this->parser->setTarget(Target::TARGET_PROPERTY); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($property->getDocComment(), $context); + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets the annotations applied to a method. + * + * @param ReflectionMethod $property The ReflectionMethod of the method from which + * the annotations should be read. + * @return array An array of Annotations. + */ + public function getMethodAnnotations(ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + $this->parser->setTarget(Target::TARGET_METHOD); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($method->getDocComment(), $context); + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Returns the ignored annotations for the given class. + * + * @param ReflectionClass $class + * @return array + */ + private function getIgnoredAnnotationNames(ReflectionClass $class) + { + if (isset($this->ignoredAnnotationNames[$name = $class->getName()])) { + return $this->ignoredAnnotationNames[$name]; + } + $this->collectParsingMetadata($class); + + return $this->ignoredAnnotationNames[$name]; + } + + private function getImports(ReflectionClass $class) + { + if (isset($this->imports[$name = $class->getName()])) { + return $this->imports[$name]; + } + $this->collectParsingMetadata($class); + + return $this->imports[$name]; + } + + /** + * Collects parsing metadata for a given class + * + * @param ReflectionClass $class + */ + private function collectParsingMetadata(ReflectionClass $class) + { + $ignoredAnnotationNames = self::$globalIgnoredNames; + + $annotations = $this->preParser->parse($class->getDocComment(), 'class '.$class->name); + foreach ($annotations as $annotation) { + if ($annotation instanceof IgnoreAnnotation) { + foreach ($annotation->names AS $annot) { + $ignoredAnnotationNames[$annot] = true; + } + } + } + + $name = $class->getName(); + $this->imports[$name] = array_merge( + self::$globalImports, + $this->phpParser->parseClass($class), + array('__NAMESPACE__' => $class->getNamespaceName()) + ); + $this->ignoredAnnotationNames[$name] = $ignoredAnnotationNames; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php new file mode 100644 index 00000000..60b00f51 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php @@ -0,0 +1,129 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +final class AnnotationRegistry +{ + /** + * A map of namespaces to use for autoloading purposes based on a PSR-0 convention. + * + * Contains the namespace as key and an array of directories as value. If the value is NULL + * the include path is used for checking for the corresponding file. + * + * This autoloading mechanism does not utilize the PHP autoloading but implements autoloading on its own. + * + * @var array + */ + static private $autoloadNamespaces = array(); + + /** + * A map of autoloader callables. + * + * @var array + */ + static private $loaders = array(); + + static public function reset() + { + self::$autoloadNamespaces = array(); + self::$loaders = array(); + } + + static public function registerFile($file) + { + require_once $file; + } + + /** + * Add a namespace with one or many directories to look for files or null for the include path. + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param string $namespace + * @param string|array|null $dirs + */ + static public function registerAutoloadNamespace($namespace, $dirs = null) + { + self::$autoloadNamespaces[$namespace] = $dirs; + } + + /** + * Register multiple namespaces + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param array $namespaces + */ + static public function registerAutoloadNamespaces(array $namespaces) + { + self::$autoloadNamespaces = array_merge(self::$autoloadNamespaces, $namespaces); + } + + /** + * Register an autoloading callabale for annotations, much like spl_autoload_register(). + * + * NOTE: These class loaders HAVE to be silent when a class was not found! + * IMPORTANT: Loaders have to return true if they loaded a class that could contain the searched annotation class. + * + * @param callabale $callabale + */ + static public function registerLoader($callabale) + { + if (!is_callable($callabale)) { + throw new \InvalidArgumentException("A callable is expected in AnnotationRegistry::registerLoader()."); + } + self::$loaders[] = $callabale; + } + + /** + * Autoload an annotation class silently. + * + * @param string $class + * @return void + */ + static public function loadAnnotationClass($class) + { + foreach (self::$autoloadNamespaces AS $namespace => $dirs) { + if (strpos($class, $namespace) === 0) { + $file = str_replace("\\", DIRECTORY_SEPARATOR, $class) . ".php"; + if ($dirs === null) { + if ($path = stream_resolve_include_path($file)) { + require $path; + return true; + } + } else { + foreach((array)$dirs AS $dir) { + if (file_exists($dir . DIRECTORY_SEPARATOR . $file)) { + require $dir . DIRECTORY_SEPARATOR . $file; + return true; + } + } + } + } + } + + foreach (self::$loaders AS $loader) { + if (call_user_func($loader, $class) === true) { + return true; + } + } + return false; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php new file mode 100644 index 00000000..6ea47c6a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php @@ -0,0 +1,179 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Cache\Cache; + +/** + * A cache aware annotation reader. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + */ +final class CachedReader implements Reader +{ + private static $CACHE_SALT = '@[Annot]'; + + /** + * @var Reader + */ + private $delegate; + + /** + * @var Cache + */ + private $cache; + + /** + * @var boolean + */ + private $debug; + + /** + * @var array + */ + private $loadedAnnotations; + + /** + * @param Reader $reader + * @param Cache $cache + */ + public function __construct(Reader $reader, Cache $cache, $debug = false) + { + $this->delegate = $reader; + $this->cache = $cache; + $this->debug = $debug; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $cacheKey = $class->getName() . self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getClassAnnotations($class); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $cacheKey = $class->getName().'$'.$property->getName().self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getPropertyAnnotations($property); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $cacheKey = $class->getName().'#'.$method->getName().self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getMethodAnnotations($method); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = array(); + } + + private function isCacheFresh($cacheKey, \ReflectionClass $class) + { + if (false === $filename = $class->getFilename()) { + return true; + } + + return $this->cache->fetch('[C]'.$cacheKey) >= filemtime($filename); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php new file mode 100644 index 00000000..c6223e36 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php @@ -0,0 +1,140 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Lexer; + +/** + * Simple lexer for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +final class DocLexer extends Lexer +{ + const T_NONE = 1; + const T_IDENTIFIER = 2; + const T_INTEGER = 3; + const T_STRING = 4; + const T_FLOAT = 5; + + const T_AT = 101; + const T_CLOSE_CURLY_BRACES = 102; + const T_CLOSE_PARENTHESIS = 103; + const T_COMMA = 104; + const T_EQUALS = 105; + const T_FALSE = 106; + const T_NAMESPACE_SEPARATOR = 107; + const T_OPEN_CURLY_BRACES = 108; + const T_OPEN_PARENTHESIS = 109; + const T_TRUE = 110; + const T_NULL = 111; + const T_COLON = 112; + + /** + * @inheritdoc + */ + protected function getCatchablePatterns() + { + return array( + '[a-z_][a-z0-9_:]*', + '(?:[+-]?[0-9]+(?:[\.][0-9]+)*)(?:[eE][+-]?[0-9]+)?', + '"(?:[^"]|"")*"', + ); + } + + /** + * @inheritdoc + */ + protected function getNonCatchablePatterns() + { + return array('\s+', '\*+', '(.)'); + } + + /** + * @inheritdoc + */ + protected function getType(&$value) + { + $type = self::T_NONE; + + // Checking numeric value + if (is_numeric($value)) { + return (strpos($value, '.') !== false || stripos($value, 'e') !== false) + ? self::T_FLOAT : self::T_INTEGER; + } + + if ($value[0] === '"') { + $value = str_replace('""', '"', substr($value, 1, strlen($value) - 2)); + + return self::T_STRING; + } else { + switch (strtolower($value)) { + case '@': + return self::T_AT; + + case ',': + return self::T_COMMA; + + case '(': + return self::T_OPEN_PARENTHESIS; + + case ')': + return self::T_CLOSE_PARENTHESIS; + + case '{': + return self::T_OPEN_CURLY_BRACES; + + case '}': + return self::T_CLOSE_CURLY_BRACES; + + case '=': + return self::T_EQUALS; + + case '\\': + return self::T_NAMESPACE_SEPARATOR; + + case 'true': + return self::T_TRUE; + + case 'false': + return self::T_FALSE; + + case 'null': + return self::T_NULL; + + case ':': + return self::T_COLON; + + default: + if (ctype_alpha($value[0]) || $value[0] === '_') { + return self::T_IDENTIFIER; + } + + break; + } + } + + return $type; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php new file mode 100644 index 00000000..9d16b176 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php @@ -0,0 +1,891 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Closure; +use ReflectionClass; +use Doctrine\Common\Annotations\Annotation\Target; +use Doctrine\Common\Annotations\Annotation\Attribute; +use Doctrine\Common\Annotations\Annotation\Attributes; + +/** + * A parser for docblock annotations. + * + * It is strongly discouraged to change the default annotation parsing process. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +final class DocParser +{ + /** + * An array of all valid tokens for a class name. + * + * @var array + */ + private static $classIdentifiers = array(DocLexer::T_IDENTIFIER, DocLexer::T_TRUE, DocLexer::T_FALSE, DocLexer::T_NULL); + + /** + * The lexer. + * + * @var Doctrine\Common\Annotations\DocLexer + */ + private $lexer; + + /** + * Current target context + * + * @var string + */ + private $target; + + /** + * Doc Parser used to collect annotation target + * + * @var Doctrine\Common\Annotations\DocParser + */ + private static $metadataParser; + + /** + * Flag to control if the current annotation is nested or not. + * + * @var boolean + */ + private $isNestedAnnotation = false; + + /** + * Hashmap containing all use-statements that are to be used when parsing + * the given doc block. + * + * @var array + */ + private $imports = array(); + + /** + * This hashmap is used internally to cache results of class_exists() + * look-ups. + * + * @var array + */ + private $classExists = array(); + + /** + * Whether annotations that have not been imported should be ignored. + * + * @var boolean + */ + private $ignoreNotImportedAnnotations = false; + + /** + * An array of default namespaces if operating in simple mode. + * + * @var array + */ + private $namespaces = array(); + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names must be the raw names as used in the class, not the fully qualified + * class names. + * + * @var array + */ + private $ignoredAnnotationNames = array(); + + /** + * @var string + */ + private $context = ''; + + /** + * Hash-map for caching annotation metadata + * @var array + */ + private static $annotationMetadata = array( + 'Doctrine\Common\Annotations\Annotation\Target' => array( + 'is_annotation' => true, + 'has_constructor' => true, + 'properties' => array(), + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'attribute_types' => array( + 'value' => array( + 'required' => false, + 'type' =>'array', + 'array_type'=>'string', + 'value' =>'array' + ) + ), + ), + 'Doctrine\Common\Annotations\Annotation\Attribute' => array( + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_ANNOTATION', + 'targets' => Target::TARGET_ANNOTATION, + 'default_property' => 'name', + 'properties' => array( + 'name' => 'name', + 'type' => 'type', + 'required' => 'required' + ), + 'attribute_types' => array( + 'value' => array( + 'required' => true, + 'type' =>'string', + 'value' =>'string' + ), + 'type' => array( + 'required' =>true, + 'type' =>'string', + 'value' =>'string' + ), + 'required' => array( + 'required' =>false, + 'type' =>'boolean', + 'value' =>'boolean' + ) + ), + ), + 'Doctrine\Common\Annotations\Annotation\Attributes' => array( + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'properties' => array( + 'value' => 'value' + ), + 'attribute_types' => array( + 'value' => array( + 'type' =>'array', + 'required' =>true, + 'array_type'=>'Doctrine\Common\Annotations\Annotation\Attribute', + 'value' =>'array' + ) + ), + ), + ); + + /** + * Hash-map for handle types declaration + * + * @var array + */ + private static $typeMap = array( + 'float' => 'double', + 'bool' => 'boolean', + // allow uppercase Boolean in honor of George Boole + 'Boolean' => 'boolean', + 'int' => 'integer', + ); + + /** + * Constructs a new DocParser. + */ + public function __construct() + { + $this->lexer = new DocLexer; + } + + /** + * Sets the annotation names that are ignored during the parsing process. + * + * The names are supposed to be the raw names as used in the class, not the + * fully qualified class names. + * + * @param array $names + */ + public function setIgnoredAnnotationNames(array $names) + { + $this->ignoredAnnotationNames = $names; + } + + public function setIgnoreNotImportedAnnotations($bool) + { + $this->ignoreNotImportedAnnotations = (Boolean) $bool; + } + + /** + * Sets the default namespaces. + * @param array $namespaces + */ + public function addNamespace($namespace) + { + if ($this->imports) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + $this->namespaces[] = $namespace; + } + + public function setImports(array $imports) + { + if ($this->namespaces) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + $this->imports = $imports; + } + + /** + * Sets current target context as bitmask. + * + * @param integer $target + */ + public function setTarget($target) + { + $this->target = $target; + } + + /** + * Parses the given docblock string for annotations. + * + * @param string $input The docblock string to parse. + * @param string $context The parsing context. + * @return array Array of annotations. If no annotations are found, an empty array is returned. + */ + public function parse($input, $context = '') + { + if (false === $pos = strpos($input, '@')) { + return array(); + } + + // also parse whatever character is before the @ + if ($pos > 0) { + $pos -= 1; + } + + $this->context = $context; + $this->lexer->setInput(trim(substr($input, $pos), '* /')); + $this->lexer->moveNext(); + + return $this->Annotations(); + } + + /** + * Attempts to match the given token with the current lookahead token. + * If they match, updates the lookahead token; otherwise raises a syntax error. + * + * @param int Token type. + * @return bool True if tokens match; false otherwise. + */ + private function match($token) + { + if ( ! $this->lexer->isNextToken($token) ) { + $this->syntaxError($this->lexer->getLiteral($token)); + } + + return $this->lexer->moveNext(); + } + + /** + * Attempts to match the current lookahead token with any of the given tokens. + * + * If any of them matches, this method updates the lookahead token; otherwise + * a syntax error is raised. + * + * @param array $tokens + * @return bool + */ + private function matchAny(array $tokens) + { + if ( ! $this->lexer->isNextTokenAny($tokens)) { + $this->syntaxError(implode(' or ', array_map(array($this->lexer, 'getLiteral'), $tokens))); + } + + return $this->lexer->moveNext(); + } + + /** + * Generates a new syntax error. + * + * @param string $expected Expected string. + * @param array $token Optional token. + * @throws SyntaxException + */ + private function syntaxError($expected, $token = null) + { + if ($token === null) { + $token = $this->lexer->lookahead; + } + + $message = "Expected {$expected}, got "; + + if ($this->lexer->lookahead === null) { + $message .= 'end of string'; + } else { + $message .= "'{$token['value']}' at position {$token['position']}"; + } + + if (strlen($this->context)) { + $message .= ' in ' . $this->context; + } + + $message .= '.'; + + throw AnnotationException::syntaxError($message); + } + + /** + * Attempt to check if a class exists or not. This never goes through the PHP autoloading mechanism + * but uses the {@link AnnotationRegistry} to load classes. + * + * @param string $fqcn + * @return boolean + */ + private function classExists($fqcn) + { + if (isset($this->classExists[$fqcn])) { + return $this->classExists[$fqcn]; + } + + // first check if the class already exists, maybe loaded through another AnnotationReader + if (class_exists($fqcn, false)) { + return $this->classExists[$fqcn] = true; + } + + // final check, does this class exist? + return $this->classExists[$fqcn] = AnnotationRegistry::loadAnnotationClass($fqcn); + } + + /** + * Collects parsing metadata for a given annotation class + * + * @param string $name The annotation name + */ + private function collectAnnotationMetadata($name) + { + if (self::$metadataParser == null){ + self::$metadataParser = new self(); + self::$metadataParser->setTarget(Target::TARGET_CLASS); + self::$metadataParser->setIgnoreNotImportedAnnotations(true); + self::$metadataParser->setImports(array( + 'target' => 'Doctrine\Common\Annotations\Annotation\Target', + 'attribute' => 'Doctrine\Common\Annotations\Annotation\Attribute', + 'attributes' => 'Doctrine\Common\Annotations\Annotation\Attributes' + )); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Target.php'); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attribute.php'); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attributes.php'); + } + + $class = new \ReflectionClass($name); + $docComment = $class->getDocComment(); + + // Sets default values for annotation metadata + $metadata = array( + 'default_property' => null, + 'has_constructor' => (null !== $constructor = $class->getConstructor()) && $constructor->getNumberOfParameters() > 0, + 'properties' => array(), + 'property_types' => array(), + 'attribute_types' => array(), + 'targets_literal' => null, + 'targets' => Target::TARGET_ALL, + 'is_annotation' => false !== strpos($docComment, '@Annotation'), + ); + + // verify that the class is really meant to be an annotation + if ($metadata['is_annotation']) { + foreach (self::$metadataParser->parse($docComment, 'class @' . $name) as $annotation) { + if ($annotation instanceof Target) { + $metadata['targets'] = $annotation->targets; + $metadata['targets_literal'] = $annotation->literal; + + } elseif ($annotation instanceof Attributes) { + foreach ($annotation->value as $attrib) { + // handle internal type declaration + $type = isset(self::$typeMap[$attrib->type]) ? self::$typeMap[$attrib->type] : $attrib->type; + + // handle the case if the property type is mixed + if ('mixed' !== $type) { + // Checks if the property has array + if (false !== $pos = strpos($type, '<')) { + $arrayType = substr($type, $pos+1, -1); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$attrib->name]['array_type'] = $arrayType; + } + + $metadata['attribute_types'][$attrib->name]['type'] = $type; + $metadata['attribute_types'][$attrib->name]['value'] = $attrib->type; + $metadata['attribute_types'][$attrib->name]['required'] = $attrib->required; + } + } + } + } + + // if not has a constructor will inject values into public properties + if (false === $metadata['has_constructor']) { + // collect all public properties + foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) { + $metadata['properties'][$property->name] = $property->name; + + // checks if the property has @var annotation + if ((false !== $propertyComment = $property->getDocComment()) + && false !== strpos($propertyComment, '@var') + && preg_match('/@var\s+([^\s]+)/',$propertyComment, $matches)) { + // literal type declaration + $value = $matches[1]; + + // handle internal type declaration + $type = isset(self::$typeMap[$value]) ? self::$typeMap[$value] : $value; + + // handle the case if the property type is mixed + if ('mixed' !== $type) { + // Checks if the property has @var array annotation + if (false !== $pos = strpos($type, '<')) { + $arrayType = substr($type, $pos+1, -1); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$property->name]['array_type'] = $arrayType; + } + + $metadata['attribute_types'][$property->name]['type'] = $type; + $metadata['attribute_types'][$property->name]['value'] = $value; + $metadata['attribute_types'][$property->name]['required'] = false !== strpos($propertyComment, '@Required'); + } + } + } + + // choose the first property as default property + $metadata['default_property'] = reset($metadata['properties']); + } + } + + self::$annotationMetadata[$name] = $metadata; + } + + /** + * Annotations ::= Annotation {[ "*" ]* [Annotation]}* + * + * @return array + */ + private function Annotations() + { + $annotations = array(); + + while (null !== $this->lexer->lookahead) { + if (DocLexer::T_AT !== $this->lexer->lookahead['type']) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is preceded by non-catchable pattern + if (null !== $this->lexer->token && $this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value'])) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is followed by either a namespace separator, or + // an identifier token + if ((null === $peek = $this->lexer->glimpse()) + || (DocLexer::T_NAMESPACE_SEPARATOR !== $peek['type'] && !in_array($peek['type'], self::$classIdentifiers, true)) + || $peek['position'] !== $this->lexer->lookahead['position'] + 1) { + $this->lexer->moveNext(); + continue; + } + + $this->isNestedAnnotation = false; + if (false !== $annot = $this->Annotation()) { + $annotations[] = $annot; + } + } + + return $annotations; + } + + /** + * Annotation ::= "@" AnnotationName ["(" [Values] ")"] + * AnnotationName ::= QualifiedName | SimpleName + * QualifiedName ::= NameSpacePart "\" {NameSpacePart "\"}* SimpleName + * NameSpacePart ::= identifier | null | false | true + * SimpleName ::= identifier | null | false | true + * + * @return mixed False if it is not a valid annotation. + */ + private function Annotation() + { + $this->match(DocLexer::T_AT); + + // check if we have an annotation + if ($this->lexer->isNextTokenAny(self::$classIdentifiers)) { + $this->lexer->moveNext(); + $name = $this->lexer->token['value']; + } else if ($this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) { + $name = ''; + } else { + $this->syntaxError('namespace separator or identifier'); + } + + while ($this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value']) && $this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) { + $this->match(DocLexer::T_NAMESPACE_SEPARATOR); + $this->matchAny(self::$classIdentifiers); + $name .= '\\'.$this->lexer->token['value']; + } + + // only process names which are not fully qualified, yet + // fully qualified names must start with a \ + $originalName = $name; + if ('\\' !== $name[0]) { + $alias = (false === $pos = strpos($name, '\\'))? $name : substr($name, 0, $pos); + + $found = false; + if ($this->namespaces) { + foreach ($this->namespaces as $namespace) { + if ($this->classExists($namespace.'\\'.$name)) { + $name = $namespace.'\\'.$name; + $found = true; + break; + } + } + } elseif (isset($this->imports[$loweredAlias = strtolower($alias)])) { + if (false !== $pos) { + $name = $this->imports[$loweredAlias].substr($name, $pos); + } else { + $name = $this->imports[$loweredAlias]; + } + $found = true; + } elseif (isset($this->imports['__NAMESPACE__']) && $this->classExists($this->imports['__NAMESPACE__'].'\\'.$name)) { + $name = $this->imports['__NAMESPACE__'].'\\'.$name; + $found = true; + } elseif ($this->classExists($name)) { + $found = true; + } + + if (!$found) { + if ($this->ignoreNotImportedAnnotations || isset($this->ignoredAnnotationNames[$name])) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s was never imported. Did you maybe forget to add a "use" statement for this annotation?', $name, $this->context)); + } + } + + if (!$this->classExists($name)) { + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s does not exist, or could not be auto-loaded.', $name, $this->context)); + } + + // at this point, $name contains the fully qualified class name of the + // annotation, and it is also guaranteed that this class exists, and + // that it is loaded + + + // collects the metadata annotation only if there is not yet + if (!isset(self::$annotationMetadata[$name])) { + $this->collectAnnotationMetadata($name); + } + + // verify that the class is really meant to be an annotation and not just any ordinary class + if (self::$annotationMetadata[$name]['is_annotation'] === false) { + if (isset($this->ignoredAnnotationNames[$originalName])) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The class "%s" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "%s". If it is indeed no annotation, then you need to add @IgnoreAnnotation("%s") to the _class_ doc comment of %s.', $name, $name, $originalName, $this->context)); + } + + //if target is nested annotation + $target = $this->isNestedAnnotation ? Target::TARGET_ANNOTATION : $this->target; + + // Next will be nested + $this->isNestedAnnotation = true; + + //if annotation does not support current target + if (0 === (self::$annotationMetadata[$name]['targets'] & $target) && $target) { + throw AnnotationException::semanticalError( + sprintf('Annotation @%s is not allowed to be declared on %s. You may only use this annotation on these code elements: %s.', + $originalName, $this->context, self::$annotationMetadata[$name]['targets_literal']) + ); + } + + $values = array(); + if ($this->lexer->isNextToken(DocLexer::T_OPEN_PARENTHESIS)) { + $this->match(DocLexer::T_OPEN_PARENTHESIS); + + if ( ! $this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) { + $values = $this->Values(); + } + + $this->match(DocLexer::T_CLOSE_PARENTHESIS); + } + + // checks all declared attributes + foreach (self::$annotationMetadata[$name]['attribute_types'] as $property => $type) { + if ($property === self::$annotationMetadata[$name]['default_property'] + && !isset($values[$property]) && isset($values['value'])) { + $property = 'value'; + } + + // handle a not given attribute or null value + if (!isset($values[$property])) { + if ($type['required']) { + throw AnnotationException::requiredError($property, $originalName, $this->context, 'a(n) '.$type['value']); + } + + continue; + } + + if ($type['type'] === 'array') { + // handle the case of a single value + if (!is_array($values[$property])) { + $values[$property] = array($values[$property]); + } + + // checks if the attribute has array type declaration, such as "array" + if (isset($type['array_type'])) { + foreach ($values[$property] as $item) { + if (gettype($item) !== $type['array_type'] && !$item instanceof $type['array_type']) { + throw AnnotationException::typeError($property, $originalName, $this->context, 'either a(n) '.$type['array_type'].', or an array of '.$type['array_type'].'s', $item); + } + } + } + } elseif (gettype($values[$property]) !== $type['type'] && !$values[$property] instanceof $type['type']) { + throw AnnotationException::typeError($property, $originalName, $this->context, 'a(n) '.$type['value'], $values[$property]); + } + } + + // check if the annotation expects values via the constructor, + // or directly injected into public properties + if (self::$annotationMetadata[$name]['has_constructor'] === true) { + return new $name($values); + } + + $instance = new $name(); + foreach ($values as $property => $value) { + if (!isset(self::$annotationMetadata[$name]['properties'][$property])) { + if ('value' !== $property) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not have a property named "%s". Available properties: %s', $originalName, $this->context, $property, implode(', ', self::$annotationMetadata[$name]['properties']))); + } + + // handle the case if the property has no annotations + if (!$property = self::$annotationMetadata[$name]['default_property']) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not accept any values, but got %s.', $originalName, $this->context, json_encode($values))); + } + } + + $instance->{$property} = $value; + } + + return $instance; + } + + /** + * Values ::= Array | Value {"," Value}* + * + * @return array + */ + private function Values() + { + $values = array(); + + // Handle the case of a single array as value, i.e. @Foo({....}) + if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { + $values['value'] = $this->Value(); + return $values; + } + + $values[] = $this->Value(); + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + $token = $this->lexer->lookahead; + $value = $this->Value(); + + if ( ! is_object($value) && ! is_array($value)) { + $this->syntaxError('Value', $token); + } + + $values[] = $value; + } + + foreach ($values as $k => $value) { + if (is_object($value) && $value instanceof \stdClass) { + $values[$value->name] = $value->value; + } else if ( ! isset($values['value'])){ + $values['value'] = $value; + } else { + if ( ! is_array($values['value'])) { + $values['value'] = array($values['value']); + } + + $values['value'][] = $value; + } + + unset($values[$k]); + } + + return $values; + } + + /** + * Value ::= PlainValue | FieldAssignment + * + * @return mixed + */ + private function Value() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type']) { + return $this->FieldAssignment(); + } + + return $this->PlainValue(); + } + + /** + * PlainValue ::= integer | string | float | boolean | Array | Annotation + * + * @return mixed + */ + private function PlainValue() + { + if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { + return $this->Arrayx(); + } + + if ($this->lexer->isNextToken(DocLexer::T_AT)) { + return $this->Annotation(); + } + + switch ($this->lexer->lookahead['type']) { + case DocLexer::T_STRING: + $this->match(DocLexer::T_STRING); + return $this->lexer->token['value']; + + case DocLexer::T_INTEGER: + $this->match(DocLexer::T_INTEGER); + return (int)$this->lexer->token['value']; + + case DocLexer::T_FLOAT: + $this->match(DocLexer::T_FLOAT); + return (float)$this->lexer->token['value']; + + case DocLexer::T_TRUE: + $this->match(DocLexer::T_TRUE); + return true; + + case DocLexer::T_FALSE: + $this->match(DocLexer::T_FALSE); + return false; + + case DocLexer::T_NULL: + $this->match(DocLexer::T_NULL); + return null; + + default: + $this->syntaxError('PlainValue'); + } + } + + /** + * FieldAssignment ::= FieldName "=" PlainValue + * FieldName ::= identifier + * + * @return array + */ + private function FieldAssignment() + { + $this->match(DocLexer::T_IDENTIFIER); + $fieldName = $this->lexer->token['value']; + + $this->match(DocLexer::T_EQUALS); + + $item = new \stdClass(); + $item->name = $fieldName; + $item->value = $this->PlainValue(); + + return $item; + } + + /** + * Array ::= "{" ArrayEntry {"," ArrayEntry}* [","] "}" + * + * @return array + */ + private function Arrayx() + { + $array = $values = array(); + + $this->match(DocLexer::T_OPEN_CURLY_BRACES); + $values[] = $this->ArrayEntry(); + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + + // optional trailing comma + if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) { + break; + } + + $values[] = $this->ArrayEntry(); + } + + $this->match(DocLexer::T_CLOSE_CURLY_BRACES); + + foreach ($values as $value) { + list ($key, $val) = $value; + + if ($key !== null) { + $array[$key] = $val; + } else { + $array[] = $val; + } + } + + return $array; + } + + /** + * ArrayEntry ::= Value | KeyValuePair + * KeyValuePair ::= Key ("=" | ":") PlainValue + * Key ::= string | integer + * + * @return array + */ + private function ArrayEntry() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type'] + || DocLexer::T_COLON === $peek['type']) { + $this->matchAny(array(DocLexer::T_INTEGER, DocLexer::T_STRING)); + + $key = $this->lexer->token['value']; + $this->matchAny(array(DocLexer::T_EQUALS, DocLexer::T_COLON)); + + return array($key, $this->PlainValue()); + } + + return array(null, $this->Value()); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php new file mode 100644 index 00000000..4a42b583 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php @@ -0,0 +1,209 @@ +. + */ + +namespace Doctrine\Common\Annotations; + + +/** + * File cache reader for annotations. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + */ +class FileCacheReader implements Reader +{ + /** + * @var Reader + */ + private $reader; + private $dir; + private $debug; + private $loadedAnnotations = array(); + + public function __construct(Reader $reader, $cacheDir, $debug = false) + { + $this->reader = $reader; + if (!is_dir($cacheDir) && !@mkdir($cacheDir, 0777, true)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist and could not be created.', $cacheDir)); + } + if (!is_writable($cacheDir)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" is not writable. Both, the webserver and the console user need access. You can manage access rights for multiple users with "chmod +a". If your system does not support this, check out the acl package.', $cacheDir)); + } + + $this->dir = rtrim($cacheDir, '\\/'); + $this->debug = $debug; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $key = $class->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + @unlink($path); + + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $key = $class->getName().'$'.$property->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + unlink($path); + + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $key = $class->getName().'#'.$method->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + unlink($path); + + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + private function saveCacheFile($path, $data) + { + file_put_contents($path, 'getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = array(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php new file mode 100644 index 00000000..1eea4921 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php @@ -0,0 +1,94 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Reader; + +/** + * Allows the reader to be used in-place of Doctrine's reader. + * + * @author Johannes M. Schmitt + */ +class IndexedReader implements Reader +{ + private $delegate; + + public function __construct(Reader $reader) + { + $this->delegate = $reader; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $annotations = array(); + foreach ($this->delegate->getClassAnnotations($class) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getClassAnnotation(\ReflectionClass $class, $annotation) + { + return $this->delegate->getClassAnnotation($class, $annotation); + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $annotations = array(); + foreach ($this->delegate->getMethodAnnotations($method) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getMethodAnnotation(\ReflectionMethod $method, $annotation) + { + return $this->delegate->getMethodAnnotation($method, $annotation); + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $annotations = array(); + foreach ($this->delegate->getPropertyAnnotations($property) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getPropertyAnnotation(\ReflectionProperty $property, $annotation) + { + return $this->delegate->getPropertyAnnotation($property, $annotation); + } + + /** + * Proxy all methods to the delegate. + * + * @param type $method + * @param type $args + * @return type + */ + public function __call($method, $args) + { + return call_user_func_array(array($this->delegate, $method), $args); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php new file mode 100644 index 00000000..a14f8f5b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php @@ -0,0 +1,203 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use SplFileObject; + +/** + * Parses a file for namespaces/use/class declarations. + * + * @author Fabien Potencier + * @author Christian Kaps + */ +final class PhpParser +{ + /** + * The token list. + * + * @var array + */ + private $tokens; + + /** + * The number of tokens. + * + * @var int + */ + private $numTokens = 0; + + /** + * The current array pointer. + * + * @var int + */ + private $pointer = 0; + + /** + * Parses a class. + * + * @param \ReflectionClass $class A ReflectionClass object. + * @return array A list with use statements in the form (Alias => FQN). + */ + public function parseClass(\ReflectionClass $class) + { + if (false === $filename = $class->getFilename()) { + return array(); + } + + $content = $this->getFileContent($filename, $class->getStartLine()); + $namespace = str_replace('\\', '\\\\', $class->getNamespaceName()); + $content = preg_replace('/^.*?(\bnamespace\s+' . $namespace . '\s*[;{].*)$/s', '\\1', $content); + $this->tokens = token_get_all('numTokens = count($this->tokens); + $this->pointer = 0; + + $statements = $this->parseUseStatements($class->getNamespaceName()); + + return $statements; + } + + /** + * Get the content of the file right up to the given line number. + * + * @param string $filename The name of the file to load. + * @param int $lineNumber The number of lines to read from file. + * @return string The content of the file. + */ + private function getFileContent($filename, $lineNumber) + { + $content = ''; + $lineCnt = 0; + $file = new SplFileObject($filename); + while(!$file->eof()) { + if ($lineCnt++ == $lineNumber) { + break; + } + + $content .= $file->fgets(); + } + + return $content; + } + + /** + * Gets the next non whitespace and non comment token. + * + * @return array The token if exists, null otherwise. + */ + private function next() + { + for ($i = $this->pointer; $i < $this->numTokens; $i++) { + $this->pointer++; + if ($this->tokens[$i][0] === T_WHITESPACE || + $this->tokens[$i][0] === T_COMMENT || + $this->tokens[$i][0] === T_DOC_COMMENT) { + + continue; + } + + return $this->tokens[$i]; + } + + return null; + } + + /** + * Get all use statements. + * + * @param string $namespaceName The namespace name of the reflected class. + * @return array A list with all found use statements. + */ + private function parseUseStatements($namespaceName) + { + $statements = array(); + while (($token = $this->next())) { + if ($token[0] === T_USE) { + $statements = array_merge($statements, $this->parseUseStatement()); + continue; + } else if ($token[0] !== T_NAMESPACE || $this->parseNamespace() != $namespaceName) { + continue; + } + + // Get fresh array for new namespace. This is to prevent the parser to collect the use statements + // for a previous namespace with the same name. This is the case if a namespace is defined twice + // or if a namespace with the same name is commented out. + $statements = array(); + } + + return $statements; + } + + /** + * Get the namespace name. + * + * @return string The found namespace name. + */ + private function parseNamespace() + { + $namespace = ''; + while (($token = $this->next())){ + if ($token[0] === T_STRING || $token[0] === T_NS_SEPARATOR) { + $namespace .= $token[1]; + } else { + break; + } + } + + return $namespace; + } + + /** + * Parse a single use statement. + * + * @return array A list with all found class names for a use statement. + */ + private function parseUseStatement() + { + $class = ''; + $alias = ''; + $statements = array(); + $explicitAlias = false; + while (($token = $this->next())) { + $isNameToken = $token[0] === T_STRING || $token[0] === T_NS_SEPARATOR; + if (!$explicitAlias && $isNameToken) { + $class .= $token[1]; + $alias = $token[1]; + } else if ($explicitAlias && $isNameToken) { + $alias .= $token[1]; + } else if ($token[0] === T_AS) { + $explicitAlias = true; + $alias = ''; + } else if ($token === ',') { + $statements[strtolower($alias)] = $class; + $class = ''; + $alias = ''; + $explicitAlias = false; + } else if ($token === ';') { + $statements[strtolower($alias)] = $class; + break; + } else { + break; + } + } + + return $statements; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php new file mode 100644 index 00000000..8e85d392 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php @@ -0,0 +1,35 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Interface for annotation readers. + * + * @author Johannes M. Schmitt + */ +interface Reader +{ + function getClassAnnotations(\ReflectionClass $class); + function getClassAnnotation(\ReflectionClass $class, $annotationName); + function getMethodAnnotations(\ReflectionMethod $method); + function getMethodAnnotation(\ReflectionMethod $method, $annotationName); + function getPropertyAnnotations(\ReflectionProperty $property); + function getPropertyAnnotation(\ReflectionProperty $property, $annotationName); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php new file mode 100644 index 00000000..a13c7fa0 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php @@ -0,0 +1,152 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\Target; + +/** + * Simple Annotation Reader. + * + * This annotation reader is intended to be used in projects where you have + * full-control over all annotations that are available. + * + * @since 2.2 + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +class SimpleAnnotationReader implements Reader +{ + /** + * @var DocParser + */ + private $parser; + + /** + * Constructor. + * + * Initializes a new SimpleAnnotationReader. + */ + public function __construct() + { + $this->parser = new DocParser(); + $this->parser->setIgnoreNotImportedAnnotations(true); + } + + /** + * Adds a namespace in which we will look for annotations. + * + * @param string $namespace + */ + public function addNamespace($namespace) + { + $this->parser->addNamespace($namespace); + } + + /** + * Gets the annotations applied to a class. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @return array An array of Annotations. + */ + public function getClassAnnotations(\ReflectionClass $class) + { + return $this->parser->parse($class->getDocComment(), 'class '.$class->getName()); + } + + /** + * Gets the annotations applied to a method. + * + * @param ReflectionMethod $property The ReflectionMethod of the method from which + * the annotations should be read. + * @return array An array of Annotations. + */ + public function getMethodAnnotations(\ReflectionMethod $method) + { + return $this->parser->parse($method->getDocComment(), 'method '.$method->getDeclaringClass()->name.'::'.$method->getName().'()'); + } + + /** + * Gets the annotations applied to a property. + * + * @param ReflectionProperty $property The ReflectionProperty of the property + * from which the annotations should be read. + * @return array An array of Annotations. + */ + public function getPropertyAnnotations(\ReflectionProperty $property) + { + return $this->parser->parse($property->getDocComment(), 'property '.$property->getDeclaringClass()->name.'::$'.$property->getName()); + } + + /** + * Gets a class annotation. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php new file mode 100644 index 00000000..a59296f5 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php @@ -0,0 +1,97 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * APC cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class ApcCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return apc_fetch($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + $found = false; + + apc_fetch($id, $found); + + return $found; + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return (bool) apc_store($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return apc_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return apc_clear_cache() && apc_clear_cache('user'); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = apc_cache_info(); + $sma = apc_sma_info(); + + return array( + Cache::STATS_HITS => $info['num_hits'], + Cache::STATS_MISSES => $info['num_misses'], + Cache::STATS_UPTIME => $info['start_time'], + Cache::STATS_MEMORY_USAGE => $info['mem_size'], + Cache::STATS_MEMORY_AVAILIABLE => $sma['avail_mem'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php new file mode 100644 index 00000000..8a0b982b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php @@ -0,0 +1,96 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Array cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class ArrayCache extends CacheProvider +{ + /** + * @var array $data + */ + private $data = array(); + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return (isset($this->data[$id])) ? $this->data[$id] : false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return isset($this->data[$id]); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + $this->data[$id] = $data; + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + unset($this->data[$id]); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->data = array(); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php new file mode 100644 index 00000000..d303bde4 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php @@ -0,0 +1,102 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Interface for cache drivers. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Fabio B. Silva + */ +interface Cache +{ + const STATS_HITS = 'hits'; + const STATS_MISSES = 'misses'; + const STATS_UPTIME = 'uptime'; + const STATS_MEMORY_USAGE = 'memory_usage'; + const STATS_MEMORY_AVAILIABLE = 'memory_available'; + + /** + * Fetches an entry from the cache. + * + * @param string $id cache id The id of the cache entry to fetch. + * @return string The cached data or FALSE, if no cache entry exists for the given id. + */ + function fetch($id); + + /** + * Test if an entry exists in the cache. + * + * @param string $id cache id The cache id of the entry to check for. + * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. + */ + function contains($id); + + /** + * Puts data into the cache. + * + * @param string $id The cache id. + * @param string $data The cache entry/data. + * @param int $lifeTime The lifetime. If != 0, sets a specific lifetime for this cache entry (0 => infinite lifeTime). + * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. + */ + function save($id, $data, $lifeTime = 0); + + /** + * Deletes a cache entry. + * + * @param string $id cache id + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + function delete($id); + + /** + * Retrieves cached information from data store + * + * The server's statistics array has the following values: + * + * - hits + * Number of keys that have been requested and found present. + * + * - misses + * Number of items that have been requested and not found. + * + * - uptime + * Time that the server is running. + * + * - memory_usage + * Memory used by this server to store items. + * + * - memory_available + * Memory allowed to use for storage. + * + * @since 2.2 + * @var array Associative array with server's statistics if available, NULL otherwise. + */ + function getStats(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php new file mode 100644 index 00000000..fa11fc22 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php @@ -0,0 +1,188 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Base class for cache provider implementations. + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Fabio B. Silva + */ +abstract class CacheProvider implements Cache +{ + const DOCTRINE_NAMESPACE_CACHEKEY = 'DoctrineNamespaceCacheKey[%s]'; + + /** + * @var string The namespace to prefix all cache ids with + */ + private $namespace = ''; + + /** + * Set the namespace to prefix all cache ids with. + * + * @param string $namespace + * @return void + */ + public function setNamespace($namespace) + { + $this->namespace = (string) $namespace; + } + + /** + * Retrieve the namespace that prefixes all cache ids. + * + * @return string + */ + public function getNamespace() + { + return $this->namespace; + } + + /** + * {@inheritdoc} + */ + public function fetch($id) + { + return $this->doFetch($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function contains($id) + { + return $this->doContains($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function save($id, $data, $lifeTime = 0) + { + return $this->doSave($this->getNamespacedId($id), $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + public function delete($id) + { + return $this->doDelete($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function getStats() + { + return $this->doGetStats(); + } + + /** + * Deletes all cache entries. + * + * @return boolean TRUE if the cache entries were successfully flushed, FALSE otherwise. + */ + public function flushAll() + { + return $this->doFlush(); + } + + /** + * Delete all cache entries. + * + * @return boolean TRUE if the cache entries were successfully deleted, FALSE otherwise. + */ + public function deleteAll() + { + $namespaceCacheKey = sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); + $namespaceVersion = ($this->doContains($namespaceCacheKey)) ? $this->doFetch($namespaceCacheKey) : 1; + + return $this->doSave($namespaceCacheKey, $namespaceVersion + 1); + } + + /** + * Prefix the passed id with the configured namespace value + * + * @param string $id The id to namespace + * @return string $id The namespaced id + */ + private function getNamespacedId($id) + { + $namespaceCacheKey = sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); + $namespaceVersion = ($this->doContains($namespaceCacheKey)) ? $this->doFetch($namespaceCacheKey) : 1; + + return sprintf('%s[%s][%s]', $this->namespace, $id, $namespaceVersion); + } + + /** + * Fetches an entry from the cache. + * + * @param string $id cache id The id of the cache entry to fetch. + * @return string The cached data or FALSE, if no cache entry exists for the given id. + */ + abstract protected function doFetch($id); + + /** + * Test if an entry exists in the cache. + * + * @param string $id cache id The cache id of the entry to check for. + * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. + */ + abstract protected function doContains($id); + + /** + * Puts data into the cache. + * + * @param string $id The cache id. + * @param string $data The cache entry/data. + * @param int $lifeTime The lifetime. If != false, sets a specific lifetime for this cache entry (null => infinite lifeTime). + * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. + */ + abstract protected function doSave($id, $data, $lifeTime = false); + + /** + * Deletes a cache entry. + * + * @param string $id cache id + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + abstract protected function doDelete($id); + + /** + * Deletes all cache entries. + * + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + abstract protected function doFlush(); + + /** + * Retrieves cached information from data store + * + * @since 2.2 + * @return array An associative array with server's statistics if available, NULL otherwise. + */ + abstract protected function doGetStats(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php new file mode 100644 index 00000000..dd6d1e31 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php @@ -0,0 +1,121 @@ +. + */ + +namespace Doctrine\Common\Cache; + +use \Memcache; + +/** + * Memcache cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class MemcacheCache extends CacheProvider +{ + /** + * @var Memcache + */ + private $memcache; + + /** + * Sets the memcache instance to use. + * + * @param Memcache $memcache + */ + public function setMemcache(Memcache $memcache) + { + $this->memcache = $memcache; + } + + /** + * Gets the memcache instance used by the cache. + * + * @return Memcache + */ + public function getMemcache() + { + return $this->memcache; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcache->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (bool) $this->memcache->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + return $this->memcache->set($id, $data, 0, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->memcache->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcache->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcache->getStats(); + return array( + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php new file mode 100644 index 00000000..4675fae7 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php @@ -0,0 +1,124 @@ +. + */ + +namespace Doctrine\Common\Cache; + +use \Memcached; + +/** + * Memcached cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class MemcachedCache extends CacheProvider +{ + /** + * @var Memcached + */ + private $memcached; + + /** + * Sets the memcache instance to use. + * + * @param Memcached $memcached + */ + public function setMemcached(Memcached $memcached) + { + $this->memcached = $memcached; + } + + /** + * Gets the memcached instance used by the cache. + * + * @return Memcached + */ + public function getMemcached() + { + return $this->memcached; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcached->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (false !== $this->memcached->get($id)); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + return $this->memcached->set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->memcached->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcached->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcached->getStats(); + $servers = $this->memcached->getServerList(); + $key = $servers[0]['host'] . ':' . $servers[0]['port']; + $stats = $stats[$key]; + return array( + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php new file mode 100644 index 00000000..ed8ca74a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php @@ -0,0 +1,92 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * WinCache cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class WincacheCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return wincache_ucache_get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return wincache_ucache_exists($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return (bool) wincache_ucache_set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return wincache_ucache_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return wincache_ucache_clear(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = wincache_ucache_info(); + $meminfo= wincache_ucache_meminfo(); + return array( + Cache::STATS_HITS => $info['total_hit_count'], + Cache::STATS_MISSES => $info['total_miss_count'], + Cache::STATS_UPTIME => $info['total_cache_uptime'], + Cache::STATS_MEMORY_USAGE => $meminfo['memory_total'], + Cache::STATS_MEMORY_AVAILIABLE => $meminfo['memory_free'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php new file mode 100644 index 00000000..6e22d265 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php @@ -0,0 +1,110 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Xcache cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class XcacheCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->doContains($id) ? unserialize(xcache_get($id)) : false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return xcache_isset($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return xcache_set($id, serialize($data), (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return xcache_unset($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->checkAuthorization(); + + xcache_clear_cache(XC_TYPE_VAR, 0); + + return true; + } + + /** + * Checks that xcache.admin.enable_auth is Off + * + * @throws \BadMethodCallException When xcache.admin.enable_auth is On + * @return void + */ + protected function checkAuthorization() + { + if (ini_get('xcache.admin.enable_auth')) { + throw new \BadMethodCallException('To use all features of \Doctrine\Common\Cache\XcacheCache, you must set "xcache.admin.enable_auth" to "Off" in your php.ini.'); + } + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $this->checkAuthorization(); + + $info = xcache_info(XC_TYPE_VAR, 0); + return array( + Cache::STATS_HITS => $info['hits'], + Cache::STATS_MISSES => $info['misses'], + Cache::STATS_UPTIME => null, + Cache::STATS_MEMORY_USAGE => $info['size'], + Cache::STATS_MEMORY_AVAILIABLE => $info['avail'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php new file mode 100644 index 00000000..4e4dabe7 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php @@ -0,0 +1,84 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Zend Data Cache cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Ralph Schindler + * @author Guilherme Blanco + */ +class ZendDataCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return zend_shm_cache_fetch($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (false !== zend_shm_cache_fetch($id)); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return zend_shm_cache_store($id, $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return zend_shm_cache_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $namespace = $this->getNamespace(); + if (empty($namespace)) { + return zend_shm_cache_clear(); + } + return zend_shm_cache_clear($namespace); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php new file mode 100644 index 00000000..375b0d6b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php @@ -0,0 +1,262 @@ +. + */ + +namespace Doctrine\Common; + +/** + * A ClassLoader is an autoloader for class files that can be + * installed on the SPL autoload stack. It is a class loader that either loads only classes + * of a specific namespace or all namespaces and it is suitable for working together + * with other autoloaders in the SPL autoload stack. + * + * If no include path is configured through the constructor or {@link setIncludePath}, a ClassLoader + * relies on the PHP include_path. + * + * @author Roman Borschel + * @since 2.0 + */ +class ClassLoader +{ + /** + * @var string PHP file extension + */ + protected $fileExtension = '.php'; + + /** + * @var string Current namespace + */ + protected $namespace; + + /** + * @var string Current include path + */ + protected $includePath; + + /** + * @var string PHP namespace separator + */ + protected $namespaceSeparator = '\\'; + + /** + * Creates a new ClassLoader that loads classes of the + * specified namespace from the specified include path. + * + * If no include path is given, the ClassLoader relies on the PHP include_path. + * If neither a namespace nor an include path is given, the ClassLoader will + * be responsible for loading all classes, thereby relying on the PHP include_path. + * + * @param string $ns The namespace of the classes to load. + * @param string $includePath The base include path to use. + */ + public function __construct($ns = null, $includePath = null) + { + $this->namespace = $ns; + $this->includePath = $includePath; + } + + /** + * Sets the namespace separator used by classes in the namespace of this ClassLoader. + * + * @param string $sep The separator to use. + */ + public function setNamespaceSeparator($sep) + { + $this->namespaceSeparator = $sep; + } + + /** + * Gets the namespace separator used by classes in the namespace of this ClassLoader. + * + * @return string + */ + public function getNamespaceSeparator() + { + return $this->namespaceSeparator; + } + + /** + * Sets the base include path for all class files in the namespace of this ClassLoader. + * + * @param string $includePath + */ + public function setIncludePath($includePath) + { + $this->includePath = $includePath; + } + + /** + * Gets the base include path for all class files in the namespace of this ClassLoader. + * + * @return string + */ + public function getIncludePath() + { + return $this->includePath; + } + + /** + * Sets the file extension of class files in the namespace of this ClassLoader. + * + * @param string $fileExtension + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * Gets the file extension of class files in the namespace of this ClassLoader. + * + * @return string + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Registers this ClassLoader on the SPL autoload stack. + */ + public function register() + { + spl_autoload_register(array($this, 'loadClass')); + } + + /** + * Removes this ClassLoader from the SPL autoload stack. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $classname The name of the class to load. + * @return boolean TRUE if the class has been successfully loaded, FALSE otherwise. + */ + public function loadClass($className) + { + if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) { + return false; + } + + require ($this->includePath !== null ? $this->includePath . DIRECTORY_SEPARATOR : '') + . str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) + . $this->fileExtension; + + return true; + } + + /** + * Asks this ClassLoader whether it can potentially load the class (file) with + * the given name. + * + * @param string $className The fully-qualified name of the class. + * @return boolean TRUE if this ClassLoader can load the class, FALSE otherwise. + */ + public function canLoadClass($className) + { + if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) { + return false; + } + + $file = str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) . $this->fileExtension; + + if ($this->includePath !== null) { + return file_exists($this->includePath . DIRECTORY_SEPARATOR . $file); + } + + return (false !== stream_resolve_include_path($file)); + } + + /** + * Checks whether a class with a given name exists. A class "exists" if it is either + * already defined in the current request or if there is an autoloader on the SPL + * autoload stack that is a) responsible for the class in question and b) is able to + * load a class file in which the class definition resides. + * + * If the class is not already defined, each autoloader in the SPL autoload stack + * is asked whether it is able to tell if the class exists. If the autoloader is + * a ClassLoader, {@link canLoadClass} is used, otherwise the autoload + * function of the autoloader is invoked and expected to return a value that + * evaluates to TRUE if the class (file) exists. As soon as one autoloader reports + * that the class exists, TRUE is returned. + * + * Note that, depending on what kinds of autoloaders are installed on the SPL + * autoload stack, the class (file) might already be loaded as a result of checking + * for its existence. This is not the case with a ClassLoader, who separates + * these responsibilities. + * + * @param string $className The fully-qualified name of the class. + * @return boolean TRUE if the class exists as per the definition given above, FALSE otherwise. + */ + public static function classExists($className) + { + if (class_exists($className, false) || interface_exists($className, false)) { + return true; + } + + foreach (spl_autoload_functions() as $loader) { + if (is_array($loader)) { // array(???, ???) + if (is_object($loader[0])) { + if ($loader[0] instanceof ClassLoader) { // array($obj, 'methodName') + if ($loader[0]->canLoadClass($className)) { + return true; + } + } else if ($loader[0]->{$loader[1]}($className)) { + return true; + } + } else if ($loader[0]::$loader[1]($className)) { // array('ClassName', 'methodName') + return true; + } + } else if ($loader instanceof \Closure) { // function($className) {..} + if ($loader($className)) { + return true; + } + } else if (is_string($loader) && $loader($className)) { // "MyClass::loadClass" + return true; + } + } + + return class_exists($className, false) || interface_exists($className, false); + } + + /** + * Gets the ClassLoader from the SPL autoload stack that is responsible + * for (and is able to load) the class with the given name. + * + * @param string $className The name of the class. + * @return The ClassLoader for the class or NULL if no such ClassLoader exists. + */ + public static function getClassLoader($className) + { + foreach (spl_autoload_functions() as $loader) { + if (is_array($loader) + && $loader[0] instanceof ClassLoader + && $loader[0]->canLoadClass($className) + ) { + return $loader[0]; + } + } + + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php new file mode 100644 index 00000000..2a7d4eaf --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php @@ -0,0 +1,447 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Closure, ArrayIterator; + +/** + * An ArrayCollection is a Collection implementation that wraps a regular PHP array. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class ArrayCollection implements Collection +{ + /** + * An array containing the entries of this collection. + * + * @var array + */ + private $_elements; + + /** + * Initializes a new ArrayCollection. + * + * @param array $elements + */ + public function __construct(array $elements = array()) + { + $this->_elements = $elements; + } + + /** + * Gets the PHP array representation of this collection. + * + * @return array The PHP array representation of this collection. + */ + public function toArray() + { + return $this->_elements; + } + + /** + * Sets the internal iterator to the first element in the collection and + * returns this element. + * + * @return mixed + */ + public function first() + { + return reset($this->_elements); + } + + /** + * Sets the internal iterator to the last element in the collection and + * returns this element. + * + * @return mixed + */ + public function last() + { + return end($this->_elements); + } + + /** + * Gets the current key/index at the current internal iterator position. + * + * @return mixed + */ + public function key() + { + return key($this->_elements); + } + + /** + * Moves the internal iterator position to the next element. + * + * @return mixed + */ + public function next() + { + return next($this->_elements); + } + + /** + * Gets the element of the collection at the current internal iterator position. + * + * @return mixed + */ + public function current() + { + return current($this->_elements); + } + + /** + * Removes an element with a specific key/index from the collection. + * + * @param mixed $key + * @return mixed The removed element or NULL, if no element exists for the given key. + */ + public function remove($key) + { + if (isset($this->_elements[$key])) { + $removed = $this->_elements[$key]; + unset($this->_elements[$key]); + + return $removed; + } + + return null; + } + + /** + * Removes the specified element from the collection, if it is found. + * + * @param mixed $element The element to remove. + * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. + */ + public function removeElement($element) + { + $key = array_search($element, $this->_elements, true); + + if ($key !== false) { + unset($this->_elements[$key]); + + return true; + } + + return false; + } + + /** + * ArrayAccess implementation of offsetExists() + * + * @see containsKey() + */ + public function offsetExists($offset) + { + return $this->containsKey($offset); + } + + /** + * ArrayAccess implementation of offsetGet() + * + * @see get() + */ + public function offsetGet($offset) + { + return $this->get($offset); + } + + /** + * ArrayAccess implementation of offsetGet() + * + * @see add() + * @see set() + */ + public function offsetSet($offset, $value) + { + if ( ! isset($offset)) { + return $this->add($value); + } + return $this->set($offset, $value); + } + + /** + * ArrayAccess implementation of offsetUnset() + * + * @see remove() + */ + public function offsetUnset($offset) + { + return $this->remove($offset); + } + + /** + * Checks whether the collection contains a specific key/index. + * + * @param mixed $key The key to check for. + * @return boolean TRUE if the given key/index exists, FALSE otherwise. + */ + public function containsKey($key) + { + return isset($this->_elements[$key]); + } + + /** + * Checks whether the given element is contained in the collection. + * Only element values are compared, not keys. The comparison of two elements + * is strict, that means not only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element + * @return boolean TRUE if the given element is contained in the collection, + * FALSE otherwise. + */ + public function contains($element) + { + foreach ($this->_elements as $collectionElement) { + if ($element === $collectionElement) { + return true; + } + } + + return false; + } + + /** + * Tests for the existance of an element that satisfies the given predicate. + * + * @param Closure $p The predicate. + * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. + */ + public function exists(Closure $p) + { + foreach ($this->_elements as $key => $element) { + if ($p($key, $element)) { + return true; + } + } + return false; + } + + /** + * Searches for a given element and, if found, returns the corresponding key/index + * of that element. The comparison of two elements is strict, that means not + * only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element The element to search for. + * @return mixed The key/index of the element or FALSE if the element was not found. + */ + public function indexOf($element) + { + return array_search($element, $this->_elements, true); + } + + /** + * Gets the element with the given key/index. + * + * @param mixed $key The key. + * @return mixed The element or NULL, if no element exists for the given key. + */ + public function get($key) + { + if (isset($this->_elements[$key])) { + return $this->_elements[$key]; + } + return null; + } + + /** + * Gets all keys/indexes of the collection elements. + * + * @return array + */ + public function getKeys() + { + return array_keys($this->_elements); + } + + /** + * Gets all elements. + * + * @return array + */ + public function getValues() + { + return array_values($this->_elements); + } + + /** + * Returns the number of elements in the collection. + * + * Implementation of the Countable interface. + * + * @return integer The number of elements in the collection. + */ + public function count() + { + return count($this->_elements); + } + + /** + * Adds/sets an element in the collection at the index / with the specified key. + * + * When the collection is a Map this is like put(key,value)/add(key,value). + * When the collection is a List this is like add(position,value). + * + * @param mixed $key + * @param mixed $value + */ + public function set($key, $value) + { + $this->_elements[$key] = $value; + } + + /** + * Adds an element to the collection. + * + * @param mixed $value + * @return boolean Always TRUE. + */ + public function add($value) + { + $this->_elements[] = $value; + return true; + } + + /** + * Checks whether the collection is empty. + * + * Note: This is preferrable over count() == 0. + * + * @return boolean TRUE if the collection is empty, FALSE otherwise. + */ + public function isEmpty() + { + return ! $this->_elements; + } + + /** + * Gets an iterator for iterating over the elements in the collection. + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_elements); + } + + /** + * Applies the given function to each element in the collection and returns + * a new collection with the elements returned by the function. + * + * @param Closure $func + * @return Collection + */ + public function map(Closure $func) + { + return new static(array_map($func, $this->_elements)); + } + + /** + * Returns all the elements of this collection that satisfy the predicate p. + * The order of the elements is preserved. + * + * @param Closure $p The predicate used for filtering. + * @return Collection A collection with the results of the filter operation. + */ + public function filter(Closure $p) + { + return new static(array_filter($this->_elements, $p)); + } + + /** + * Applies the given predicate p to all elements of this collection, + * returning true, if the predicate yields true for all elements. + * + * @param Closure $p The predicate. + * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. + */ + public function forAll(Closure $p) + { + foreach ($this->_elements as $key => $element) { + if ( ! $p($key, $element)) { + return false; + } + } + + return true; + } + + /** + * Partitions this collection in two collections according to a predicate. + * Keys are preserved in the resulting collections. + * + * @param Closure $p The predicate on which to partition. + * @return array An array with two elements. The first element contains the collection + * of elements where the predicate returned TRUE, the second element + * contains the collection of elements where the predicate returned FALSE. + */ + public function partition(Closure $p) + { + $coll1 = $coll2 = array(); + foreach ($this->_elements as $key => $element) { + if ($p($key, $element)) { + $coll1[$key] = $element; + } else { + $coll2[$key] = $element; + } + } + return array(new static($coll1), new static($coll2)); + } + + /** + * Returns a string representation of this object. + * + * @return string + */ + public function __toString() + { + return __CLASS__ . '@' . spl_object_hash($this); + } + + /** + * Clears the collection. + */ + public function clear() + { + $this->_elements = array(); + } + + /** + * Extract a slice of $length elements starting at position $offset from the Collection. + * + * If $length is null it returns all elements from $offset to the end of the Collection. + * Keys have to be preserved by this method. Calling this method will only return the + * selected slice and NOT change the elements contained in the collection slice is called on. + * + * @param int $offset + * @param int $length + * @return array + */ + public function slice($offset, $length = null) + { + return array_slice($this->_elements, $offset, $length, true); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php new file mode 100644 index 00000000..9fca659c --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php @@ -0,0 +1,243 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Closure, Countable, IteratorAggregate, ArrayAccess; + +/** + * The missing (SPL) Collection/Array/OrderedMap interface. + * + * A Collection resembles the nature of a regular PHP array. That is, + * it is essentially an ordered map that can also be used + * like a list. + * + * A Collection has an internal iterator just like a PHP array. In addition, + * a Collection can be iterated with external iterators, which is preferrable. + * To use an external iterator simply use the foreach language construct to + * iterate over the collection (which calls {@link getIterator()} internally) or + * explicitly retrieve an iterator though {@link getIterator()} which can then be + * used to iterate over the collection. + * You can not rely on the internal iterator of the collection being at a certain + * position unless you explicitly positioned it before. Prefer iteration with + * external iterators. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface Collection extends Countable, IteratorAggregate, ArrayAccess +{ + /** + * Adds an element at the end of the collection. + * + * @param mixed $element The element to add. + * @return boolean Always TRUE. + */ + function add($element); + + /** + * Clears the collection, removing all elements. + */ + function clear(); + + /** + * Checks whether an element is contained in the collection. + * This is an O(n) operation, where n is the size of the collection. + * + * @param mixed $element The element to search for. + * @return boolean TRUE if the collection contains the element, FALSE otherwise. + */ + function contains($element); + + /** + * Checks whether the collection is empty (contains no elements). + * + * @return boolean TRUE if the collection is empty, FALSE otherwise. + */ + function isEmpty(); + + /** + * Removes the element at the specified index from the collection. + * + * @param string|integer $key The kex/index of the element to remove. + * @return mixed The removed element or NULL, if the collection did not contain the element. + */ + function remove($key); + + /** + * Removes the specified element from the collection, if it is found. + * + * @param mixed $element The element to remove. + * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. + */ + function removeElement($element); + + /** + * Checks whether the collection contains an element with the specified key/index. + * + * @param string|integer $key The key/index to check for. + * @return boolean TRUE if the collection contains an element with the specified key/index, + * FALSE otherwise. + */ + function containsKey($key); + + /** + * Gets the element at the specified key/index. + * + * @param string|integer $key The key/index of the element to retrieve. + * @return mixed + */ + function get($key); + + /** + * Gets all keys/indices of the collection. + * + * @return array The keys/indices of the collection, in the order of the corresponding + * elements in the collection. + */ + function getKeys(); + + /** + * Gets all values of the collection. + * + * @return array The values of all elements in the collection, in the order they + * appear in the collection. + */ + function getValues(); + + /** + * Sets an element in the collection at the specified key/index. + * + * @param string|integer $key The key/index of the element to set. + * @param mixed $value The element to set. + */ + function set($key, $value); + + /** + * Gets a native PHP array representation of the collection. + * + * @return array + */ + function toArray(); + + /** + * Sets the internal iterator to the first element in the collection and + * returns this element. + * + * @return mixed + */ + function first(); + + /** + * Sets the internal iterator to the last element in the collection and + * returns this element. + * + * @return mixed + */ + function last(); + + /** + * Gets the key/index of the element at the current iterator position. + * + */ + function key(); + + /** + * Gets the element of the collection at the current iterator position. + * + */ + function current(); + + /** + * Moves the internal iterator position to the next element. + * + */ + function next(); + + /** + * Tests for the existence of an element that satisfies the given predicate. + * + * @param Closure $p The predicate. + * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. + */ + function exists(Closure $p); + + /** + * Returns all the elements of this collection that satisfy the predicate p. + * The order of the elements is preserved. + * + * @param Closure $p The predicate used for filtering. + * @return Collection A collection with the results of the filter operation. + */ + function filter(Closure $p); + + /** + * Applies the given predicate p to all elements of this collection, + * returning true, if the predicate yields true for all elements. + * + * @param Closure $p The predicate. + * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. + */ + function forAll(Closure $p); + + /** + * Applies the given function to each element in the collection and returns + * a new collection with the elements returned by the function. + * + * @param Closure $func + * @return Collection + */ + function map(Closure $func); + + /** + * Partitions this collection in two collections according to a predicate. + * Keys are preserved in the resulting collections. + * + * @param Closure $p The predicate on which to partition. + * @return array An array with two elements. The first element contains the collection + * of elements where the predicate returned TRUE, the second element + * contains the collection of elements where the predicate returned FALSE. + */ + function partition(Closure $p); + + /** + * Gets the index/key of a given element. The comparison of two elements is strict, + * that means not only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element The element to search for. + * @return mixed The key/index of the element or FALSE if the element was not found. + */ + function indexOf($element); + + /** + * Extract a slice of $length elements starting at position $offset from the Collection. + * + * If $length is null it returns all elements from $offset to the end of the Collection. + * Keys have to be preserved by this method. Calling this method will only return the + * selected slice and NOT change the elements contained in the collection slice is called on. + * + * @param int $offset + * @param int $length + * @return array + */ + function slice($offset, $length = null); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php new file mode 100644 index 00000000..8c5669be --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php @@ -0,0 +1,28 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Base exception class for package Doctrine\Common + * @author heinrich + * + */ +class CommonException extends \Exception { +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php new file mode 100644 index 00000000..bc95d303 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php @@ -0,0 +1,47 @@ +. + */ + + +namespace Doctrine\Common; + +/** + * Comparable interface that allows to compare two value objects to each other for similarity. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.com + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + */ +interface Comparable +{ + /** + * Compare the current object to the passed $other. + * + * Returns 0 if they are semantically equal, 1 if the other object + * is less than the current one, or -1 if its more than the current one. + * + * This method should not check for identity using ===, only for semantical equality for example + * when two different DateTime instances point to the exact same Date + TZ. + * + * @return int + */ + public function compareTo($other); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php new file mode 100644 index 00000000..6a3c0699 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php @@ -0,0 +1,69 @@ +. + */ + +namespace Doctrine\Common; + +/** + * EventArgs is the base class for classes containing event data. + * + * This class contains no event data. It is used by events that do not pass state + * information to an event handler when an event is raised. The single empty EventArgs + * instance can be obtained through {@link getEmptyInstance}. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class EventArgs +{ + /** + * @var EventArgs Single instance of EventArgs + * @static + */ + private static $_emptyEventArgsInstance; + + /** + * Gets the single, empty and immutable EventArgs instance. + * + * This instance will be used when events are dispatched without any parameter, + * like this: EventManager::dispatchEvent('eventname'); + * + * The benefit from this is that only one empty instance is instantiated and shared + * (otherwise there would be instances for every dispatched in the abovementioned form) + * + * @see EventManager::dispatchEvent + * @link http://msdn.microsoft.com/en-us/library/system.eventargs.aspx + * @static + * @return EventArgs + */ + public static function getEmptyInstance() + { + if ( ! self::$_emptyEventArgsInstance) { + self::$_emptyEventArgsInstance = new EventArgs; + } + + return self::$_emptyEventArgsInstance; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php new file mode 100644 index 00000000..a1f11ed2 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php @@ -0,0 +1,136 @@ +. + */ + +namespace Doctrine\Common; + +/** + * The EventManager is the central point of Doctrine's event listener system. + * Listeners are registered on the manager and events are dispatched through the + * manager. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class EventManager +{ + /** + * Map of registered listeners. + * => + * + * @var array + */ + private $_listeners = array(); + + /** + * Dispatches an event to all registered listeners. + * + * @param string $eventName The name of the event to dispatch. The name of the event is + * the name of the method that is invoked on listeners. + * @param EventArgs $eventArgs The event arguments to pass to the event handlers/listeners. + * If not supplied, the single empty EventArgs instance is used. + * @return boolean + */ + public function dispatchEvent($eventName, EventArgs $eventArgs = null) + { + if (isset($this->_listeners[$eventName])) { + $eventArgs = $eventArgs === null ? EventArgs::getEmptyInstance() : $eventArgs; + + foreach ($this->_listeners[$eventName] as $listener) { + $listener->$eventName($eventArgs); + } + } + } + + /** + * Gets the listeners of a specific event or all listeners. + * + * @param string $event The name of the event. + * @return array The event listeners for the specified event, or all event listeners. + */ + public function getListeners($event = null) + { + return $event ? $this->_listeners[$event] : $this->_listeners; + } + + /** + * Checks whether an event has any registered listeners. + * + * @param string $event + * @return boolean TRUE if the specified event has any listeners, FALSE otherwise. + */ + public function hasListeners($event) + { + return isset($this->_listeners[$event]) && $this->_listeners[$event]; + } + + /** + * Adds an event listener that listens on the specified events. + * + * @param string|array $events The event(s) to listen on. + * @param object $listener The listener object. + */ + public function addEventListener($events, $listener) + { + // Picks the hash code related to that listener + $hash = spl_object_hash($listener); + + foreach ((array) $events as $event) { + // Overrides listener if a previous one was associated already + // Prevents duplicate listeners on same event (same instance only) + $this->_listeners[$event][$hash] = $listener; + } + } + + /** + * Removes an event listener from the specified events. + * + * @param string|array $events + * @param object $listener + */ + public function removeEventListener($events, $listener) + { + // Picks the hash code related to that listener + $hash = spl_object_hash($listener); + + foreach ((array) $events as $event) { + // Check if actually have this listener associated + if (isset($this->_listeners[$event][$hash])) { + unset($this->_listeners[$event][$hash]); + } + } + } + + /** + * Adds an EventSubscriber. The subscriber is asked for all the events he is + * interested in and added as a listener for these events. + * + * @param Doctrine\Common\EventSubscriber $subscriber The subscriber. + */ + public function addEventSubscriber(EventSubscriber $subscriber) + { + $this->addEventListener($subscriber->getSubscribedEvents(), $subscriber); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php new file mode 100644 index 00000000..ed3383fa --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php @@ -0,0 +1,45 @@ +. + */ + +namespace Doctrine\Common; + +/** + * An EventSubscriber knows himself what events he is interested in. + * If an EventSubscriber is added to an EventManager, the manager invokes + * {@link getSubscribedEvents} and registers the subscriber as a listener for all + * returned events. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface EventSubscriber +{ + /** + * Returns an array of events this subscriber wants to listen to. + * + * @return array + */ + function getSubscribedEvents(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php new file mode 100644 index 00000000..8df3b843 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php @@ -0,0 +1,266 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Base class for writing simple lexers, i.e. for creating small DSLs. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @todo Rename: AbstractLexer + */ +abstract class Lexer +{ + /** + * @var array Array of scanned tokens + */ + private $tokens = array(); + + /** + * @var integer Current lexer position in input string + */ + private $position = 0; + + /** + * @var integer Current peek of current lexer position + */ + private $peek = 0; + + /** + * @var array The next token in the input. + */ + public $lookahead; + + /** + * @var array The last matched/seen token. + */ + public $token; + + /** + * Sets the input data to be tokenized. + * + * The Lexer is immediately reset and the new input tokenized. + * Any unprocessed tokens from any previous input are lost. + * + * @param string $input The input to be tokenized. + */ + public function setInput($input) + { + $this->tokens = array(); + $this->reset(); + $this->scan($input); + } + + /** + * Resets the lexer. + */ + public function reset() + { + $this->lookahead = null; + $this->token = null; + $this->peek = 0; + $this->position = 0; + } + + /** + * Resets the peek pointer to 0. + */ + public function resetPeek() + { + $this->peek = 0; + } + + /** + * Resets the lexer position on the input to the given position. + * + * @param integer $position Position to place the lexical scanner + */ + public function resetPosition($position = 0) + { + $this->position = $position; + } + + /** + * Checks whether a given token matches the current lookahead. + * + * @param integer|string $token + * @return boolean + */ + public function isNextToken($token) + { + return null !== $this->lookahead && $this->lookahead['type'] === $token; + } + + /** + * Checks whether any of the given tokens matches the current lookahead + * + * @param array $tokens + * @return boolean + */ + public function isNextTokenAny(array $tokens) + { + return null !== $this->lookahead && in_array($this->lookahead['type'], $tokens, true); + } + + /** + * Moves to the next token in the input string. + * + * A token is an associative array containing three items: + * - 'value' : the string value of the token in the input string + * - 'type' : the type of the token (identifier, numeric, string, input + * parameter, none) + * - 'position' : the position of the token in the input string + * + * @return array|null the next token; null if there is no more tokens left + */ + public function moveNext() + { + $this->peek = 0; + $this->token = $this->lookahead; + $this->lookahead = (isset($this->tokens[$this->position])) + ? $this->tokens[$this->position++] : null; + + return $this->lookahead !== null; + } + + /** + * Tells the lexer to skip input tokens until it sees a token with the given value. + * + * @param $type The token type to skip until. + */ + public function skipUntil($type) + { + while ($this->lookahead !== null && $this->lookahead['type'] !== $type) { + $this->moveNext(); + } + } + + /** + * Checks if given value is identical to the given token + * + * @param mixed $value + * @param integer $token + * @return boolean + */ + public function isA($value, $token) + { + return $this->getType($value) === $token; + } + + /** + * Moves the lookahead token forward. + * + * @return array | null The next token or NULL if there are no more tokens ahead. + */ + public function peek() + { + if (isset($this->tokens[$this->position + $this->peek])) { + return $this->tokens[$this->position + $this->peek++]; + } else { + return null; + } + } + + /** + * Peeks at the next token, returns it and immediately resets the peek. + * + * @return array|null The next token or NULL if there are no more tokens ahead. + */ + public function glimpse() + { + $peek = $this->peek(); + $this->peek = 0; + return $peek; + } + + /** + * Scans the input string for tokens. + * + * @param string $input a query string + */ + protected function scan($input) + { + static $regex; + + if ( ! isset($regex)) { + $regex = '/(' . implode(')|(', $this->getCatchablePatterns()) . ')|' + . implode('|', $this->getNonCatchablePatterns()) . '/i'; + } + + $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE; + $matches = preg_split($regex, $input, -1, $flags); + + foreach ($matches as $match) { + // Must remain before 'value' assignment since it can change content + $type = $this->getType($match[0]); + + $this->tokens[] = array( + 'value' => $match[0], + 'type' => $type, + 'position' => $match[1], + ); + } + } + + /** + * Gets the literal for a given token. + * + * @param integer $token + * @return string + */ + public function getLiteral($token) + { + $className = get_class($this); + $reflClass = new \ReflectionClass($className); + $constants = $reflClass->getConstants(); + + foreach ($constants as $name => $value) { + if ($value === $token) { + return $className . '::' . $name; + } + } + + return $token; + } + + /** + * Lexical catchable patterns. + * + * @return array + */ + abstract protected function getCatchablePatterns(); + + /** + * Lexical non-catchable patterns. + * + * @return array + */ + abstract protected function getNonCatchablePatterns(); + + /** + * Retrieve token type. Also processes the token value if necessary. + * + * @param string $value + * @return integer + */ + abstract protected function getType(&$value); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php new file mode 100644 index 00000000..93e504ae --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php @@ -0,0 +1,45 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Contract for classes that provide the service of notifying listeners of + * changes to their properties. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface NotifyPropertyChanged +{ + /** + * Adds a listener that wants to be notified about property changes. + * + * @param PropertyChangedListener $listener + */ + function addPropertyChangedListener(PropertyChangedListener $listener); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php new file mode 100644 index 00000000..9fff343c --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php @@ -0,0 +1,224 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\ManagerRegistry; + +/** + * Abstract implementation of the ManagerRegistry contract. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +abstract class AbstractManagerRegistry implements ManagerRegistry +{ + private $name; + private $connections; + private $managers; + private $defaultConnection; + private $defaultManager; + private $proxyInterfaceName; + + public function __construct($name, array $connections, array $managers, $defaultConnection, $defaultManager, $proxyInterfaceName) + { + $this->name = $name; + $this->connections = $connections; + $this->managers = $managers; + $this->defaultConnection = $defaultConnection; + $this->defaultManager = $defaultManager; + $this->proxyInterfaceName = $proxyInterfaceName; + } + + /** + * Fetches/creates the given services + * + * A service in this context is connection or a manager instance + * + * @param string $name name of the service + * @return object instance of the given service + */ + abstract protected function getService($name); + + /** + * Resets the given services + * + * A service in this context is connection or a manager instance + * + * @param string $name name of the service + * @return void + */ + abstract protected function resetService($name); + + /** + * Get the name of the registry + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @inheritdoc + */ + public function getConnection($name = null) + { + if (null === $name) { + $name = $this->defaultConnection; + } + + if (!isset($this->connections[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Connection named "%s" does not exist.', $this->name, $name)); + } + + return $this->getService($this->connections[$name]); + } + + /** + * @inheritdoc + */ + public function getConnectionNames() + { + return $this->connections; + } + + /** + * @inheritdoc + */ + public function getConnections() + { + $connections = array(); + foreach ($this->connections as $name => $id) { + $connections[$name] = $this->getService($id); + } + + return $connections; + } + + /** + * @inheritdoc + */ + public function getDefaultConnectionName() + { + return $this->defaultConnection; + } + + /** + * @inheritdoc + */ + public function getDefaultManagerName() + { + return $this->defaultManager; + } + + /** + * @inheritdoc + */ + public function getManager($name = null) + { + if (null === $name) { + $name = $this->defaultManager; + } + + if (!isset($this->managers[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); + } + + return $this->getService($this->managers[$name]); + } + + /** + * @inheritdoc + */ + public function getManagerForClass($class) + { + // Check for namespace alias + if (strpos($class, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $class); + $class = $this->getAliasNamespace($namespaceAlias) . '\\' . $simpleClassName; + } + + $proxyClass = new \ReflectionClass($class); + if ($proxyClass->implementsInterface($this->proxyInterfaceName)) { + $class = $proxyClass->getParentClass()->getName(); + } + + foreach ($this->managers as $id) { + $manager = $this->getService($id); + + if (!$manager->getMetadataFactory()->isTransient($class)) { + return $manager; + } + } + } + + /** + * @inheritdoc + */ + public function getManagerNames() + { + return $this->managers; + } + + /** + * @inheritdoc + */ + public function getManagers() + { + $dms = array(); + foreach ($this->managers as $name => $id) { + $dms[$name] = $this->getService($id); + } + + return $dms; + } + + /** + * @inheritdoc + */ + public function getRepository($persistentObjectName, $persistentManagerName = null) + { + return $this->getManager($persistentManagerName)->getRepository($persistentObjectName); + } + + /** + * @inheritdoc + */ + public function resetManager($name = null) + { + if (null === $name) { + $name = $this->defaultManager; + } + + if (!isset($this->managers[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); + } + + // force the creation of a new document manager + // if the current one is closed + $this->resetService($this->managers[$name]); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php new file mode 100644 index 00000000..a47727fa --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php @@ -0,0 +1,63 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract covering connection for a Doctrine persistence layer ManagerRegistry class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +interface ConnectionRegistry +{ + /** + * Gets the default connection name. + * + * @return string The default connection name + */ + function getDefaultConnectionName(); + + /** + * Gets the named connection. + * + * @param string $name The connection name (null for the default one) + * + * @return Connection + */ + function getConnection($name = null); + + /** + * Gets an array of all registered connections + * + * @return array An array of Connection instances + */ + function getConnections(); + + /** + * Gets all connection names. + * + * @return array An array of connection names + */ + function getConnectionNames(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php new file mode 100644 index 00000000..8055b66d --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php @@ -0,0 +1,77 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs; +use Doctrine\Common\Persistence\ObjectManager; + +/** + * Lifecycle Events are triggered by the UnitOfWork during lifecycle transitions + * of entities. + * + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class LifecycleEventArgs extends EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var object + */ + private $entity; + + /** + * Constructor + * + * @param object $entity + * @param ObjectManager $objectManager + */ + public function __construct($entity, ObjectManager $objectManager) + { + $this->entity = $entity; + $this->objectManager = $objectManager; + } + + /** + * Retireve associated Entity. + * + * @return object + */ + public function getEntity() + { + return $this->entity; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php new file mode 100644 index 00000000..4a18d167 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php @@ -0,0 +1,76 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs; +use Doctrine\Common\Persistence\ObjectManager; +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Class that holds event arguments for a loadMetadata event. + * + * @author Jonathan H. Wage + * @since 2.2 + */ +class LoadClassMetadataEventArgs extends EventArgs +{ + /** + * @var ClassMetadata + */ + private $classMetadata; + + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * Constructor. + * + * @param ClasseMetadata $classMetadata + * @param ObjectManager $objectManager + */ + public function __construct(ClassMetadata $classMetadata, ObjectManager $objectManager) + { + $this->classMetadata = $classMetadata; + $this->objectManager = $objectManager; + } + + /** + * Retrieve associated ClassMetadata. + * + * @return ClassMetadata + */ + public function getClassMetadata() + { + return $this->classMetadata; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php new file mode 100644 index 00000000..33c4d796 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php @@ -0,0 +1,59 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\Persistence\ObjectManager; + +/** + * Provides event arguments for the preFlush event. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class ManagerEventArgs extends \Doctrine\Common\EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * Constructor. + * + * @param ObjectManager $objectManager + */ + public function __construct(ObjectManager $objectManager) + { + $this->objectManager = $objectManager; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php new file mode 100644 index 00000000..f67ab50e --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php @@ -0,0 +1,84 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +/** + * Provides event arguments for the onClear event. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class OnClearEventArgs extends \Doctrine\Common\EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var string + */ + private $entityClass; + + /** + * Constructor. + * + * @param ObjectManager $objectManager + * @param string $entityClass Optional entity class + */ + public function __construct($objectManager, $entityClass = null) + { + $this->objectManager = $objectManager; + $this->entityClass = $entityClass; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } + + /** + * Name of the entity class that is cleared, or empty if all are cleared. + * + * @return string + */ + public function getEntityClass() + { + return $this->entityClass; + } + + /** + * Check if event clears all entities. + * + * @return bool + */ + public function clearsAllEntities() + { + return ($this->entityClass === null); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php new file mode 100644 index 00000000..191d053a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php @@ -0,0 +1,129 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs, + Doctrine\Common\Persistence\ObjectManager; + +/** + * Class that holds event arguments for a preUpdate event. + * + * @author Guilherme Blanco + * @author Roman Borschel + * @author Benjamin Eberlei + * @since 2.2 + */ +class PreUpdateEventArgs extends LifecycleEventArgs +{ + /** + * @var array + */ + private $entityChangeSet; + + /** + * Constructor. + * + * @param object $entity + * @param ObjectManager $objectManager + * @param array $changeSet + */ + public function __construct($entity, ObjectManager $objectManager, array &$changeSet) + { + parent::__construct($entity, $objectManager); + + $this->entityChangeSet = &$changeSet; + } + + /** + * Retrieve entity changeset. + * + * @return array + */ + public function getEntityChangeSet() + { + return $this->entityChangeSet; + } + + /** + * Check if field has a changeset. + * + * @return boolean + */ + public function hasChangedField($field) + { + return isset($this->entityChangeSet[$field]); + } + + /** + * Get the old value of the changeset of the changed field. + * + * @param string $field + * @return mixed + */ + public function getOldValue($field) + { + $this->assertValidField($field); + + return $this->entityChangeSet[$field][0]; + } + + /** + * Get the new value of the changeset of the changed field. + * + * @param string $field + * @return mixed + */ + public function getNewValue($field) + { + $this->assertValidField($field); + + return $this->entityChangeSet[$field][1]; + } + + /** + * Set the new value of this field. + * + * @param string $field + * @param mixed $value + */ + public function setNewValue($field, $value) + { + $this->assertValidField($field); + + $this->entityChangeSet[$field][1] = $value; + } + + /** + * Assert the field exists in changeset. + * + * @param string $field + */ + private function assertValidField($field) + { + if ( ! isset($this->entityChangeSet[$field])) { + throw new \InvalidArgumentException(sprintf( + 'Field "%s" is not a valid field of the entity "%s" in PreUpdateEventArgs.', + $field, + get_class($this->getEntity()) + )); + } + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php new file mode 100644 index 00000000..4d92426b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php @@ -0,0 +1,112 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract covering object managers for a Doctrine persistence layer ManagerRegistry class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +interface ManagerRegistry extends ConnectionRegistry +{ + /** + * Gets the default object manager name. + * + * @return string The default object manager name + */ + function getDefaultManagerName(); + + /** + * Gets a named object manager. + * + * @param string $name The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectManager + */ + function getManager($name = null); + + /** + * Gets an array of all registered object managers + * + * @return array An array of ObjectManager instances + */ + function getManagers(); + + /** + * Resets a named object manager. + * + * This method is useful when an object manager has been closed + * because of a rollbacked transaction AND when you think that + * it makes sense to get a new one to replace the closed one. + * + * Be warned that you will get a brand new object manager as + * the existing one is not useable anymore. This means that any + * other object with a dependency on this object manager will + * hold an obsolete reference. You can inject the registry instead + * to avoid this problem. + * + * @param string $name The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectManager + */ + function resetManager($name = null); + + /** + * Resolves a registered namespace alias to the full namespace. + * + * This method looks for the alias in all registered object managers. + * + * @param string $alias The alias + * + * @return string The full namespace + */ + function getAliasNamespace($alias); + + /** + * Gets all connection names. + * + * @return array An array of connection names + */ + function getManagerNames(); + + /** + * Gets the ObjectRepository for an persistent object. + * + * @param string $persistentObject The name of the persistent object. + * @param string $persistentManagerName The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectRepository + */ + function getRepository($persistentObject, $persistentManagerName = null); + + /** + * Gets the object manager associated with a given class. + * + * @param string $class A persistent object class name + * + * @return \Doctrine\Common\Persistence\ObjectManager|null + */ + function getManagerForClass($class); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php new file mode 100644 index 00000000..a2a61850 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php @@ -0,0 +1,359 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use Doctrine\Common\Cache\Cache; + +/** + * The ClassMetadataFactory is used to create ClassMetadata objects that contain all the + * metadata mapping informations of a class which describes how a class should be mapped + * to a relational database. + * + * This class was abstracted from the ORM ClassMetadataFactory + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +abstract class AbstractClassMetadataFactory implements ClassMetadataFactory +{ + /** + * Salt used by specific Object Manager implementation. + * + * @var string + */ + protected $cacheSalt = "\$CLASSMETADATA"; + + /** + * @var \Doctrine\Common\Cache\Cache + */ + private $cacheDriver; + + /** + * @var array + */ + private $loadedMetadata = array(); + + /** + * @var bool + */ + protected $initialized = false; + + /** + * @var ReflectionService + */ + private $reflectionService; + + /** + * Sets the cache driver used by the factory to cache ClassMetadata instances. + * + * @param Doctrine\Common\Cache\Cache $cacheDriver + */ + public function setCacheDriver(Cache $cacheDriver = null) + { + $this->cacheDriver = $cacheDriver; + } + + /** + * Gets the cache driver used by the factory to cache ClassMetadata instances. + * + * @return Doctrine\Common\Cache\Cache + */ + public function getCacheDriver() + { + return $this->cacheDriver; + } + + /** + * Return an array of all the loaded metadata currently in memory. + * + * @return array + */ + public function getLoadedMetadata() + { + return $this->loadedMetadata; + } + + /** + * Forces the factory to load the metadata of all classes known to the underlying + * mapping driver. + * + * @return array The ClassMetadata instances of all mapped classes. + */ + public function getAllMetadata() + { + if ( ! $this->initialized) { + $this->initialize(); + } + + $driver = $this->getDriver(); + $metadata = array(); + foreach ($driver->getAllClassNames() as $className) { + $metadata[] = $this->getMetadataFor($className); + } + + return $metadata; + } + + /** + * Lazy initialization of this stuff, especially the metadata driver, + * since these are not needed at all when a metadata cache is active. + * + * @return void + */ + abstract protected function initialize(); + + /** + * Get the fully qualified class-name from the namespace alias. + * + * @param string $namespaceAlias + * @param string $simpleClassName + * @return string + */ + abstract protected function getFqcnFromAlias($namespaceAlias, $simpleClassName); + + /** + * Return the mapping driver implementation. + * + * @return MappingDriver + */ + abstract protected function getDriver(); + + /** + * Wakeup reflection after ClassMetadata gets unserialized from cache. + * + * @param ClassMetadata $class + * @param ReflectionService $reflService + * @return void + */ + abstract protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService); + + /** + * Initialize Reflection after ClassMetadata was constructed. + * + * @param ClassMetadata $class + * @param ReflectionSErvice $reflService + * @return void + */ + abstract protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService); + + /** + * Gets the class metadata descriptor for a class. + * + * @param string $className The name of the class. + * @return Doctrine\Common\Persistence\Mapping\ClassMetadata + */ + public function getMetadataFor($className) + { + if ( ! isset($this->loadedMetadata[$className])) { + $realClassName = $className; + + // Check for namespace alias + if (strpos($className, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $className); + $realClassName = $this->getFqcnFromAlias($namespaceAlias, $simpleClassName); + + if (isset($this->loadedMetadata[$realClassName])) { + // We do not have the alias name in the map, include it + $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; + + return $this->loadedMetadata[$realClassName]; + } + } + + if ($this->cacheDriver) { + if (($cached = $this->cacheDriver->fetch($realClassName . $this->cacheSalt)) !== false) { + $this->loadedMetadata[$realClassName] = $cached; + $this->wakeupReflection($cached, $this->getReflectionService()); + } else { + foreach ($this->loadMetadata($realClassName) as $loadedClassName) { + $this->cacheDriver->save( + $loadedClassName . $this->cacheSalt, $this->loadedMetadata[$loadedClassName], null + ); + } + } + } else { + $this->loadMetadata($realClassName); + } + + if ($className != $realClassName) { + // We do not have the alias name in the map, include it + $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; + } + } + + return $this->loadedMetadata[$className]; + } + + /** + * Checks whether the factory has the metadata for a class loaded already. + * + * @param string $className + * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. + */ + public function hasMetadataFor($className) + { + return isset($this->loadedMetadata[$className]); + } + + /** + * Sets the metadata descriptor for a specific class. + * + * NOTE: This is only useful in very special cases, like when generating proxy classes. + * + * @param string $className + * @param ClassMetadata $class + */ + public function setMetadataFor($className, $class) + { + $this->loadedMetadata[$className] = $class; + } + + /** + * Get array of parent classes for the given entity class + * + * @param string $name + * @return array $parentClasses + */ + protected function getParentClasses($name) + { + // Collect parent classes, ignoring transient (not-mapped) classes. + $parentClasses = array(); + foreach (array_reverse($this->getReflectionService()->getParentClasses($name)) as $parentClass) { + if ( ! $this->getDriver()->isTransient($parentClass)) { + $parentClasses[] = $parentClass; + } + } + return $parentClasses; + } + + /** + * Loads the metadata of the class in question and all it's ancestors whose metadata + * is still not loaded. + * + * @param string $name The name of the class for which the metadata should get loaded. + * @param array $tables The metadata collection to which the loaded metadata is added. + */ + protected function loadMetadata($name) + { + if ( ! $this->initialized) { + $this->initialize(); + } + + $loaded = array(); + + $parentClasses = $this->getParentClasses($name); + $parentClasses[] = $name; + + // Move down the hierarchy of parent classes, starting from the topmost class + $parent = null; + $rootEntityFound = false; + $visited = array(); + $reflService = $this->getReflectionService(); + foreach ($parentClasses as $className) { + if (isset($this->loadedMetadata[$className])) { + $parent = $this->loadedMetadata[$className]; + if (isset($parent->isMappedSuperclass) && $parent->isMappedSuperclass === false) { + $rootEntityFound = true; + array_unshift($visited, $className); + } + continue; + } + + $class = $this->newClassMetadataInstance($className); + $this->initializeReflection($class, $reflService); + + $this->doLoadMetadata($class, $parent, $rootEntityFound); + + $this->loadedMetadata[$className] = $class; + + $parent = $class; + + if (isset($parent->isMappedSuperclass) && $class->isMappedSuperclass === false) { + $rootEntityFound = true; + array_unshift($visited, $className); + } + + $this->wakeupReflection($class, $reflService); + + $loaded[] = $className; + } + + return $loaded; + } + + /** + * Actually load the metadata from the underlying metadata + * + * @param ClassMetadata $class + * @param ClassMetadata $parent + * @param bool $rootEntityFound + * @return void + */ + abstract protected function doLoadMetadata($class, $parent, $rootEntityFound); + + /** + * Creates a new ClassMetadata instance for the given class name. + * + * @param string $className + * @return ClassMetadata + */ + abstract protected function newClassMetadataInstance($className); + + /** + * Check if this class is mapped by this Object Manager + ClassMetadata configuration + * + * @param $class + * @return bool + */ + public function isTransient($class) + { + if ( ! $this->initialized) { + $this->initialize(); + } + + return $this->getDriver()->isTransient($class); + } + + /** + * Set reflectionService. + * + * @param ReflectionService $reflectionService + */ + public function setReflectionService(ReflectionService $reflectionService) + { + $this->reflectionService = $reflectionService; + } + + /** + * Get the reflection service associated with this metadata factory. + * + * @return ReflectionService + */ + public function getReflectionService() + { + if ($this->reflectionService === null) { + $this->reflectionService = new RuntimeReflectionService(); + } + return $this->reflectionService; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php new file mode 100644 index 00000000..705d59ac --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php @@ -0,0 +1,165 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ClassMetadata +{ + /** + * Get fully-qualified class name of this persistent class. + * + * @return string + */ + function getName(); + + /** + * Gets the mapped identifier field name. + * + * The returned structure is an array of the identifier field names. + * + * @return array + */ + function getIdentifier(); + + /** + * Gets the ReflectionClass instance for this mapped class. + * + * @return ReflectionClass + */ + function getReflectionClass(); + + /** + * Checks if the given field name is a mapped identifier for this class. + * + * @param string $fieldName + * @return boolean + */ + function isIdentifier($fieldName); + + /** + * Checks if the given field is a mapped property for this class. + * + * @param string $fieldName + * @return boolean + */ + function hasField($fieldName); + + /** + * Checks if the given field is a mapped association for this class. + * + * @param string $fieldName + * @return boolean + */ + function hasAssociation($fieldName); + + /** + * Checks if the given field is a mapped single valued association for this class. + * + * @param string $fieldName + * @return boolean + */ + function isSingleValuedAssociation($fieldName); + + /** + * Checks if the given field is a mapped collection valued association for this class. + * + * @param string $fieldName + * @return boolean + */ + function isCollectionValuedAssociation($fieldName); + + /** + * A numerically indexed list of field names of this persistent class. + * + * This array includes identifier fields if present on this class. + * + * @return array + */ + function getFieldNames(); + + /** + * Returns an array of identifier field names numerically indexed. + * + * @return array + */ + function getIdentifierFieldNames(); + + /** + * A numerically indexed list of association names of this persistent class. + * + * This array includes identifier associations if present on this class. + * + * @return array + */ + function getAssociationNames(); + + /** + * Returns a type name of this field. + * + * This type names can be implementation specific but should at least include the php types: + * integer, string, boolean, float/double, datetime. + * + * @param string $fieldName + * @return string + */ + function getTypeOfField($fieldName); + + /** + * Returns the target class name of the given association. + * + * @param string $assocName + * @return string + */ + function getAssociationTargetClass($assocName); + + /** + * Checks if the association is the inverse side of a bidirectional association + * + * @param string $assocName + * @return boolean + */ + function isAssociationInverseSide($assocName); + + /** + * Returns the target field of the owning side of the association + * + * @param string $assocName + * @return string + */ + function getAssociationMappedByTargetField($assocName); + + /** + * Return the identifier of this object as an array with field name as key. + * + * Has to return an empty array if no identifier isset. + * + * @param object $object + * @return array + */ + function getIdentifierValues($object); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php new file mode 100644 index 00000000..bf27ba9a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php @@ -0,0 +1,74 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ClassMetadataFactory +{ + /** + * Forces the factory to load the metadata of all classes known to the underlying + * mapping driver. + * + * @return array The ClassMetadata instances of all mapped classes. + */ + function getAllMetadata(); + + /** + * Gets the class metadata descriptor for a class. + * + * @param string $className The name of the class. + * @return ClassMetadata + */ + function getMetadataFor($className); + + /** + * Checks whether the factory has the metadata for a class loaded already. + * + * @param string $className + * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. + */ + function hasMetadataFor($className); + + /** + * Sets the metadata descriptor for a specific class. + * + * @param string $className + * @param ClassMetadata $class + */ + function setMetadataFor($className, $class); + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped directly or as a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + function isTransient($className); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php new file mode 100644 index 00000000..f52d37ee --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php @@ -0,0 +1,214 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Cache\ArrayCache, + Doctrine\Common\Annotations\AnnotationReader, + Doctrine\Common\Annotations\AnnotationRegistry, + Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The AnnotationDriver reads the mapping metadata from docblock annotations. + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +abstract class AnnotationDriver implements MappingDriver +{ + /** + * The AnnotationReader. + * + * @var AnnotationReader + */ + protected $reader; + + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * The file extension of mapping documents. + * + * @var string + */ + protected $fileExtension = '.php'; + + /** + * Cache for AnnotationDriver#getAllClassNames() + * + * @var array + */ + protected $classNames; + + /** + * Name of the entity annotations as keys + * + * @var array + */ + protected $entityAnnotationClasses = array(); + + /** + * Initializes a new AnnotationDriver that uses the given AnnotationReader for reading + * docblock annotations. + * + * @param AnnotationReader $reader The AnnotationReader to use, duck-typed. + * @param string|array $paths One or multiple paths where mapping classes can be found. + */ + public function __construct($reader, $paths = null) + { + $this->reader = $reader; + if ($paths) { + $this->addPaths((array) $paths); + } + } + + /** + * Append lookup paths to metadata driver. + * + * @param array $paths + */ + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * Retrieve the defined metadata lookup paths. + * + * @return array + */ + public function getPaths() + { + return $this->paths; + } + + /** + * Retrieve the current annotation reader + * + * @return AnnotationReader + */ + public function getReader() + { + return $this->reader; + } + + /** + * Get the file extension used to look for mapping files under + * + * @return void + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * Whether the class with the specified name is transient. Only non-transient + * classes, that is entities and mapped superclasses, should have their metadata loaded. + * + * A class is non-transient if it is annotated with an annotation + * from the {@see AnnotationDriver::entityAnnotationClasses}. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + $classAnnotations = $this->reader->getClassAnnotations(new \ReflectionClass($className)); + + foreach ($classAnnotations as $annot) { + if (isset($this->entityAnnotationClasses[get_class($annot)])) { + return false; + } + } + return true; + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames() + { + if ($this->classNames !== null) { + return $this->classNames; + } + + if (!$this->paths) { + throw MappingException::pathRequired(); + } + + $classes = array(); + $includedFiles = array(); + + foreach ($this->paths as $path) { + if ( ! is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RegexIterator( + new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS), + \RecursiveIteratorIterator::LEAVES_ONLY + ), + '/^.+' . str_replace('.', '\.', $this->fileExtension) . '$/i', + \RecursiveRegexIterator::GET_MATCH + ); + + foreach ($iterator as $file) { + $sourceFile = realpath($file[0]); + + require_once $sourceFile; + + $includedFiles[] = $sourceFile; + } + } + + $declared = get_declared_classes(); + + foreach ($declared as $className) { + $rc = new \ReflectionClass($className); + $sourceFile = $rc->getFileName(); + if (in_array($sourceFile, $includedFiles) && ! $this->isTransient($className)) { + $classes[] = $className; + } + } + + $this->classNames = $classes; + + return $classes; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php new file mode 100644 index 00000000..efaf545e --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php @@ -0,0 +1,169 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * Locate the file that contains the metadata information for a given class name. + * + * This behavior is inpependent of the actual content of the file. It just detects + * the file which is responsible for the given class name. + * + * @author Benjamin Eberlei + * @author Johannes M. Schmitt + */ +class DefaultFileLocator implements FileLocator +{ + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * The file extension of mapping documents. + * + * @var string + */ + protected $fileExtension; + + /** + * Initializes a new FileDriver that looks in the given path(s) for mapping + * documents and operates in the specified operating mode. + * + * @param string|array $paths One or multiple paths where mapping documents can be found. + */ + public function __construct($paths, $fileExtension = null) + { + $this->addPaths((array) $paths); + $this->fileExtension = $fileExtension; + } + + /** + * Append lookup paths to metadata driver. + * + * @param array $paths + */ + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * Retrieve the defined metadata lookup paths. + * + * @return array + */ + public function getPaths() + { + return $this->paths; + } + + /** + * Get the file extension used to look for mapping files under + * + * @return void + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * {@inheritDoc} + */ + public function findMappingFile($className) + { + $fileName = str_replace('\\', '.', $className) . $this->fileExtension; + + // Check whether file exists + foreach ($this->paths as $path) { + if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { + return $path . DIRECTORY_SEPARATOR . $fileName; + } + } + + throw MappingException::mappingFileNotFound($className, $fileName); + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames($globalBasename) + { + $classes = array(); + + if ($this->paths) { + foreach ($this->paths as $path) { + if ( ! is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + $fileName = $file->getBasename($this->fileExtension); + + if ($fileName == $file->getBasename() || $fileName == $globalBasename) { + continue; + } + + // NOTE: All files found here means classes are not transient! + $classes[] = str_replace('.', '\\', $fileName); + } + } + } + + return $classes; + } + + /** + * {@inheritDoc} + */ + public function fileExists($className) + { + $fileName = str_replace('\\', '.', $className) . $this->fileExtension; + + // Check whether file exists + foreach ((array) $this->paths as $path) { + if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php new file mode 100644 index 00000000..22cf117d --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php @@ -0,0 +1,178 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * Base driver for file-based metadata drivers. + * + * A file driver operates in a mode where it loads the mapping files of individual + * classes on demand. This requires the user to adhere to the convention of 1 mapping + * file per class and the file names of the mapping files must correspond to the full + * class name, including namespace, with the namespace delimiters '\', replaced by dots '.'. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.com + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +abstract class FileDriver implements MappingDriver +{ + /** + * @var FileLocator + */ + protected $locator; + + /** + * @var array + */ + protected $classCache; + + /** + * @var string + */ + protected $globalBasename; + + /** + * Initializes a new FileDriver that looks in the given path(s) for mapping + * documents and operates in the specified operating mode. + * + * @param string|array|FileLocator $paths A FileLocator or one/multiple paths where mapping documents can be found. + * @param string $fileExtension + */ + public function __construct($locator, $fileExtension = null) + { + if ($locator instanceof FileLocator) { + $this->locator = $locator; + } else { + $this->locator = new DefaultFileLocator((array)$locator, $fileExtension); + } + } + + public function setGlobalBasename($file) + { + $this->globalBasename = $file; + } + + public function getGlobalBasename() + { + return $this->globalBasename; + } + + /** + * Get the element of schema meta data for the class from the mapping file. + * This will lazily load the mapping file if it is not loaded yet + * + * @return array $element The element of schema meta data + */ + public function getElement($className) + { + if ($this->classCache === null) { + $this->initialize(); + } + + if (isset($this->classCache[$className])) { + return $this->classCache[$className]; + } + + $result = $this->loadMappingFile($this->locator->findMappingFile($className)); + + return $result[$className]; + } + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped as an Entity or a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + if ($this->classCache === null) { + $this->initialize(); + } + + if (isset($this->classCache[$className])) { + return false; + } + + return !$this->locator->fileExists($className); + } + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + public function getAllClassNames() + { + if ($this->classCache === null) { + $this->initialize(); + } + + $classNames = (array)$this->locator->getAllClassNames($this->globalBasename); + if ($this->classCache) { + $classNames = array_merge(array_keys($this->classCache), $classNames); + } + return $classNames; + } + + /** + * Loads a mapping file with the given name and returns a map + * from class/entity names to their corresponding file driver elements. + * + * @param string $file The mapping file to load. + * @return array + */ + abstract protected function loadMappingFile($file); + + /** + * Initialize the class cache from all the global files. + * + * Using this feature adds a substantial performance hit to file drivers as + * more metadata has to be loaded into memory than might actually be + * necessary. This may not be relevant to scenarios where caching of + * metadata is in place, however hits very hard in scenarios where no + * caching is used. + * + * @return void + */ + protected function initialize() + { + $this->classCache = array(); + if (null !== $this->globalBasename) { + foreach ($this->locator->getPaths() as $path) { + $file = $path.'/'.$this->globalBasename.$this->locator->getFileExtension(); + if (is_file($file)) { + $this->classCache = array_merge( + $this->classCache, + $this->loadMappingFile($file) + ); + } + } + } + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php new file mode 100644 index 00000000..a1019d71 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php @@ -0,0 +1,69 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +/** + * Locate the file that contains the metadata information for a given class name. + * + * This behavior is inpependent of the actual content of the file. It just detects + * the file which is responsible for the given class name. + * + * @author Benjamin Eberlei + * @author Johannes M. Schmitt + */ +interface FileLocator +{ + /** + * Locate mapping file for the given class name. + * + * @param string $className + * @return string + */ + function findMappingFile($className); + + /** + * Get all class names that are found with this file locator. + * + * @param string $globalBasename Passed to allow excluding the basename + * @return array + */ + function getAllClassNames($globalBasename); + + /** + * Check if a file can be found for this class name. + * + * @return bool + */ + function fileExists($className); + + /** + * Get all the paths that this file locator looks for mapping files. + * + * @return array + */ + function getPaths(); + + /** + * Get the file extension that mapping files are suffixed with. + * + * @return string + */ + function getFileExtension(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php new file mode 100644 index 00000000..c050d323 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php @@ -0,0 +1,56 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Contract for metadata drivers. + * + * @since 2.2 + * @author Jonathan H. Wage + */ +interface MappingDriver +{ + /** + * Loads the metadata for the specified class into the provided container. + * + * @param string $className + * @param ClassMetadata $metadata + */ + function loadMetadataForClass($className, ClassMetadata $metadata); + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + function getAllClassNames(); + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped as an Entity or a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + function isTransient($className); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php new file mode 100644 index 00000000..c7c14527 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php @@ -0,0 +1,125 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\Driver\MappingDriver, + Doctrine\Common\Persistence\Mapping\ClassMetadata, + Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The DriverChain allows you to add multiple other mapping drivers for + * certain namespaces + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class MappingDriverChain implements MappingDriver +{ + /** + * @var array + */ + private $drivers = array(); + + /** + * Add a nested driver. + * + * @param Driver $nestedDriver + * @param string $namespace + */ + public function addDriver(MappingDriver $nestedDriver, $namespace) + { + $this->drivers[$namespace] = $nestedDriver; + } + + /** + * Get the array of nested drivers. + * + * @return array $drivers + */ + public function getDrivers() + { + return $this->drivers; + } + + /** + * Loads the metadata for the specified class into the provided container. + * + * @param string $className + * @param ClassMetadataInfo $metadata + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + foreach ($this->drivers as $namespace => $driver) { + if (strpos($className, $namespace) === 0) { + $driver->loadMetadataForClass($className, $metadata); + return; + } + } + + throw MappingException::classNotFoundInNamespaces($className, array_keys($this->drivers)); + } + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + public function getAllClassNames() + { + $classNames = array(); + $driverClasses = array(); + foreach ($this->drivers AS $namespace => $driver) { + $oid = spl_object_hash($driver); + if (!isset($driverClasses[$oid])) { + $driverClasses[$oid] = $driver->getAllClassNames(); + } + + foreach ($driverClasses[$oid] AS $className) { + if (strpos($className, $namespace) === 0) { + $classNames[$className] = true; + } + } + } + return array_keys($classNames); + } + + /** + * Whether the class with the specified name should have its metadata loaded. + * + * This is only the case for non-transient classes either mapped as an Entity or MappedSuperclass. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + foreach ($this->drivers AS $namespace => $driver) { + if (strpos($className, $namespace) === 0) { + return $driver->isTransient($className); + } + } + + // class isTransient, i.e. not an entity or mapped superclass + return true; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php new file mode 100644 index 00000000..7751dae3 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * The PHPDriver includes php files which just populate ClassMetadataInfo + * instances with plain php code + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class PHPDriver extends FileDriver +{ + /** + * {@inheritdoc} + */ + protected $metadata; + + /** + * {@inheritDoc} + */ + public function __construct($locator, $fileExtension = null) + { + $fileExtension = ".php"; + parent::__construct($locator, $fileExtension); + } + + /** + * {@inheritdoc} + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + $this->metadata = $metadata; + $this->loadMappingFile($this->locator->findMappingFile($className)); + } + + /** + * {@inheritdoc} + */ + protected function loadMappingFile($file) + { + $metadata = $this->metadata; + include $file; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php new file mode 100644 index 00000000..9103ed86 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php @@ -0,0 +1,131 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The StaticPHPDriver calls a static loadMetadata() method on your entity + * classes where you can manually populate the ClassMetadata instance. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class StaticPHPDriver implements MappingDriver +{ + /** + * Paths of entity directories. + * + * @var array + */ + private $paths = array(); + + /** + * Map of all class names. + * + * @var array + */ + private $classNames; + + public function __construct($paths) + { + $this->addPaths((array) $paths); + } + + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * {@inheritdoc} + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + $className::loadMetadata($metadata); + } + + /** + * {@inheritDoc} + * @todo Same code exists in AnnotationDriver, should we re-use it somehow or not worry about it? + */ + public function getAllClassNames() + { + if ($this->classNames !== null) { + return $this->classNames; + } + + if (!$this->paths) { + throw MappingException::pathRequired(); + } + + $classes = array(); + $includedFiles = array(); + + foreach ($this->paths as $path) { + if (!is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + if ($file->getBasename('.php') == $file->getBasename()) { + continue; + } + + $sourceFile = realpath($file->getPathName()); + require_once $sourceFile; + $includedFiles[] = $sourceFile; + } + } + + $declared = get_declared_classes(); + + foreach ($declared as $className) { + $rc = new \ReflectionClass($className); + $sourceFile = $rc->getFileName(); + if (in_array($sourceFile, $includedFiles) && !$this->isTransient($className)) { + $classes[] = $className; + } + } + + $this->classNames = $classes; + + return $classes; + } + + /** + * {@inheritdoc} + */ + public function isTransient($className) + { + return ! method_exists($className, 'loadMetadata'); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php new file mode 100644 index 00000000..d338cf60 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php @@ -0,0 +1,198 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The Symfony File Locator makes a simplifying assumptions compared + * to the DefaultFileLocator. By assuming paths only contain entities of a certain + * namespace the mapping files consists of the short classname only. + * + * @author Fabien Potencier + * @author Benjamin Eberlei + * @license MIT + */ +class SymfonyFileLocator implements FileLocator +{ + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * A map of mapping directory path to namespace prefix used to expand class shortnames. + * + * @var array + */ + protected $prefixes = array(); + + /** + * File extension that is searched for. + * + * @var string + */ + protected $fileExtension; + + public function __construct(array $prefixes, $fileExtension = null) + { + $this->addNamespacePrefixes($prefixes); + $this->fileExtension = $fileExtension; + } + + public function addNamespacePrefixes(array $prefixes) + { + $this->prefixes = array_merge($this->prefixes, $prefixes); + $this->paths = array_merge($this->paths, array_keys($prefixes)); + } + + public function getNamespacePrefixes() + { + return $this->prefixes; + } + + /** + * {@inheritDoc} + */ + public function getPaths() + { + return $this->paths; + } + + /** + * {@inheritDoc} + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * {@inheritDoc} + */ + public function fileExists($className) + { + $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; + foreach ($this->paths as $path) { + if (!isset($this->prefixes[$path])) { + // global namespace class + if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { + return true; + } + + continue; + } + + $prefix = $this->prefixes[$path]; + + if (0 !== strpos($className, $prefix.'\\')) { + continue; + } + + $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; + return is_file($filename); + } + + return false; + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames($globalBasename = null) + { + $classes = array(); + + if ($this->paths) { + foreach ((array) $this->paths as $path) { + if (!is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + $fileName = $file->getBasename($this->fileExtension); + + if ($fileName == $file->getBasename() || $fileName == $globalBasename) { + continue; + } + + // NOTE: All files found here means classes are not transient! + if (isset($this->prefixes[$path])) { + $classes[] = $this->prefixes[$path].'\\'.str_replace('.', '\\', $fileName); + } else { + $classes[] = str_replace('.', '\\', $fileName); + } + } + } + } + + return $classes; + } + + /** + * {@inheritDoc} + */ + public function findMappingFile($className) + { + $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; + foreach ($this->paths as $path) { + if (!isset($this->prefixes[$path])) { + if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { + return $path.DIRECTORY_SEPARATOR.$defaultFileName; + } + + continue; + } + + $prefix = $this->prefixes[$path]; + + if (0 !== strpos($className, $prefix.'\\')) { + continue; + } + + $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; + if (is_file($filename)) { + return $filename; + } + + throw MappingException::mappingFileNotFound($className, $filename); + } + + throw MappingException::mappingFileNotFound($className, substr($className, strrpos($className, '\\') + 1).$this->fileExtension); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php new file mode 100644 index 00000000..4ecd2ad5 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php @@ -0,0 +1,57 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * A MappingException indicates that something is wrong with the mapping setup. + * + * @since 2.2 + */ +class MappingException extends \Exception +{ + public static function classNotFoundInNamespaces($className, $namespaces) + { + return new self("The class '" . $className . "' was not found in the ". + "chain configured namespaces " . implode(", ", $namespaces)); + } + + public static function pathRequired() + { + return new self("Specifying the paths to your entities is required ". + "in the AnnotationDriver to retrieve all class names."); + } + + public static function fileMappingDriversRequireConfiguredDirectoryPath($path = null) + { + if ( ! empty($path)) { + $path = '[' . $path . ']'; + } + + return new self( + 'File mapping drivers must have a valid directory path, ' . + 'however the given path ' . $path . ' seems to be incorrect!' + ); + } + + public static function mappingFileNotFound($entityName, $fileName) + { + return new self("No mapping file found named '$fileName' for class '$entityName'."); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php new file mode 100644 index 00000000..4e0e312f --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php @@ -0,0 +1,80 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Very simple reflection service abstraction. + * + * This is required inside metadata layers that may require either + * static or runtime reflection. + * + * @author Benjamin Eberlei + */ +interface ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + function getParentClasses($class); + + /** + * Return the shortname of a class. + * + * @param string $class + * @return string + */ + function getClassShortName($class); + + /** + * @param string $class + * @return string + */ + function getClassNamespace($class); + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + function getClass($class); + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + function getAccessibleProperty($class, $property); + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + function hasPublicMethod($class, $method); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php new file mode 100644 index 00000000..abcff581 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php @@ -0,0 +1,102 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use ReflectionClass; +use ReflectionProperty; + +/** + * PHP Runtime Reflection Service + * + * @author Benjamin Eberlei + */ +class RuntimeReflectionService implements ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + public function getParentClasses($class) + { + return class_parents($class); + } + + /** + * Return the shortname of a class. + * + * @param string $class + * @return string + */ + public function getClassShortName($class) + { + $r = new ReflectionClass($class); + return $r->getShortName(); + } + + /** + * @param string $class + * @return string + */ + public function getClassNamespace($class) + { + $r = new ReflectionClass($class); + return $r->getNamespaceName(); + } + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + public function getClass($class) + { + return new ReflectionClass($class); + } + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + public function getAccessibleProperty($class, $property) + { + $property = new ReflectionProperty($class, $property); + $property->setAccessible(true); + return $property; + } + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + public function hasPublicMethod($class, $method) + { + return method_exists($class, $method) && is_callable(array($class, $method)); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php new file mode 100644 index 00000000..2de6e761 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php @@ -0,0 +1,107 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use ReflectionClass; +use ReflectionProperty; + +/** + * PHP Runtime Reflection Service + * + * @author Benjamin Eberlei + */ +class StaticReflectionService implements ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + public function getParentClasses($class) + { + return array(); + } + + /** + * Return the shortname of a class. + * + * @param string $className + * @return string + */ + public function getClassShortName($className) + { + if (strpos($className, '\\') !== false) { + $className = substr($className, strrpos($className, "\\")+1); + } + return $className; + } + + /** + * Return the namespace of a class. + * + * @param string $className + * @return string + */ + public function getClassNamespace($className) + { + $namespace = ''; + if (strpos($className, '\\') !== false) { + $namespace = strrev(substr( strrev($className), strpos(strrev($className), '\\')+1 )); + } + return $namespace; + } + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + public function getClass($class) + { + return null; + } + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + public function getAccessibleProperty($class, $property) + { + return null; + } + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + public function hasPublicMethod($class, $method) + { + return method_exists($class, $method) && is_callable(array($class, $method)); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php new file mode 100644 index 00000000..6d70fc12 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php @@ -0,0 +1,143 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract for a Doctrine persistence layer ObjectManager class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ObjectManager +{ + /** + * Finds a object by its identifier. + * + * This is just a convenient shortcut for getRepository($className)->find($id). + * + * @param string + * @param mixed + * @return object + */ + function find($className, $id); + + /** + * Tells the ObjectManager to make an instance managed and persistent. + * + * The object will be entered into the database as a result of the flush operation. + * + * NOTE: The persist operation always considers objects that are not yet known to + * this ObjectManager as NEW. Do not pass detached objects to the persist operation. + * + * @param object $object The instance to make managed and persistent. + */ + function persist($object); + + /** + * Removes an object instance. + * + * A removed object will be removed from the database as a result of the flush operation. + * + * @param object $object The object instance to remove. + */ + function remove($object); + + /** + * Merges the state of a detached object into the persistence context + * of this ObjectManager and returns the managed copy of the object. + * The object passed to merge will not become associated/managed with this ObjectManager. + * + * @param object $object + */ + function merge($object); + + /** + * Detaches an object from the ObjectManager, causing a managed object to + * become detached. Unflushed changes made to the object if any + * (including removal of the object), will not be synchronized to the database. + * Objects which previously referenced the detached object will continue to + * reference it. + * + * @param object $object The object to detach. + */ + function detach($object); + + /** + * Refreshes the persistent state of an object from the database, + * overriding any local changes that have not yet been persisted. + * + * @param object $object The object to refresh. + */ + function refresh($object); + + /** + * Flushes all changes to objects that have been queued up to now to the database. + * This effectively synchronizes the in-memory state of managed objects with the + * database. + */ + function flush(); + + /** + * Gets the repository for a class. + * + * @param string $className + * @return \Doctrine\Common\Persistence\ObjectRepository + */ + function getRepository($className); + + /** + * Returns the ClassMetadata descriptor for a class. + * + * The class name must be the fully-qualified class name without a leading backslash + * (as it is returned by get_class($obj)). + * + * @param string $className + * @return \Doctrine\Common\Persistence\Mapping\ClassMetadata + */ + function getClassMetadata($className); + + /** + * Gets the metadata factory used to gather the metadata of classes. + * + * @return Doctrine\Common\Persistence\Mapping\ClassMetadataFactory + */ + function getMetadataFactory(); + + /** + * Helper method to initialize a lazy loading proxy or persistent collection. + * + * This method is a no-op for other objects. + * + * @param object $obj + */ + function initializeObject($obj); + + /** + * Check if the object is part of the current UnitOfWork and therefore + * managed. + * + * @param object $object + * @return bool + */ + function contains($object); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php new file mode 100644 index 00000000..015dd3dd --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php @@ -0,0 +1,49 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Makes a Persistent Objects aware of its own object-manager. + * + * Using this interface the managing object manager and class metadata instances + * are injected into the persistent object after construction. This allows + * you to implement ActiveRecord functionality on top of the persistance-ignorance + * that Doctrine propagates. + * + * Word of Warning: This is a very powerful hook to change how you can work with your domain models. + * Using this hook will break the Single Responsibility Principle inside your Domain Objects + * and increase the coupling of database and objects. + * + * Every ObjectManager has to implement this functionality itself. + * + * @author Benjamin Eberlei + */ +interface ObjectManagerAware +{ + /** + * Injects responsible ObjectManager and the ClassMetadata into this persistent object. + * + * @param ObjectManager $objectManager + * @param ClassMetadata $classMetadata + */ + public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php new file mode 100644 index 00000000..22633288 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php @@ -0,0 +1,78 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract for a Doctrine persistence layer ObjectRepository class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ObjectRepository +{ + /** + * Finds an object by its primary key / identifier. + * + * @param $id The identifier. + * @return object The object. + */ + function find($id); + + /** + * Finds all objects in the repository. + * + * @return mixed The objects. + */ + function findAll(); + + /** + * Finds objects by a set of criteria. + * + * Optionally sorting and limiting details can be passed. An implementation may throw + * an UnexpectedValueException if certain values of the sorting or limiting details are + * not supported. + * + * @throws UnexpectedValueException + * @param array $criteria + * @param array|null $orderBy + * @param int|null $limit + * @param int|null $offset + * @return mixed The objects. + */ + function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null); + + /** + * Finds a single object by a set of criteria. + * + * @param array $criteria + * @return object The object. + */ + function findOneBy(array $criteria); + + /** + * Returns the class name of the object managed by the repository + * + * @return string + */ + function getClassName(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php new file mode 100644 index 00000000..4274af62 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php @@ -0,0 +1,233 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; + +/** + * PersistentObject base class that implements getter/setter methods for all mapped fields and associations + * by overriding __call. + * + * This class is a forward compatible implementation of the PersistentObject trait. + * + * + * Limitations: + * + * 1. All persistent objects have to be associated with a single ObjectManager, multiple + * ObjectManagers are not supported. You can set the ObjectManager with `PersistentObject#setObjectManager()`. + * 2. Setters and getters only work if a ClassMetadata instance was injected into the PersistentObject. + * This is either done on `postLoad` of an object or by accessing the global object manager. + * 3. There are no hooks for setters/getters. Just implement the method yourself instead of relying on __call(). + * 4. Slower than handcoded implementations: An average of 7 method calls per access to a field and 11 for an association. + * 5. Only the inverse side associations get autoset on the owning side aswell. Setting objects on the owning side + * will not set the inverse side associations. + * + * @example + * + * PersistentObject::setObjectManager($em); + * + * class Foo extends PersistentObject + * { + * private $id; + * } + * + * $foo = new Foo(); + * $foo->getId(); // method exists through __call + * + * @author Benjamin Eberlei + */ +abstract class PersistentObject implements ObjectManagerAware +{ + /** + * @var ObjectManager + */ + private static $objectManager; + + /** + * @var ClassMetadata + */ + private $cm; + + /** + * Set the object manager responsible for all persistent object base classes. + * + * @param ObjectManager $objectManager + */ + static public function setObjectManager(ObjectManager $objectManager = null) + { + self::$objectManager = $objectManager; + } + + /** + * @return ObjectManager + */ + static public function getObjectManager() + { + return self::$objectManager; + } + + /** + * Inject Doctrine Object Manager + * + * @param ObjectManager $objectManager + * @param ClassMetadata $classMetadata + */ + public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata) + { + if ($objectManager !== self::$objectManager) { + throw new \RuntimeException("Trying to use PersistentObject with different ObjectManager instances. " . + "Was PersistentObject::setObjectManager() called?"); + } + + $this->cm = $classMetadata; + } + + /** + * Sets a persistent fields value. + * + * @throws InvalidArgumentException - When the wrong target object type is passed to an association + * @throws BadMethodCallException - When no persistent field exists by that name. + * @param string $field + * @param array $args + * @return void + */ + private function set($field, $args) + { + $this->initializeDoctrine(); + + if ($this->cm->hasField($field) && !$this->cm->isIdentifier($field)) { + $this->$field = $args[0]; + } else if ($this->cm->hasAssociation($field) && $this->cm->isSingleValuedAssociation($field)) { + $targetClass = $this->cm->getAssociationTargetClass($field); + if (!($args[0] instanceof $targetClass) && $args[0] !== null) { + throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); + } + $this->$field = $args[0]; + $this->completeOwningSide($field, $targetClass, $args[0]); + } else { + throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); + } + } + + /** + * Get persistent field value. + * + * @throws BadMethodCallException - When no persistent field exists by that name. + * @param string $field + * @return mixed + */ + private function get($field) + { + $this->initializeDoctrine(); + + if ( $this->cm->hasField($field) || $this->cm->hasAssociation($field) ) { + return $this->$field; + } else { + throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); + } + } + + /** + * If this is an inverse side association complete the owning side. + * + * @param string $field + * @param ClassMetadata $targetClass + * @param object $targetObject + */ + private function completeOwningSide($field, $targetClass, $targetObject) + { + // add this object on the owning side aswell, for obvious infinite recursion + // reasons this is only done when called on the inverse side. + if ($this->cm->isAssociationInverseSide($field)) { + $mappedByField = $this->cm->getAssociationMappedByTargetField($field); + $targetMetadata = self::$objectManager->getClassMetadata($targetClass); + + $setter = ($targetMetadata->isCollectionValuedAssociation($mappedByField) ? "add" : "set").$mappedByField; + $targetObject->$setter($this); + } + } + + /** + * Add an object to a collection + * + * @param type $field + * @param assoc $args + */ + private function add($field, $args) + { + $this->initializeDoctrine(); + + if ($this->cm->hasAssociation($field) && $this->cm->isCollectionValuedAssociation($field)) { + $targetClass = $this->cm->getAssociationTargetClass($field); + if (!($args[0] instanceof $targetClass)) { + throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); + } + if (!($this->$field instanceof Collection)) { + $this->$field = new ArrayCollection($this->$field ?: array()); + } + $this->$field->add($args[0]); + $this->completeOwningSide($field, $targetClass, $args[0]); + } else { + throw new \BadMethodCallException("There is no method add".$field."() on ".$this->cm->getName()); + } + } + + /** + * Initialize Doctrine Metadata for this class. + * + * @return void + */ + private function initializeDoctrine() + { + if ($this->cm !== null) { + return; + } + + if (!self::$objectManager) { + throw new \RuntimeException("No runtime object manager set. Call PersistentObject#setObjectManager()."); + } + + $this->cm = self::$objectManager->getClassMetadata(get_class($this)); + } + + /** + * Magic method that implements + * + * @param string $method + * @param array $args + * @return mixed + */ + public function __call($method, $args) + { + $command = substr($method, 0, 3); + $field = lcfirst(substr($method, 3)); + if ($command == "set") { + $this->set($field, $args); + } else if ($command == "get") { + return $this->get($field); + } else if ($command == "add") { + $this->add($field, $args); + } else { + throw new \BadMethodCallException("There is no method ".$method." on ".$this->cm->getName()); + } + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php new file mode 100644 index 00000000..726979fc --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php @@ -0,0 +1,60 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Interface for proxy classes. + * + * @author Roman Borschel + * @since 2.2 + */ +interface Proxy +{ + /** + * Marker for Proxy class names. + * + * @var string + */ + const MARKER = '__CG__'; + + /** + * Length of the proxy marker + * + * @var int + */ + const MARKER_LENGTH = 6; + + /** + * Initialize this proxy if its not yet initialized. + * + * Acts as a no-op if already initialized. + * + * @return void + */ + public function __load(); + + /** + * Is this proxy initialized or not. + * + * @return bool + */ + public function __isInitialized(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php b/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php new file mode 100644 index 00000000..87c5b413 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php @@ -0,0 +1,48 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Contract for classes that are potential listeners of a NotifyPropertyChanged + * implementor. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface PropertyChangedListener +{ + /** + * Notifies the listener of a property change. + * + * @param object $sender The object on which the property changed. + * @param string $propertyName The name of the property that changed. + * @param mixed $oldValue The old value of the property that changed. + * @param mixed $newValue The new value of the property that changed. + */ + function propertyChanged($sender, $propertyName, $oldValue, $newValue); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php new file mode 100644 index 00000000..c3462782 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php @@ -0,0 +1,103 @@ +. + */ + +namespace Doctrine\Common\Util; + +use Doctrine\Common\Persistence\Proxy; + +/** + * Class and reflection related functionality for objects that + * might or not be proxy objects at the moment. + * + * @author Benjamin Eberlei + * @author Johannes Schmitt + */ +class ClassUtils +{ + /** + * Get the real class name of a class name that could be a proxy. + * + * @param string + * @return string + */ + public static function getRealClass($class) + { + if (false === $pos = strrpos($class, '\\'.Proxy::MARKER.'\\')) { + return $class; + } + + return substr($class, $pos + Proxy::MARKER_LENGTH + 2); + } + + /** + * Get the real class name of an object (even if its a proxy) + * + * @param object + * @return string + */ + public static function getClass($object) + { + return self::getRealClass(get_class($object)); + } + + /** + * Get the real parent class name of a class or object + * + * @param string + * @return string + */ + public static function getParentClass($className) + { + return get_parent_class( self::getRealClass( $className ) ); + } + + /** + * Create a new reflection class + * + * @param string + * @return ReflectionClass + */ + public static function newReflectionClass($class) + { + return new \ReflectionClass( self::getRealClass( $class ) ); + } + + /** + * Create a new reflection object + * + * @param object + * @return ReflectionObject + */ + public static function newReflectionObject($object) + { + return self::newReflectionClass( self::getClass( $object ) ); + } + + /** + * Given a class name and a proxy namespace return the proxy name. + * + * @param string $className + * @param string $proxyNamespace + * @return string + */ + public static function generateProxyClassName($className, $proxyNamespace) + { + return rtrim($proxyNamespace, '\\') . '\\'.Proxy::MARKER.'\\' . ltrim($className, '\\'); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php new file mode 100644 index 00000000..57ae3120 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php @@ -0,0 +1,123 @@ +. + */ + +namespace Doctrine\Common\Util; + +/** + * Static class containing most used debug methods. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Giorgio Sironi + */ +final class Debug +{ + /** + * Private constructor (prevents from instantiation) + * + */ + private function __construct() {} + + /** + * Prints a dump of the public, protected and private properties of $var. + * + * @static + * @link http://xdebug.org/ + * @param mixed $var + * @param integer $maxDepth Maximum nesting level for object properties + * @param boolean $stripTags Flag that indicate if output should strip HTML tags + */ + public static function dump($var, $maxDepth = 2, $stripTags = true) + { + ini_set('html_errors', 'On'); + + if (extension_loaded('xdebug')) { + ini_set('xdebug.var_display_max_depth', $maxDepth); + } + + $var = self::export($var, $maxDepth++); + + ob_start(); + var_dump($var); + $dump = ob_get_contents(); + ob_end_clean(); + + echo ($stripTags ? strip_tags(html_entity_decode($dump)) : $dump); + + ini_set('html_errors', 'Off'); + } + + public static function export($var, $maxDepth) + { + $return = null; + $isObj = is_object($var); + + if ($isObj && in_array('Doctrine\Common\Collections\Collection', class_implements($var))) { + $var = $var->toArray(); + } + + if ($maxDepth) { + if (is_array($var)) { + $return = array(); + + foreach ($var as $k => $v) { + $return[$k] = self::export($v, $maxDepth - 1); + } + } else if ($isObj) { + $return = new \stdclass(); + if ($var instanceof \DateTime) { + $return->__CLASS__ = "DateTime"; + $return->date = $var->format('c'); + $return->timezone = $var->getTimeZone()->getName(); + } else { + $reflClass = ClassUtils::newReflectionObject($var); + $return->__CLASS__ = ClassUtils::getClass($var); + + if ($var instanceof \Doctrine\Common\Persistence\Proxy) { + $return->__IS_PROXY__ = true; + $return->__PROXY_INITIALIZED__ = $var->__isInitialized(); + } + + foreach ($reflClass->getProperties() as $reflProperty) { + $name = $reflProperty->getName(); + + $reflProperty->setAccessible(true); + $return->$name = self::export($reflProperty->getValue($var), $maxDepth - 1); + } + } + } else { + $return = $var; + } + } else { + $return = is_object($var) ? get_class($var) + : (is_array($var) ? 'Array(' . count($var) . ')' : $var); + } + + return $return; + } + + public static function toString($obj) + { + return method_exists('__toString', $obj) ? (string) $obj : get_class($obj) . '@' . spl_object_hash($obj); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php new file mode 100644 index 00000000..ba1eb17b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php @@ -0,0 +1,72 @@ +. + */ + +namespace Doctrine\Common\Util; + +/** + * Doctrine inflector has static methods for inflecting text + * + * The methods in these classes are from several different sources collected + * across several different php projects and several different authors. The + * original author names and emails are not known + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 1.0 + * @version $Revision: 3189 $ + * @author Konsta Vesterinen + * @author Jonathan H. Wage + */ +class Inflector +{ + /** + * Convert word in to the format for a Doctrine table name. Converts 'ModelName' to 'model_name' + * + * @param string $word Word to tableize + * @return string $word Tableized word + */ + public static function tableize($word) + { + return strtolower(preg_replace('~(?<=\\w)([A-Z])~', '_$1', $word)); + } + + /** + * Convert a word in to the format for a Doctrine class name. Converts 'table_name' to 'TableName' + * + * @param string $word Word to classify + * @return string $word Classified word + */ + public static function classify($word) + { + return str_replace(" ", "", ucwords(strtr($word, "_-", " "))); + } + + /** + * Camelize a word. This uses the classify() method and turns the first character to lowercase + * + * @param string $word + * @return string $word + */ + public static function camelize($word) + { + return lcfirst(self::classify($word)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Version.php b/vendor/doctrine/common/lib/Doctrine/Common/Version.php new file mode 100644 index 00000000..7a87311f --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Version.php @@ -0,0 +1,55 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Class to store and retrieve the version of Doctrine + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class Version +{ + /** + * Current Doctrine Version + */ + const VERSION = '2.2.3'; + + /** + * Compares a Doctrine version with the current one. + * + * @param string $version Doctrine version to compare. + * @return int Returns -1 if older, 0 if it is the same, 1 if version + * passed as argument is newer. + */ + public static function compare($version) + { + $currentVersion = str_replace(' ', '', strtolower(self::VERSION)); + $version = str_replace(' ', '', $version); + + return version_compare($version, $currentVersion); + } +} diff --git a/vendor/doctrine/common/phpunit.xml.dist b/vendor/doctrine/common/phpunit.xml.dist new file mode 100644 index 00000000..b9d3b340 --- /dev/null +++ b/vendor/doctrine/common/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + ./tests/Doctrine/ + + + + + + ./lib/Doctrine/ + + + + + + performance + + + diff --git a/vendor/doctrine/common/tests/.gitignore b/vendor/doctrine/common/tests/.gitignore new file mode 100644 index 00000000..72104052 --- /dev/null +++ b/vendor/doctrine/common/tests/.gitignore @@ -0,0 +1,3 @@ +Doctrine/Tests/Proxies/ +Doctrine/Tests/ORM/Proxy/generated/ +Doctrine/Tests/ORM/Tools/Export/export diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php new file mode 100644 index 00000000..0a329a3c --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php @@ -0,0 +1,538 @@ +getReader(); + + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\DummyClass'); + $this->assertEquals(1, count($reader->getClassAnnotations($class))); + $this->assertInstanceOf($annotName = 'Doctrine\Tests\Common\Annotations\DummyAnnotation', $annot = $reader->getClassAnnotation($class, $annotName)); + $this->assertEquals("hello", $annot->dummyValue); + + $field1Prop = $class->getProperty('field1'); + $propAnnots = $reader->getPropertyAnnotations($field1Prop); + $this->assertEquals(1, count($propAnnots)); + $this->assertInstanceOf($annotName, $annot = $reader->getPropertyAnnotation($field1Prop, $annotName)); + $this->assertEquals("fieldHello", $annot->dummyValue); + + $getField1Method = $class->getMethod('getField1'); + $methodAnnots = $reader->getMethodAnnotations($getField1Method); + $this->assertEquals(1, count($methodAnnots)); + $this->assertInstanceOf($annotName, $annot = $reader->getMethodAnnotation($getField1Method, $annotName)); + $this->assertEquals(array(1, 2, "three"), $annot->value); + + $field2Prop = $class->getProperty('field2'); + $propAnnots = $reader->getPropertyAnnotations($field2Prop); + $this->assertEquals(1, count($propAnnots)); + $this->assertInstanceOf($annotName = 'Doctrine\Tests\Common\Annotations\DummyJoinTable', $joinTableAnnot = $reader->getPropertyAnnotation($field2Prop, $annotName)); + $this->assertEquals(1, count($joinTableAnnot->joinColumns)); + $this->assertEquals(1, count($joinTableAnnot->inverseJoinColumns)); + $this->assertTrue($joinTableAnnot->joinColumns[0] instanceof DummyJoinColumn); + $this->assertTrue($joinTableAnnot->inverseJoinColumns[0] instanceof DummyJoinColumn); + $this->assertEquals('col1', $joinTableAnnot->joinColumns[0]->name); + $this->assertEquals('col2', $joinTableAnnot->joinColumns[0]->referencedColumnName); + $this->assertEquals('col3', $joinTableAnnot->inverseJoinColumns[0]->name); + $this->assertEquals('col4', $joinTableAnnot->inverseJoinColumns[0]->referencedColumnName); + + $dummyAnnot = $reader->getMethodAnnotation($class->getMethod('getField1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('', $dummyAnnot->dummyValue); + $this->assertEquals(array(1, 2, 'three'), $dummyAnnot->value); + + $dummyAnnot = $reader->getPropertyAnnotation($class->getProperty('field1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('fieldHello', $dummyAnnot->dummyValue); + + $classAnnot = $reader->getClassAnnotation($class, 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('hello', $classAnnot->dummyValue); + } + + public function testAnnotationsWithValidTargets() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithValidAnnotationTarget'); + + $this->assertEquals(1,count($reader->getClassAnnotations($class))); + $this->assertEquals(1,count($reader->getPropertyAnnotations($class->getProperty('foo')))); + $this->assertEquals(1,count($reader->getMethodAnnotations($class->getMethod('someFunction')))); + $this->assertEquals(1,count($reader->getPropertyAnnotations($class->getProperty('nested')))); + } + + public function testAnnotationsWithVarType() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $this->assertEquals(1,count($fooAnnot = $reader->getPropertyAnnotations($class->getProperty('foo')))); + $this->assertEquals(1,count($barAnnot = $reader->getMethodAnnotations($class->getMethod('bar')))); + + $this->assertInternalType('string', $fooAnnot[0]->string); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', $barAnnot[0]->annotation); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetPropertyMethod is not allowed to be declared on class Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass. You may only use this annotation on these code elements: METHOD, PROPERTY + */ + public function testClassWithInvalidAnnotationTargetAtClassDocBlock() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetClass is not allowed to be declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty::$foo. You may only use this annotation on these code elements: CLASS + */ + public function testClassWithInvalidAnnotationTargetAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty', 'foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetAnnotation is not allowed to be declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty::$bar. You may only use this annotation on these code elements: ANNOTATION + */ + public function testClassWithInvalidNestedAnnotationTargetAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty', 'bar')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetClass is not allowed to be declared on method Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod::functionName(). You may only use this annotation on these code elements: CLASS + */ + public function testClassWithInvalidAnnotationTargetAtMethodDocBlock() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod', 'functionName')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtClassDocBlock() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError','foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtMethodDocBlock() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError','bar')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Type Error] Attribute "string" of @AnnotationWithVarType declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType::$invalidProperty expects a(n) string, but got integer. + */ + public function testClassWithPropertyInvalidVarTypeError() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $reader->getPropertyAnnotations($class->getProperty('invalidProperty')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Type Error] Attribute "annotation" of @AnnotationWithVarType declared on method Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType::invalidMethod() expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll, but got an instance of Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. + */ + public function testClassWithMethodInvalidVarTypeError() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $reader->getMethodAnnotations($class->getMethod('invalidMethod')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in class Doctrine\Tests\Common\Annotations\DummyClassSyntaxError. + */ + public function testClassSyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\DummyClassSyntaxError')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in method Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError::foo(). + */ + public function testMethodSyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError', 'foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in property Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError::$foo. + */ + public function testPropertySyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError', 'foo')); + } + + /** + * @group regression + */ + public function testMultipleAnnotationsOnSameLine() + { + $reader = $this->getReader(); + $annots = $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClass2', 'id')); + $this->assertEquals(3, count($annots)); + } + + public function testNonAnnotationProblem() + { + $reader = $this->getReader(); + + $this->assertNotNull($annot = $reader->getPropertyAnnotation(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClassNonAnnotationProblem', 'foo'), $name = 'Doctrine\Tests\Common\Annotations\DummyAnnotation')); + $this->assertInstanceOf($name, $annot); + } + + public function testImportWithConcreteAnnotation() + { + $reader = $this->getReader(); + $property = new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestImportWithConcreteAnnotation', 'field'); + $annotations = $reader->getPropertyAnnotations($property); + $this->assertEquals(1, count($annotations)); + $this->assertNotNull($reader->getPropertyAnnotation($property, 'Doctrine\Tests\Common\Annotations\DummyAnnotation')); + } + + public function testImportWithInheritance() + { + $reader = $this->getReader(); + + $class = new TestParentClass(); + $ref = new \ReflectionClass($class); + + $childAnnotations = $reader->getPropertyAnnotations($ref->getProperty('child')); + $this->assertEquals(1, count($childAnnotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Foo\Name', reset($childAnnotations)); + + $parentAnnotations = $reader->getPropertyAnnotations($ref->getProperty('parent')); + $this->assertEquals(1, count($parentAnnotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Bar\Name', reset($parentAnnotations)); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation "@NameFoo" in property Doctrine\Tests\Common\Annotations\TestAnnotationNotImportedClass::$field was never imported. + */ + public function testImportDetectsNotImportedAnnotation() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestAnnotationNotImportedClass', 'field')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation "@Foo\Bar\Name" in property Doctrine\Tests\Common\Annotations\TestNonExistentAnnotationClass::$field was never imported. + */ + public function testImportDetectsNonExistentAnnotation() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestNonExistentAnnotationClass', 'field')); + } + + public function testTopLevelAnnotation() + { + $reader = $this->getReader(); + $annotations = $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestTopLevelAnnotationClass', 'field')); + + $this->assertEquals(1, count($annotations)); + $this->assertInstanceOf('\TopLevelAnnotation', reset($annotations)); + } + + public function testIgnoresAnnotationsNotPrefixedWithWhitespace() + { + $reader = $this->getReader(); + + $annotation = $reader->getClassAnnotation(new \ReflectionClass(new TestIgnoresNonAnnotationsClass()), 'Doctrine\Tests\Common\Annotations\Name'); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Name', $annotation); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The class "Doctrine\Tests\Common\Annotations\Fixtures\NoAnnotation" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "Doctrine\Tests\Common\Annotations\Fixtures\NoAnnotation". If it is indeed no annotation, then you need to add @IgnoreAnnotation("NoAnnotation") to the _class_ doc comment of class Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageClass. + */ + public function testErrorWhenInvalidAnnotationIsUsed() + { + $reader = $this->getReader(); + $ref = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageClass'); + $reader->getClassAnnotations($ref); + } + + public function testInvalidAnnotationUsageButIgnoredClass() + { + $reader = $this->getReader(); + $ref = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageButIgnoredClass'); + $annots = $reader->getClassAnnotations($ref); + + $this->assertEquals(2, count($annots)); + } + + /** + * @group DDC-1660 + * @group regression + */ + public function testInvalidAnnotationButIgnored() + { + $reader = $this->getReader(); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassDDC1660'); + + $this->assertTrue(class_exists('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Version')); + $this->assertCount(0, $reader->getClassAnnotations($class)); + $this->assertCount(0, $reader->getMethodAnnotations($class->getMethod('bar'))); + $this->assertCount(0, $reader->getPropertyAnnotations($class->getProperty('foo'))); + } + + abstract protected function getReader(); +} + +/** + * @parseAnnotation("var") + * @author Johannes M. Schmitt + * + */ +class TestParseAnnotationClass +{ + /** + * @var + */ + private $field; +} + +/** + * @Name + * @author Johannes M. Schmitt + */ +class TestIgnoresNonAnnotationsClass +{ +} + +class TestTopLevelAnnotationClass +{ + /** + * @\TopLevelAnnotation + */ + private $field; +} + +class TestNonExistentAnnotationClass +{ + /** + * @Foo\Bar\Name + */ + private $field; +} + +class TestAnnotationNotImportedClass +{ + /** + * @NameFoo + */ + private $field; +} + +class TestChildClass +{ + /** + * @\Doctrine\Tests\Common\Annotations\Foo\Name(name = "foo") + */ + protected $child; +} + +class TestParentClass extends TestChildClass +{ + /** + * @\Doctrine\Tests\Common\Annotations\Bar\Name(name = "bar") + */ + private $parent; +} + +class TestImportWithConcreteAnnotation +{ + /** + * @DummyAnnotation(dummyValue = "bar") + */ + private $field; +} + +/** + * A description of this class. + * + * Let's see if the parser recognizes that this @ is not really referring to an + * annotation. Also make sure that @var \ is not concated to "@var\is". + * + * @author robo + * @since 2.0 + * @DummyAnnotation(dummyValue="hello") + */ +class DummyClass { + /** + * A nice property. + * + * @var mixed + * @DummyAnnotation(dummyValue="fieldHello") + */ + private $field1; + + /** + * @DummyJoinTable(name="join_table", + * joinColumns={@DummyJoinColumn(name="col1", referencedColumnName="col2")}, + * inverseJoinColumns={ + * @DummyJoinColumn(name="col3", referencedColumnName="col4") + * }) + */ + private $field2; + + /** + * Gets the value of field1. + * + * @return mixed + * @DummyAnnotation({1,2,"three"}) + */ + public function getField1() { + } +} + +/** + * @ignoreAnnotation("var") + */ +class DummyClass2 { + /** + * @DummyId @DummyColumn(type="integer") @DummyGeneratedValue + * @var integer + */ + private $id; +} + +/** @Annotation */ +class DummyId extends \Doctrine\Common\Annotations\Annotation {} +/** @Annotation */ +class DummyColumn extends \Doctrine\Common\Annotations\Annotation { + public $type; +} +/** @Annotation */ +class DummyGeneratedValue extends \Doctrine\Common\Annotations\Annotation {} +/** @Annotation */ +class DummyAnnotation extends \Doctrine\Common\Annotations\Annotation { + public $dummyValue; +} +/** @Annotation */ +class DummyJoinColumn extends \Doctrine\Common\Annotations\Annotation { + public $name; + public $referencedColumnName; +} +/** @Annotation */ +class DummyJoinTable extends \Doctrine\Common\Annotations\Annotation { + public $name; + public $joinColumns; + public $inverseJoinColumns; +} + +/** + * @DummyAnnotation(@) + */ +class DummyClassSyntaxError +{ + +} + +class DummyClassMethodSyntaxError +{ + /** + * @DummyAnnotation(@) + */ + public function foo() + { + + } +} + +class DummyClassPropertySyntaxError +{ + /** + * @DummyAnnotation(@) + */ + public $foo; +} + +/** + * @ignoreAnnotation({"since", "var"}) + */ +class DummyClassNonAnnotationProblem +{ + /** + * @DummyAnnotation + * + * @var \Test + * @since 0.1 + */ + public $foo; +} + + +/** +* @DummyAnnotation Foo bar +*/ +class DummyClassWithEmail +{ + +} + +namespace Doctrine\Tests\Common\Annotations\Foo; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation +{ + public $name; +} + +namespace Doctrine\Tests\Common\Annotations\Bar; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation +{ + public $name; +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php new file mode 100644 index 00000000..d2cc6678 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php @@ -0,0 +1,13 @@ +getMock('Doctrine\Common\Cache\Cache'); + $cache + ->expects($this->at(0)) + ->method('fetch') + ->with($this->equalTo($cacheKey)) + ->will($this->returnValue(array())) + ; + $cache + ->expects($this->at(1)) + ->method('fetch') + ->with($this->equalTo('[C]'.$cacheKey)) + ->will($this->returnValue(time() - 10)) + ; + $cache + ->expects($this->at(2)) + ->method('save') + ->with($this->equalTo($cacheKey)) + ; + $cache + ->expects($this->at(3)) + ->method('save') + ->with($this->equalTo('[C]'.$cacheKey)) + ; + + $reader = new CachedReader(new AnnotationReader(), $cache, true); + $route = new Route(); + $route->pattern = '/someprefix'; + $this->assertEquals(array($route), $reader->getClassAnnotations(new \ReflectionClass($name))); + } + + protected function getReader() + { + $this->cache = new ArrayCache(); + return new CachedReader(new AnnotationReader(), $this->cache); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php new file mode 100644 index 00000000..cb080f08 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php @@ -0,0 +1,27 @@ +setInput("@Name"); + $this->assertNull($lexer->token); + $this->assertNull($lexer->lookahead); + + $this->assertTrue($lexer->moveNext()); + $this->assertNull($lexer->token); + $this->assertEquals('@', $lexer->lookahead['value']); + + $this->assertTrue($lexer->moveNext()); + $this->assertEquals('@', $lexer->token['value']); + $this->assertEquals('Name', $lexer->lookahead['value']); + + $this->assertFalse($lexer->moveNext()); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php new file mode 100644 index 00000000..56cae7fd --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php @@ -0,0 +1,1118 @@ +createTestParser(); + + // Nested arrays with nested annotations + $result = $parser->parse('@Name(foo={1,2, {"key"=@Name}})'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertNull($annot->value); + $this->assertEquals(3, count($annot->foo)); + $this->assertEquals(1, $annot->foo[0]); + $this->assertEquals(2, $annot->foo[1]); + $this->assertTrue(is_array($annot->foo[2])); + + $nestedArray = $annot->foo[2]; + $this->assertTrue(isset($nestedArray['key'])); + $this->assertTrue($nestedArray['key'] instanceof Name); + } + + public function testBasicAnnotations() + { + $parser = $this->createTestParser(); + + // Marker annotation + $result = $parser->parse("@Name"); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertNull($annot->value); + $this->assertNull($annot->foo); + + // Associative arrays + $result = $parser->parse('@Name(foo={"key1" = "value1"})'); + $annot = $result[0]; + $this->assertNull($annot->value); + $this->assertTrue(is_array($annot->foo)); + $this->assertTrue(isset($annot->foo['key1'])); + + // Numerical arrays + $result = $parser->parse('@Name({2="foo", 4="bar"})'); + $annot = $result[0]; + $this->assertTrue(is_array($annot->value)); + $this->assertEquals('foo', $annot->value[2]); + $this->assertEquals('bar', $annot->value[4]); + $this->assertFalse(isset($annot->value[0])); + $this->assertFalse(isset($annot->value[1])); + $this->assertFalse(isset($annot->value[3])); + + // Multiple values + $result = $parser->parse('@Name(@Name, @Name)'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertTrue(is_array($annot->value)); + $this->assertTrue($annot->value[0] instanceof Name); + $this->assertTrue($annot->value[1] instanceof Name); + + // Multiple types as values + $result = $parser->parse('@Name(foo="Bar", @Name, {"key1"="value1", "key2"="value2"})'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertTrue(is_array($annot->value)); + $this->assertTrue($annot->value[0] instanceof Name); + $this->assertTrue(is_array($annot->value[1])); + $this->assertEquals('value1', $annot->value[1]['key1']); + $this->assertEquals('value2', $annot->value[1]['key2']); + + // Complete docblock + $docblock = <<parse($docblock); + $this->assertEquals(1, count($result)); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + $this->assertNull($annot->value); + } + + public function testNamespacedAnnotations() + { + $parser = new DocParser; + $parser->setIgnoreNotImportedAnnotations(true); + + $docblock = << + * @Doctrine\Tests\Common\Annotations\Name(foo="bar") + * @ignore + */ +DOCBLOCK; + + $result = $parser->parse($docblock); + $this->assertEquals(1, count($result)); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + } + + /** + * @group debug + */ + public function testTypicalMethodDocBlock() + { + $parser = $this->createTestParser(); + + $docblock = <<parse($docblock); + $this->assertEquals(2, count($result)); + $this->assertTrue(isset($result[0])); + $this->assertTrue(isset($result[1])); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + $marker = $result[1]; + $this->assertTrue($marker instanceof Marker); + } + + + public function testAnnotationWithoutConstructor() + { + $parser = $this->createTestParser(); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertNotNull($annot); + $this->assertTrue($annot instanceof SomeAnnotationClassNameWithoutConstructor); + + $this->assertNull($annot->name); + $this->assertNotNull($annot->data); + $this->assertEquals($annot->data, "Some data"); + + + + +$docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertNotNull($annot); + $this->assertTrue($annot instanceof SomeAnnotationClassNameWithoutConstructor); + + $this->assertEquals($annot->name, "Some Name"); + $this->assertEquals($annot->data, "Some data"); + + + + +$docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->data, "Some data"); + $this->assertNull($annot->name); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertNull($annot->data); + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->data, "Some data"); + $this->assertNull($annot->name); + + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertEquals($annot->data, "Some data"); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertEquals($annot->data, "Some data"); + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $this->assertTrue($result[0] instanceof SomeAnnotationClassNameWithoutConstructorAndProperties); + } + + public function testAnnotationTarget() + { + + $parser = new DocParser; + $parser->setImports(array( + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations\Fixtures', + )); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithValidAnnotationTarget'); + + + $context = 'class ' . $class->getName(); + $docComment = $class->getDocComment(); + + $parser->setTarget(Target::TARGET_CLASS); + $this->assertNotNull($parser->parse($docComment,$context)); + + + $property = $class->getProperty('foo'); + $docComment = $property->getDocComment(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + + $parser->setTarget(Target::TARGET_PROPERTY); + $this->assertNotNull($parser->parse($docComment,$context)); + + + + $method = $class->getMethod('someFunction'); + $docComment = $property->getDocComment(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + + $parser->setTarget(Target::TARGET_METHOD); + $this->assertNotNull($parser->parse($docComment,$context)); + + + try { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass'); + $context = 'class ' . $class->getName(); + $docComment = $class->getDocComment(); + + $parser->setTarget(Target::TARGET_CLASS); + $parser->parse($class->getDocComment(),$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + + try { + + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod'); + $method = $class->getMethod('functionName'); + $docComment = $method->getDocComment(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + + $parser->setTarget(Target::TARGET_METHOD); + $parser->parse($docComment,$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + + try { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty'); + $property = $class->getProperty('foo'); + $docComment = $property->getDocComment(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + + $parser->setTarget(Target::TARGET_PROPERTY); + $parser->parse($docComment,$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + } + + public function getAnnotationVarTypeProviderValid() + { + //({attribute name}, {attribute value}) + return array( + // mixed type + array('mixed', '"String Value"'), + array('mixed', 'true'), + array('mixed', 'false'), + array('mixed', '1'), + array('mixed', '1.2'), + array('mixed', '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll'), + + // boolean type + array('boolean', 'true'), + array('boolean', 'false'), + + // alias for internal type boolean + array('bool', 'true'), + array('bool', 'false'), + + // integer type + array('integer', '0'), + array('integer', '1'), + array('integer', '123456789'), + array('integer', '9223372036854775807'), + + // alias for internal type double + array('float', '0.1'), + array('float', '1.2'), + array('float', '123.456'), + + // string type + array('string', '"String Value"'), + array('string', '"true"'), + array('string', '"123"'), + + // array type + array('array', '{@AnnotationExtendsAnnotationTargetAll}'), + array('array', '{@AnnotationExtendsAnnotationTargetAll,@AnnotationExtendsAnnotationTargetAll}'), + + array('arrayOfIntegers', '1'), + array('arrayOfIntegers', '{1}'), + array('arrayOfIntegers', '{1,2,3,4}'), + array('arrayOfAnnotations', '@AnnotationExtendsAnnotationTargetAll'), + array('arrayOfAnnotations', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll}'), + array('arrayOfAnnotations', '{@AnnotationExtendsAnnotationTargetAll, @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll}'), + + // annotation instance + array('annotation', '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll'), + array('annotation', '@AnnotationExtendsAnnotationTargetAll'), + ); + } + + public function getAnnotationVarTypeProviderInvalid() + { + //({attribute name}, {type declared type}, {attribute value} , {given type or class}) + return array( + // boolean type + array('boolean','boolean','1','integer'), + array('boolean','boolean','1.2','double'), + array('boolean','boolean','"str"','string'), + array('boolean','boolean','{1,2,3}','array'), + array('boolean','boolean','@Name', 'an instance of Doctrine\Tests\Common\Annotations\Name'), + + // alias for internal type boolean + array('bool','bool', '1','integer'), + array('bool','bool', '1.2','double'), + array('bool','bool', '"str"','string'), + array('bool','bool', '{"str"}','array'), + + // integer type + array('integer','integer', 'true','boolean'), + array('integer','integer', 'false','boolean'), + array('integer','integer', '1.2','double'), + array('integer','integer', '"str"','string'), + array('integer','integer', '{"str"}','array'), + array('integer','integer', '{1,2,3,4}','array'), + + // alias for internal type double + array('float','float', 'true','boolean'), + array('float','float', 'false','boolean'), + array('float','float', '123','integer'), + array('float','float', '"str"','string'), + array('float','float', '{"str"}','array'), + array('float','float', '{12.34}','array'), + array('float','float', '{1,2,3}','array'), + + // string type + array('string','string', 'true','boolean'), + array('string','string', 'false','boolean'), + array('string','string', '12','integer'), + array('string','string', '1.2','double'), + array('string','string', '{"str"}','array'), + array('string','string', '{1,2,3,4}','array'), + + // annotation instance + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'true','boolean'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'false','boolean'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '12','integer'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '1.2','double'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{"str"}','array'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{1,2,3,4}','array'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '@Name','an instance of Doctrine\Tests\Common\Annotations\Name'), + ); + } + + public function getAnnotationVarTypeArrayProviderInvalid() + { + //({attribute name}, {type declared type}, {attribute value} , {given type or class}) + return array( + array('arrayOfIntegers','integer', 'true','boolean'), + array('arrayOfIntegers','integer', 'false','boolean'), + array('arrayOfIntegers','integer', '{true,true}','boolean'), + array('arrayOfIntegers','integer', '{1,true}','boolean'), + array('arrayOfIntegers','integer', '{1,2,1.2}','double'), + array('arrayOfIntegers','integer', '{1,2,"str"}','string'), + + + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'true','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'false','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,true}','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,true}','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,1.2}','double'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,@AnnotationExtendsAnnotationTargetAll,"str"}','string'), + ); + } + + /** + * @dataProvider getAnnotationVarTypeProviderValid + */ + public function testAnnotationWithVarType($attribute, $value) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::$invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + $result = $parser->parse($docblock, $context); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType', $result[0]); + $this->assertNotNull($result[0]->$attribute); + } + + /** + * @dataProvider getAnnotationVarTypeProviderInvalid + */ + public function testAnnotationWithVarTypeError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType declared on property SomeClassName::invalidProperty. expects a(n) $type, but got $given.", $exc->getMessage()); + } + } + + + /** + * @dataProvider getAnnotationVarTypeArrayProviderInvalid + */ + public function testAnnotationWithVarTypeArrayError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType declared on property SomeClassName::invalidProperty. expects either a(n) $type, or an array of {$type}s, but got $given.", $exc->getMessage()); + } + } + + /** + * @dataProvider getAnnotationVarTypeProviderValid + */ + public function testAnnotationWithAttributes($attribute, $value) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::$invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + $result = $parser->parse($docblock, $context); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes', $result[0]); + $getter = "get".ucfirst($attribute); + $this->assertNotNull($result[0]->$getter()); + } + + /** + * @dataProvider getAnnotationVarTypeProviderInvalid + */ + public function testAnnotationWithAttributesError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes declared on property SomeClassName::invalidProperty. expects a(n) $type, but got $given.", $exc->getMessage()); + } + } + + + /** + * @dataProvider getAnnotationVarTypeArrayProviderInvalid + */ + public function testAnnotationWithAttributesWithVarTypeArrayError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes declared on property SomeClassName::invalidProperty. expects either a(n) $type, or an array of {$type}s, but got $given.", $exc->getMessage()); + } + } + + public function testAnnotationWithRequiredAttributes() + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $parser->setTarget(Target::TARGET_PROPERTY); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes("Some Value", annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + $result = $parser->parse($docblock); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes', $result[0]); + $this->assertEquals("Some Value",$result[0]->getValue()); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation', $result[0]->getAnnot()); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes("Some Value")'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "annot" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes declared on property SomeClassName::invalidProperty. expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. This value should not be null.', $exc->getMessage()); + } + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes(annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "value" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes declared on property SomeClassName::invalidProperty. expects a(n) string. This value should not be null.', $exc->getMessage()); + } + + } + + public function testAnnotationWithRequiredAttributesWithoutContructor() + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $parser->setTarget(Target::TARGET_PROPERTY); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor("Some Value", annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + $result = $parser->parse($docblock); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor', $result[0]); + $this->assertEquals("Some Value", $result[0]->value); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation', $result[0]->annot); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor("Some Value")'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "annot" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor declared on property SomeClassName::invalidProperty. expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. This value should not be null.', $exc->getMessage()); + } + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor(annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "value" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor declared on property SomeClassName::invalidProperty. expects a(n) string. This value should not be null.', $exc->getMessage()); + } + + } + + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation @SomeAnnotationClassNameWithoutConstructorAndProperties declared on does not accept any values, but got {"value":"Foo"}. + */ + public function testWithoutConstructorWhenIsNotDefaultValue() + { + $parser = $this->createTestParser(); + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation @SomeAnnotationClassNameWithoutConstructorAndProperties declared on does not accept any values, but got {"value":"Foo"}. + */ + public function testWithoutConstructorWhenHasNoProperties() + { + $parser = $this->createTestParser(); + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testAnnotationTargetSyntaxError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Invalid Target "Foo". Available targets: [ALL, CLASS, METHOD, PROPERTY, ANNOTATION] + */ + public function testAnnotationWithInvalidTargetDeclarationError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage @Target expects either a string value, or an array of strings, "NULL" given. + */ + public function testAnnotationWithTargetEmptyError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @group DDC-575 + */ + public function testRegressionDDC575() + { + $parser = $this->createTestParser(); + + $docblock = <<parse($docblock); + + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Name", $result[0]); + + $docblock = <<parse($docblock); + + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Name", $result[0]); + } + + /** + * @group DDC-77 + */ + public function testAnnotationWithoutClassIsIgnoredWithoutWarning() + { + $parser = new DocParser(); + $parser->setIgnoreNotImportedAnnotations(true); + $result = $parser->parse("@param"); + + $this->assertEquals(0, count($result)); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected PlainValue, got ''' at position 10. + */ + public function testAnnotationDontAcceptSingleQuotes() + { + $parser = $this->createTestParser(); + $parser->parse("@Name(foo='bar')"); + } + + /** + * @group DCOM-41 + */ + public function testAnnotationDoesntThrowExceptionWhenAtSignIsNotFollowedByIdentifier() + { + $parser = new DocParser(); + $result = $parser->parse("'@'"); + + $this->assertEquals(0, count($result)); + } + + /** + * @group DCOM-41 + * @expectedException Doctrine\Common\Annotations\AnnotationException + */ + public function testAnnotationThrowsExceptionWhenAtSignIsNotFollowedByIdentifierInNestedAnnotation() + { + $parser = new DocParser(); + $result = $parser->parse("@Doctrine\Tests\Common\Annotations\Name(@')"); + } + + /** + * @group DCOM-56 + */ + public function testAutoloadAnnotation() + { + $this->assertFalse(class_exists('Doctrine\Tests\Common\Annotations\Fixture\Annotation\Autoload', false), 'Pre-condition: Doctrine\Tests\Common\Annotations\Fixture\Annotation\Autoload not allowed to be loaded.'); + + $parser = new DocParser(); + + AnnotationRegistry::registerAutoloadNamespace('Doctrine\Tests\Common\Annotations\Fixtures\Annotation', __DIR__ . '/../../../../'); + + $parser->setImports(array( + 'autoload' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Autoload', + )); + $annotations = $parser->parse('@Autoload'); + + $this->assertEquals(1, count($annotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Autoload', $annotations[0]); + } + + public function createTestParser() + { + $parser = new DocParser(); + $parser->setIgnoreNotImportedAnnotations(true); + $parser->setImports(array( + 'name' => 'Doctrine\Tests\Common\Annotations\Name', + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations', + )); + + return $parser; + } + + /** + * @group DDC-78 + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected PlainValue, got ''' at position 10 in class \Doctrine\Tests\Common\Annotations\Name + */ + public function testSyntaxErrorWithContextDescription() + { + $parser = $this->createTestParser(); + $parser->parse("@Name(foo='bar')", "class \Doctrine\Tests\Common\Annotations\Name"); + } + + /** + * @group DDC-183 + */ + public function testSyntaxErrorWithUnknownCharacters() + { + $docblock = <<setInput(trim($docblock, '/ *')); + //var_dump($lexer); + + try { + $parser = $this->createTestParser(); + $result = $parser->parse($docblock); + } catch (Exception $e) { + $this->fail($e->getMessage()); + } + } + + /** + * @group DCOM-14 + */ + public function testIgnorePHPDocThrowTag() + { + $docblock = <<createTestParser(); + $result = $parser->parse($docblock); + } catch (Exception $e) { + $this->fail($e->getMessage()); + } + } + + /** + * @group DCOM-38 + */ + public function testCastInt() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=1234)"); + $annot = $result[0]; + $this->assertInternalType('int', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastNegativeInt() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=-1234)"); + $annot = $result[0]; + $this->assertInternalType('int', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastFloat() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastNegativeFloat() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=-1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->foo); + + $result = $parser->parse("@Marker(-1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->value); + } + + public function testReservedKeywordsInAnnotations() + { + $parser = $this->createTestParser(); + + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\True'); + $this->assertTrue($result[0] instanceof True); + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\False'); + $this->assertTrue($result[0] instanceof False); + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\Null'); + $this->assertTrue($result[0] instanceof Null); + + $result = $parser->parse('@True'); + $this->assertTrue($result[0] instanceof True); + $result = $parser->parse('@False'); + $this->assertTrue($result[0] instanceof False); + $result = $parser->parse('@Null'); + $this->assertTrue($result[0] instanceof Null); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Creation Error] The annotation @SomeAnnotationClassNameWithoutConstructor declared on some class does not have a property named "invalidaProperty". Available properties: data, name + */ + public function testSetValuesExeption() + { + $docblock = <<createTestParser()->parse($docblock, 'some class'); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Syntax Error] Expected Doctrine\Common\Annotations\DocLexer::T_IDENTIFIER or Doctrine\Common\Annotations\DocLexer::T_TRUE or Doctrine\Common\Annotations\DocLexer::T_FALSE or Doctrine\Common\Annotations\DocLexer::T_NULL, got '3.42' at position 5. + */ + public function testInvalidIdentifierInAnnotation() + { + $parser = $this->createTestParser(); + $parser->parse('@Foo\3.42'); + } + + public function testTrailingCommaIsAllowed() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Name({ + "Foo", + "Bar", + })'); + $this->assertEquals(1, count($annots)); + $this->assertEquals(array('Foo', 'Bar'), $annots[0]->value); + } + + public function testDefaultAnnotationValueIsNotOverwritten() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Doctrine\Tests\Common\Annotations\Fixtures\Annotation\AnnotWithDefaultValue'); + $this->assertEquals(1, count($annots)); + $this->assertEquals('bar', $annots[0]->foo); + } + + public function testArrayWithColon() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Name({"foo": "bar"})'); + $this->assertEquals(1, count($annots)); + $this->assertEquals(array('foo' => 'bar'), $annots[0]->value); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Syntax Error] Expected PlainValue, got 'foo:' at position 6. + */ + public function testColonNotAllowedOnTopLevel() + { + $parser = $this->createTestParser(); + $parser->parse('@Name(foo: "bar")'); + } +} + +/** @Annotation */ +class SomeAnnotationClassNameWithoutConstructor +{ + public $data; + public $name; +} + +/** @Annotation */ +class SomeAnnotationWithConstructorWithoutParams +{ + function __construct() + { + $this->data = "Some data"; + } + public $data; + public $name; +} + +/** @Annotation */ +class SomeAnnotationClassNameWithoutConstructorAndProperties{} + +/** + * @Annotation + * @Target("Foo") + */ +class AnnotationWithInvalidTargetDeclaration{} + +/** + * @Annotation + * @Target + */ +class AnnotationWithTargetEmpty{} + +/** @Annotation */ +class AnnotationExtendsAnnotationTargetAll extends \Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll +{ +} + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation { + public $foo; +} + +/** @Annotation */ +class Marker { + public $value; +} + +/** @Annotation */ +class True {} + +/** @Annotation */ +class False {} + +/** @Annotation */ +class Null {} + +namespace Doctrine\Tests\Common\Annotations\FooBar; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation { +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php new file mode 100644 index 00000000..c84344d8 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php @@ -0,0 +1,40 @@ +cacheDir = sys_get_temp_dir() . "/annotations_". uniqid(); + @mkdir($this->cacheDir); + return new FileCacheReader(new AnnotationReader(), $this->cacheDir); + } + + public function tearDown() + { + foreach (glob($this->cacheDir.'/*.php') AS $file) { + unlink($file); + } + rmdir($this->cacheDir); + } + + /** + * @group DCOM-81 + */ + public function testAttemptToCreateAnnotationCacheDir() + { + $this->cacheDir = sys_get_temp_dir() . "/not_existed_dir_". uniqid(); + + $this->assertFalse(is_dir($this->cacheDir)); + + $cache = new FileCacheReader(new AnnotationReader(), $this->cacheDir); + + $this->assertTrue(is_dir($this->cacheDir)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php new file mode 100644 index 00000000..44108e19 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php @@ -0,0 +1,10 @@ +roles = $values['value']; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php new file mode 100644 index 00000000..b507e602 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php @@ -0,0 +1,14 @@ +name = isset($values['value']) ? $values['value'] : null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php new file mode 100644 index 00000000..09ef0317 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php @@ -0,0 +1,11 @@ +"), + @Attribute("annotation", type = "Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll"), + @Attribute("arrayOfAnnotations", type = "array"), + }) + */ +final class AnnotationWithAttributes +{ + + public final function __construct(array $data) + { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + private $mixed; + private $boolean; + private $bool; + private $float; + private $string; + private $integer; + private $array; + private $annotation; + private $arrayOfIntegers; + private $arrayOfAnnotations; + + /** + * @return mixed + */ + public function getMixed() + { + return $this->mixed; + } + + /** + * @return boolean + */ + public function getBoolean() + { + return $this->boolean; + } + + /** + * @return bool + */ + public function getBool() + { + return $this->bool; + } + + /** + * @return float + */ + public function getFloat() + { + return $this->float; + } + + /** + * @return string + */ + public function getString() + { + return $this->string; + } + + public function getInteger() + { + return $this->integer; + } + + /** + * @return array + */ + public function getArray() + { + return $this->array; + } + + /** + * @return Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll + */ + public function getAnnotation() + { + return $this->annotation; + } + + /** + * @return array + */ + public function getArrayOfIntegers() + { + return $this->arrayOfIntegers; + } + + /** + * @return array + */ + public function getArrayOfAnnotations() + { + return $this->arrayOfAnnotations; + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php new file mode 100644 index 00000000..6eb1bc5a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php @@ -0,0 +1,50 @@ + $value) { + $this->$key = $value; + } + } + + /** + * @var string + */ + private $value; + + /** + * + * @var Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation + */ + private $annot; + + /** + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * @return Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation + */ + public function getAnnot() + { + return $this->annot; + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php new file mode 100644 index 00000000..bf458ee7 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php @@ -0,0 +1,24 @@ + + */ + public $arrayOfIntegers; + + /** + * @var array + */ + public $arrayOfAnnotations; + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php new file mode 100644 index 00000000..4e652e13 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php @@ -0,0 +1,30 @@ + + */ +class Controller +{ + /** + * @Route("/", name="_demo") + * @Template() + */ + public function indexAction() + { + return array(); + } + + /** + * @Route("/hello/{name}", name="_demo_hello") + * @Template() + */ + public function helloAction($name) + { + return array('name' => $name); + } + + /** + * @Route("/contact", name="_demo_contact") + * @Template() + */ + public function contactAction() + { + $form = ContactForm::create($this->get('form.context'), 'contact'); + + $form->bind($this->container->get('request'), $form); + if ($form->isValid()) { + $form->send($this->get('mailer')); + + $this->get('session')->setFlash('notice', 'Message sent!'); + + return new RedirectResponse($this->generateUrl('_demo')); + } + + return array('form' => $form); + } + + /** + * Creates the ACL for the passed object identity + * + * @param ObjectIdentityInterface $oid + * @return void + */ + private function createObjectIdentity(ObjectIdentityInterface $oid) + { + $classId = $this->createOrRetrieveClassId($oid->getType()); + + $this->connection->executeQuery($this->getInsertObjectIdentitySql($oid->getIdentifier(), $classId, true)); + } + + /** + * Returns the primary key for the passed class type. + * + * If the type does not yet exist in the database, it will be created. + * + * @param string $classType + * @return integer + */ + private function createOrRetrieveClassId($classType) + { + if (false !== $id = $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn()) { + return $id; + } + + $this->connection->executeQuery($this->getInsertClassSql($classType)); + + return $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn(); + } + + /** + * Returns the primary key for the passed security identity. + * + * If the security identity does not yet exist in the database, it will be + * created. + * + * @param SecurityIdentityInterface $sid + * @return integer + */ + private function createOrRetrieveSecurityIdentityId(SecurityIdentityInterface $sid) + { + if (false !== $id = $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn()) { + return $id; + } + + $this->connection->executeQuery($this->getInsertSecurityIdentitySql($sid)); + + return $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn(); + } + + /** + * Deletes all ACEs for the given object identity primary key. + * + * @param integer $oidPK + * @return void + */ + private function deleteAccessControlEntries($oidPK) + { + $this->connection->executeQuery($this->getDeleteAccessControlEntriesSql($oidPK)); + } + + /** + * Deletes the object identity from the database. + * + * @param integer $pk + * @return void + */ + private function deleteObjectIdentity($pk) + { + $this->connection->executeQuery($this->getDeleteObjectIdentitySql($pk)); + } + + /** + * Deletes all entries from the relations table from the database. + * + * @param integer $pk + * @return void + */ + private function deleteObjectIdentityRelations($pk) + { + $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk)); + } + + /** + * This regenerates the ancestor table which is used for fast read access. + * + * @param AclInterface $acl + * @return void + */ + private function regenerateAncestorRelations(AclInterface $acl) + { + $pk = $acl->getId(); + $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk)); + $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $pk)); + + $parentAcl = $acl->getParentAcl(); + while (null !== $parentAcl) { + $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $parentAcl->getId())); + + $parentAcl = $parentAcl->getParentAcl(); + } + } + + /** + * This processes changes on an ACE related property (classFieldAces, or objectFieldAces). + * + * @param string $name + * @param array $changes + * @return void + */ + private function updateFieldAceProperty($name, array $changes) + { + $sids = new \SplObjectStorage(); + $classIds = new \SplObjectStorage(); + $currentIds = array(); + foreach ($changes[1] as $field => $new) { + for ($i=0,$c=count($new); $i<$c; $i++) { + $ace = $new[$i]; + + if (null === $ace->getId()) { + if ($sids->contains($ace->getSecurityIdentity())) { + $sid = $sids->offsetGet($ace->getSecurityIdentity()); + } else { + $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity()); + } + + $oid = $ace->getAcl()->getObjectIdentity(); + if ($classIds->contains($oid)) { + $classId = $classIds->offsetGet($oid); + } else { + $classId = $this->createOrRetrieveClassId($oid->getType()); + } + + $objectIdentityId = $name === 'classFieldAces' ? null : $ace->getAcl()->getId(); + + $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, $field, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure())); + $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, $field, $i))->fetchColumn(); + $this->loadedAces[$aceId] = $ace; + + $aceIdProperty = new \ReflectionProperty('Symfony\Component\Security\Acl\Domain\Entry', 'id'); + $aceIdProperty->setAccessible(true); + $aceIdProperty->setValue($ace, intval($aceId)); + } else { + $currentIds[$ace->getId()] = true; + } + } + } + + foreach ($changes[0] as $old) { + for ($i=0,$c=count($old); $i<$c; $i++) { + $ace = $old[$i]; + + if (!isset($currentIds[$ace->getId()])) { + $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId())); + unset($this->loadedAces[$ace->getId()]); + } + } + } + } + + /** + * This processes changes on an ACE related property (classAces, or objectAces). + * + * @param string $name + * @param array $changes + * @return void + */ + private function updateAceProperty($name, array $changes) + { + list($old, $new) = $changes; + + $sids = new \SplObjectStorage(); + $classIds = new \SplObjectStorage(); + $currentIds = array(); + for ($i=0,$c=count($new); $i<$c; $i++) { + $ace = $new[$i]; + + if (null === $ace->getId()) { + if ($sids->contains($ace->getSecurityIdentity())) { + $sid = $sids->offsetGet($ace->getSecurityIdentity()); + } else { + $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity()); + } + + $oid = $ace->getAcl()->getObjectIdentity(); + if ($classIds->contains($oid)) { + $classId = $classIds->offsetGet($oid); + } else { + $classId = $this->createOrRetrieveClassId($oid->getType()); + } + + $objectIdentityId = $name === 'classAces' ? null : $ace->getAcl()->getId(); + + $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, null, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure())); + $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, null, $i))->fetchColumn(); + $this->loadedAces[$aceId] = $ace; + + $aceIdProperty = new \ReflectionProperty($ace, 'id'); + $aceIdProperty->setAccessible(true); + $aceIdProperty->setValue($ace, intval($aceId)); + } else { + $currentIds[$ace->getId()] = true; + } + } + + for ($i=0,$c=count($old); $i<$c; $i++) { + $ace = $old[$i]; + + if (!isset($currentIds[$ace->getId()])) { + $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId())); + unset($this->loadedAces[$ace->getId()]); + } + } + } + + /** + * Persists the changes which were made to ACEs to the database. + * + * @param \SplObjectStorage $aces + * @return void + */ + private function updateAces(\SplObjectStorage $aces) + { + foreach ($aces as $ace) { + $propertyChanges = $aces->offsetGet($ace); + $sets = array(); + + if (isset($propertyChanges['mask'])) { + $sets[] = sprintf('mask = %d', $propertyChanges['mask'][1]); + } + if (isset($propertyChanges['strategy'])) { + $sets[] = sprintf('granting_strategy = %s', $this->connection->quote($propertyChanges['strategy'])); + } + if (isset($propertyChanges['aceOrder'])) { + $sets[] = sprintf('ace_order = %d', $propertyChanges['aceOrder'][1]); + } + if (isset($propertyChanges['auditSuccess'])) { + $sets[] = sprintf('audit_success = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditSuccess'][1])); + } + if (isset($propertyChanges['auditFailure'])) { + $sets[] = sprintf('audit_failure = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditFailure'][1])); + } + + $this->connection->executeQuery($this->getUpdateAccessControlEntrySql($ace->getId(), $sets)); + } + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php new file mode 100644 index 00000000..bda2cc21 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php @@ -0,0 +1,15 @@ +test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test2() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test3() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test4() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test5() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test6() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test7() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test8() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test9() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test10() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test11() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test12() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test13() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test14() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test15() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test16() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test17() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test18() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test19() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test20() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test21() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test22() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test23() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test24() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test25() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test26() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test27() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test28() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test29() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test30() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test31() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test32() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test33() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test34() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test35() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test36() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test37() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test38() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test39() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php new file mode 100644 index 00000000..1dae104a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php @@ -0,0 +1,5 @@ +test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test2() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test3() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test4() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test5() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test6() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test7() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test8() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test9() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test10() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test11() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test12() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test13() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test14() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test15() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test16() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test17() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test18() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test19() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test20() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test21() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test22() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test23() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test24() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test25() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test26() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test27() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test28() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test29() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test30() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test31() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test32() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test33() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test34() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test35() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test36() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test37() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test38() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test39() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php new file mode 100644 index 00000000..58c5e6af --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php @@ -0,0 +1,13 @@ +getMethod(); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $reader->getMethodAnnotations($method); + } + $time = microtime(true) - $time; + + $this->printResults('cached reader (in-memory)', $time, $c); + } + + /** + * @group performance + */ + public function testCachedReadPerformanceWithFileCache() + { + $method = $this->getMethod(); + + // prime cache + $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir()); + $reader->getMethodAnnotations($method); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir()); + $reader->getMethodAnnotations($method); + clearstatcache(); + } + $time = microtime(true) - $time; + + $this->printResults('cached reader (file)', $time, $c); + } + + /** + * @group performance + */ + public function testReadPerformance() + { + $method = $this->getMethod(); + + $time = microtime(true); + for ($i=0,$c=150; $i<$c; $i++) { + $reader = new AnnotationReader(); + $reader->getMethodAnnotations($method); + } + $time = microtime(true) - $time; + + $this->printResults('reader', $time, $c); + } + + /** + * @group performance + */ + public function testDocParsePerformance() + { + $imports = array( + 'ignorephpdoc' => 'Annotations\Annotation\IgnorePhpDoc', + 'ignoreannotation' => 'Annotations\Annotation\IgnoreAnnotation', + 'route' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Route', + 'template' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Template', + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations\Fixtures', + ); + $ignored = array( + 'access', 'author', 'copyright', 'deprecated', 'example', 'ignore', + 'internal', 'link', 'see', 'since', 'tutorial', 'version', 'package', + 'subpackage', 'name', 'global', 'param', 'return', 'staticvar', + 'static', 'var', 'throws', 'inheritdoc', + ); + + $method = $this->getMethod(); + $methodComment = $method->getDocComment(); + $classComment = $method->getDeclaringClass()->getDocComment(); + + $time = microtime(true); + for ($i=0,$c=200; $i<$c; $i++) { + $parser = new DocParser(); + $parser->setImports($imports); + $parser->setIgnoredAnnotationNames($ignored); + $parser->setIgnoreNotImportedAnnotations(true); + + $parser->parse($methodComment); + $parser->parse($classComment); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser', $time, $c); + } + + /** + * @group performance + */ + public function testDocLexerPerformance() + { + $method = $this->getMethod(); + $methodComment = $method->getDocComment(); + $classComment = $method->getDeclaringClass()->getDocComment(); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $lexer = new DocLexer(); + $lexer->setInput($methodComment); + $lexer->setInput($classComment); + } + $time = microtime(true) - $time; + + $this->printResults('doc-lexer', $time, $c); + } + + /** + * @group performance + */ + public function testPhpParserPerformanceWithShortCut() + { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\NamespacedSingleClassLOC1000'); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $parser = new PhpParser(); + $parser->parseClass($class); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser-with-short-cut', $time, $c); + } + + /** + * @group performance + */ + public function testPhpParserPerformanceWithoutShortCut() + { + $class = new \ReflectionClass('SingleClassLOC1000'); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $parser = new PhpParser(); + $parser->parseClass($class); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser-without-short-cut', $time, $c); + } + + private function getMethod() + { + return new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\Controller', 'helloAction'); + } + + private function printResults($test, $time, $iterations) + { + if (0 == $iterations) { + throw new \InvalidArgumentException('$iterations cannot be zero.'); + } + + $title = $test." results:\n"; + $iterationsText = sprintf("Iterations: %d\n", $iterations); + $totalTime = sprintf("Total Time: %.3f s\n", $time); + $iterationTime = sprintf("Time per iteration: %.3f ms\n", $time/$iterations * 1000); + + $max = max(strlen($title), strlen($iterationTime)) - 1; + + echo "\n".str_repeat('-', $max)."\n"; + echo $title; + echo str_repeat('=', $max)."\n"; + echo $iterationsText; + echo $totalTime; + echo $iterationTime; + echo str_repeat('-', $max)."\n"; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php new file mode 100644 index 00000000..8de4aabf --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php @@ -0,0 +1,179 @@ +assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testParseClassWithMultipleImportsInUseStatement() + { + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\MultipleImportsInUseStatement'); + $parser = new PhpParser(); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testParseClassWhenNotUserDefined() + { + $parser = new PhpParser(); + $this->assertEquals(array(), $parser->parseClass(new \ReflectionClass('\stdClass'))); + } + + public function testParseClassWhenClassIsNotNamespaced() + { + $parser = new PhpParser(); + $class = new ReflectionClass('\AnnotationsTestsFixturesNonNamespacedClass'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testParseClassWhenClassIsInterface() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\TestInterface'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testClassWithFullyQualifiedUseStatements() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\ClassWithFullyQualifiedUseStatements'); + + $this->assertEquals(array( + 'secure' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testNamespaceAndClassCommentedOut() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceAndClassCommentedOut'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testEqualNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\EqualNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + ), $parser->parseClass($class)); + } + + public function testEqualNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\EqualNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testDifferentNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\DifferentNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testDifferentNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\DifferentNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testGlobalNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new \ReflectionClass('\GlobalNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + ), $parser->parseClass($class)); + } + + public function testGlobalNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass('\GlobalNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testNamespaceWithClosureDeclaration() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceWithClosureDeclaration'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testIfPointerResetsOnMultipleParsingTries() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceWithClosureDeclaration'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php new file mode 100644 index 00000000..376539ff --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php @@ -0,0 +1,97 @@ +getReader(); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassDDC1660'); + + $this->assertTrue(class_exists('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Version')); + $this->assertCount(1, $reader->getClassAnnotations($class)); + $this->assertCount(1, $reader->getMethodAnnotations($class->getMethod('bar'))); + $this->assertCount(1, $reader->getPropertyAnnotations($class->getProperty('foo'))); + } + + protected function getReader() + { + $reader = new SimpleAnnotationReader(); + $reader->addNamespace(__NAMESPACE__); + $reader->addNamespace(__NAMESPACE__ . '\Fixtures'); + $reader->addNamespace(__NAMESPACE__ . '\Fixtures\Annotation'); + + return $reader; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php new file mode 100644 index 00000000..a7b9e2f2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php @@ -0,0 +1,65 @@ +getClassAnnotations($class); + } + + public function testAnnotation() + { + $class = new \ReflectionClass(__NAMESPACE__ . '\\DCOM55Consumer'); + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $annots = $reader->getClassAnnotations($class); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf(__NAMESPACE__.'\\DCOM55Annotation', $annots[0]); + } + + public function testParseAnnotationDocblocks() + { + $class = new \ReflectionClass(__NAMESPACE__ . '\\DCOM55Annotation'); + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $annots = $reader->getClassAnnotations($class); + + $this->assertEquals(0, count($annots)); + } +} + +/** + * @Controller + */ +class Dummy +{ + +} + +/** + * @Annotation + */ +class DCOM55Annotation +{ + +} + +/** + * @DCOM55Annotation + */ +class DCOM55Consumer +{ + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php new file mode 100644 index 00000000..708bcc99 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php @@ -0,0 +1,8 @@ +getClassAnnotations(new \ReflectionClass(__NAMESPACE__."\MappedClass")); + + foreach ($result as $annot) { + $classAnnotations[get_class($annot)] = $annot; + } + + $this->assertTrue(!isset($classAnnotations['']), 'Class "xxx" is not a valid entity or mapped super class.'); + } + + public function testIssueGlobalNamespace() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->setImports(array( + "__NAMESPACE__" =>"Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping" + )); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + + public function testIssueNamespaces() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM"); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Entity", $annots[0]); + } + + public function testIssueMultipleNamespaces() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping"); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM"); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + + public function testIssueWithNamespacesOrImports() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Entity", $annots[0]); + $this->assertEquals(1, count($annots)); + } + + + public function testIssueSimpleAnnotationReader() + { + $reader = new \Doctrine\Common\Annotations\SimpleAnnotationReader(); + $reader->addNamespace('Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping'); + $annots = $reader->getClassAnnotations(new \ReflectionClass(__NAMESPACE__."\MappedClass")); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + +} + +/** + * @Entity + */ +class MappedClass +{ + +} + + +namespace Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping; +/** +* @Annotation +*/ +class Entity +{ + +} + +namespace Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM; +/** +* @Annotation +*/ +class Entity +{ + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php new file mode 100644 index 00000000..ff3ca376 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php @@ -0,0 +1,8 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of APC'); + } + } + + protected function _getCacheDriver() + { + return new ApcCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php new file mode 100644 index 00000000..71927174 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php @@ -0,0 +1,13 @@ +_getCacheDriver(); + + // Test save + $cache->save('test_key', 'testing this out'); + + // Test contains to test that save() worked + $this->assertTrue($cache->contains('test_key')); + + // Test fetch + $this->assertEquals('testing this out', $cache->fetch('test_key')); + + // Test delete + $cache->save('test_key2', 'test2'); + $cache->delete('test_key2'); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testDeleteAll() + { + $cache = $this->_getCacheDriver(); + $cache->save('test_key1', '1'); + $cache->save('test_key2', '2'); + $cache->deleteAll(); + + $this->assertFalse($cache->contains('test_key1')); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testFlushAll() + { + $cache = $this->_getCacheDriver(); + $cache->save('test_key1', '1'); + $cache->save('test_key2', '2'); + $cache->flushAll(); + + $this->assertFalse($cache->contains('test_key1')); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testNamespace() + { + $cache = $this->_getCacheDriver(); + $cache->setNamespace('test_'); + $cache->save('key1', 'test'); + + $this->assertTrue($cache->contains('key1')); + + $cache->setNamespace('test2_'); + + $this->assertFalse($cache->contains('key1')); + } + + /** + * @group DCOM-43 + */ + public function testGetStats() + { + if ($this instanceof ArrayCacheTest || $this instanceof ZendDataCacheTest ) { + $this->markTestSkipped("Statistics are not available for this driver"); + } + + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + + $this->assertArrayHasKey(Cache::STATS_HITS, $stats); + $this->assertArrayHasKey(Cache::STATS_MISSES, $stats); + $this->assertArrayHasKey(Cache::STATS_UPTIME, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_USAGE, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_AVAILIABLE, $stats); + } + + /** + * @return \Doctrine\Common\Cache\CacheProvider + */ + abstract protected function _getCacheDriver(); +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php new file mode 100644 index 00000000..362ff69a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php @@ -0,0 +1,38 @@ +_memcache = new \Memcache; + $ok = @$this->_memcache->connect('localhost', 11211); + if (!$ok) { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } else { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } + + public function testNoExpire() { + $cache = $this->_getCacheDriver(); + $cache->save('noexpire', 'value', 0); + sleep(1); + $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire'); + } + + protected function _getCacheDriver() + { + $driver = new MemcacheCache(); + $driver->setMemcache($this->_memcache); + return $driver; + } + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php new file mode 100644 index 00000000..947ba752 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php @@ -0,0 +1,40 @@ +memcached = new \Memcached(); + $this->memcached->setOption(\Memcached::OPT_COMPRESSION, false); + $this->memcached->addServer('127.0.0.1', 11211); + + $fh = @fsockopen('127.0.0.1', 11211); + if (!$fh) { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } else { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } + + public function testNoExpire() { + $cache = $this->_getCacheDriver(); + $cache->save('noexpire', 'value', 0); + sleep(1); + $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire'); + } + + protected function _getCacheDriver() + { + $driver = new MemcachedCache(); + $driver->setMemcached($this->memcached); + return $driver; + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php new file mode 100644 index 00000000..cb363df9 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of Wincache'); + } + } + + protected function _getCacheDriver() + { + return new WincacheCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php new file mode 100644 index 00000000..62598487 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of xcache'); + } + } + + protected function _getCacheDriver() + { + return new XcacheCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php new file mode 100644 index 00000000..27dcf359 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of Zend Data Cache which only works in apache2handler SAPI'); + } + } + + protected function _getCacheDriver() + { + return new ZendDataCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php new file mode 100644 index 00000000..567cf918 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php @@ -0,0 +1,45 @@ +setIncludePath(__DIR__); + $classLoader->setFileExtension('.class.php'); + $classLoader->setNamespaceSeparator('_'); + + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassA')); + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassB')); + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassC')); + $this->assertFalse($classLoader->canLoadClass('OtherClass')); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassA'), true); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassB'), true); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassC'), true); + } + + public function testClassExists() + { + $this->assertFalse(ClassLoader::classExists('ClassLoaderTest\ClassD')); + $badLoader = function($className) { + require __DIR__ . '/ClassLoaderTest/ClassD.php'; + return true; + }; + spl_autoload_register($badLoader); + $this->assertTrue(ClassLoader::classExists('ClassLoaderTest\ClassD')); + spl_autoload_unregister($badLoader); + } + + public function testGetClassLoader() + { + $cl = new ClassLoader('ClassLoaderTest', __DIR__); + $cl->register(); + $this->assertTrue(ClassLoader::getClassLoader('ClassLoaderTest\ClassD') instanceof \Doctrine\Common\ClassLoader); + $this->assertNull(ClassLoader::getClassLoader('This\Class\Does\Not\Exist')); + $cl->unregister(); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php new file mode 100644 index 00000000..85546547 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php @@ -0,0 +1,6 @@ +_coll = new \Doctrine\Common\Collections\ArrayCollection; + } + + public function testIssetAndUnset() + { + $this->assertFalse(isset($this->_coll[0])); + $this->_coll->add('testing'); + $this->assertTrue(isset($this->_coll[0])); + unset($this->_coll[0]); + $this->assertFalse(isset($this->_coll[0])); + } + + public function testToString() + { + $this->_coll->add('testing'); + $this->assertTrue(is_string((string) $this->_coll)); + } + + public function testRemovingNonExistentEntryReturnsNull() + { + $this->assertEquals(null, $this->_coll->remove('testing_does_not_exist')); + } + + public function testExists() + { + $this->_coll->add("one"); + $this->_coll->add("two"); + $exists = $this->_coll->exists(function($k, $e) { return $e == "one"; }); + $this->assertTrue($exists); + $exists = $this->_coll->exists(function($k, $e) { return $e == "other"; }); + $this->assertFalse($exists); + } + + public function testMap() + { + $this->_coll->add(1); + $this->_coll->add(2); + $res = $this->_coll->map(function($e) { return $e * 2; }); + $this->assertEquals(array(2, 4), $res->toArray()); + } + + public function testFilter() + { + $this->_coll->add(1); + $this->_coll->add("foo"); + $this->_coll->add(3); + $res = $this->_coll->filter(function($e) { return is_numeric($e); }); + $this->assertEquals(array(0 => 1, 2 => 3), $res->toArray()); + } + + public function testFirstAndLast() + { + $this->_coll->add('one'); + $this->_coll->add('two'); + + $this->assertEquals($this->_coll->first(), 'one'); + $this->assertEquals($this->_coll->last(), 'two'); + } + + public function testArrayAccess() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + + $this->assertEquals($this->_coll[0], 'one'); + $this->assertEquals($this->_coll[1], 'two'); + + unset($this->_coll[0]); + $this->assertEquals($this->_coll->count(), 1); + } + + public function testContainsKey() + { + $this->_coll[5] = 'five'; + $this->assertTrue($this->_coll->containsKey(5)); + } + + public function testContains() + { + $this->_coll[0] = 'test'; + $this->assertTrue($this->_coll->contains('test')); + } + + public function testSearch() + { + $this->_coll[0] = 'test'; + $this->assertEquals(0, $this->_coll->indexOf('test')); + } + + public function testGet() + { + $this->_coll[0] = 'test'; + $this->assertEquals('test', $this->_coll->get(0)); + } + + public function testGetKeys() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals(array(0, 1), $this->_coll->getKeys()); + } + + public function testGetValues() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals(array('one', 'two'), $this->_coll->getValues()); + } + + public function testCount() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals($this->_coll->count(), 2); + $this->assertEquals(count($this->_coll), 2); + } + + public function testForAll() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_string($e); }), true); + $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_array($e); }), false); + } + + public function testPartition() + { + $this->_coll[] = true; + $this->_coll[] = false; + $partition = $this->_coll->partition(function($k, $e) { return $e == true; }); + $this->assertEquals($partition[0][0], true); + $this->assertEquals($partition[1][0], false); + } + + public function testClear() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->_coll->clear(); + $this->assertEquals($this->_coll->isEmpty(), true); + } + + public function testRemove() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $el = $this->_coll->remove(0); + + $this->assertEquals('one', $el); + $this->assertEquals($this->_coll->contains('one'), false); + $this->assertNull($this->_coll->remove(0)); + } + + public function testRemoveElement() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + + $this->assertTrue($this->_coll->removeElement('two')); + $this->assertFalse($this->_coll->contains('two')); + $this->assertFalse($this->_coll->removeElement('two')); + } + + public function testSlice() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->_coll[] = 'three'; + + $slice = $this->_coll->slice(0, 1); + $this->assertInternalType('array', $slice); + $this->assertEquals(array('one'), $slice); + + $slice = $this->_coll->slice(1); + $this->assertEquals(array(1 => 'two', 2 => 'three'), $slice); + + $slice = $this->_coll->slice(1, 1); + $this->assertEquals(array(1 => 'two'), $slice); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php new file mode 100644 index 00000000..e69de29b diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php new file mode 100644 index 00000000..2b11b20e --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php @@ -0,0 +1,88 @@ +_eventManager = new EventManager; + $this->_preFooInvoked = false; + $this->_postFooInvoked = false; + } + + public function testInitialState() + { + $this->assertEquals(array(), $this->_eventManager->getListeners()); + $this->assertFalse($this->_eventManager->hasListeners(self::preFoo)); + $this->assertFalse($this->_eventManager->hasListeners(self::postFoo)); + } + + public function testAddEventListener() + { + $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); + $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); + $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); + $this->assertEquals(1, count($this->_eventManager->getListeners(self::preFoo))); + $this->assertEquals(1, count($this->_eventManager->getListeners(self::postFoo))); + $this->assertEquals(2, count($this->_eventManager->getListeners())); + } + + public function testDispatchEvent() + { + $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); + $this->_eventManager->dispatchEvent(self::preFoo); + $this->assertTrue($this->_preFooInvoked); + $this->assertFalse($this->_postFooInvoked); + } + + public function testRemoveEventListener() + { + $this->_eventManager->addEventListener(array('preBar'), $this); + $this->assertTrue($this->_eventManager->hasListeners(self::preBar)); + $this->_eventManager->removeEventListener(array('preBar'), $this); + $this->assertFalse($this->_eventManager->hasListeners(self::preBar)); + } + + public function testAddEventSubscriber() + { + $eventSubscriber = new TestEventSubscriber(); + $this->_eventManager->addEventSubscriber($eventSubscriber); + $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); + $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); + } + + /* Listener methods */ + + public function preFoo(EventArgs $e) + { + $this->_preFooInvoked = true; + } + + public function postFoo(EventArgs $e) + { + $this->_postFooInvoked = true; + } +} + +class TestEventSubscriber implements \Doctrine\Common\EventSubscriber +{ + public function getSubscribedEvents() + { + return array('preFoo', 'postFoo'); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php new file mode 100644 index 00000000..e1825ae2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php @@ -0,0 +1,94 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver1->expects($this->never()) + ->method('loadMetadataForClass'); + $driver1->expectS($this->never()) + ->method('isTransient'); + + $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver2->expects($this->at(0)) + ->method('loadMetadataForClass') + ->with($this->equalTo($className), $this->equalTo($classMetadata)); + $driver2->expects($this->at(1)) + ->method('isTransient') + ->with($this->equalTo($className)) + ->will($this->returnValue( true )); + + $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); + $chain->addDriver($driver2, 'Doctrine\Tests\Common\Persistence\Mapping'); + + $chain->loadMetadataForClass($className, $classMetadata); + + $this->assertTrue( $chain->isTransient($className) ); + } + + public function testLoadMetadata_NoDelegatorFound_ThrowsMappingException() + { + $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; + $classMetadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $this->setExpectedException('Doctrine\Common\Persistence\Mapping\MappingException'); + $chain->loadMetadataForClass($className, $classMetadata); + } + + public function testGatherAllClassNames() + { + $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; + $classMetadata = $this->getMock('Doctrine\Common\Peristence\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver1->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Doctrine\Tests\Models\Company\Foo'))); + + $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver2->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Doctrine\Tests\ORM\Mapping\Bar', 'Doctrine\Tests\ORM\Mapping\Baz', 'FooBarBaz'))); + + $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); + $chain->addDriver($driver2, 'Doctrine\Tests\ORM\Mapping'); + + $this->assertEquals(array( + 'Doctrine\Tests\Models\Company\Foo', + 'Doctrine\Tests\ORM\Mapping\Bar', + 'Doctrine\Tests\ORM\Mapping\Baz' + ), $chain->getAllClassNames()); + } + + /** + * @group DDC-706 + */ + public function testIsTransient() + { + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $chain = new MappingDriverChain(); + $chain->addDriver($driver1, 'Doctrine\Tests\Models\CMS'); + + $this->assertTrue($chain->isTransient('stdClass'), "stdClass isTransient"); + } +} + +class DriverChainEntity +{ + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php new file mode 100644 index 00000000..9fe32994 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php @@ -0,0 +1,134 @@ +getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $this->cmf = new TestClassMetadataFactory($driver, $metadata); + } + + public function testGetCacheDriver() + { + $this->assertNull($this->cmf->getCacheDriver()); + $cache = new ArrayCache(); + $this->cmf->setCacheDriver($cache); + $this->assertSame($cache, $this->cmf->getCacheDriver()); + } + + public function testGetMetadataFor() + { + $metadata = $this->cmf->getMetadataFor('stdClass'); + + $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); + $this->assertTrue($this->cmf->hasMetadataFor('stdClass')); + } + + public function testGetParentMetadata() + { + $metadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + + $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\RootEntity')); + } + + public function testGetCachedMetadata() + { + $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $cache = new ArrayCache(); + $cache->save(__NAMESPACE__. '\ChildEntity$CLASSMETADATA', $metadata); + + $this->cmf->setCacheDriver($cache); + + $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + $this->assertSame($loadedMetadata, $metadata); + } + + public function testCacheGetMetadataFor() + { + $cache = new ArrayCache(); + $this->cmf->setCacheDriver($cache); + + $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + + $this->assertSame($loadedMetadata, $cache->fetch(__NAMESPACE__. '\ChildEntity$CLASSMETADATA')); + } + + public function testGetAliasedMetadata() + { + $loadedMetadata = $this->cmf->getMetadataFor('prefix:ChildEntity'); + + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); + $this->assertTrue($this->cmf->hasMetadataFor('prefix:ChildEntity')); + } +} + +class TestClassMetadataFactory extends AbstractClassMetadataFactory +{ + public $driver; + public $metadata; + + public function __construct($driver, $metadata) + { + $this->driver = $driver; + $this->metadata = $metadata; + } + + protected function doLoadMetadata($class, $parent, $rootEntityFound) + { + + } + + protected function getFqcnFromAlias($namespaceAlias, $simpleClassName) + { + return __NAMESPACE__ . '\\' . $simpleClassName; + } + + protected function initialize() + { + + } + + protected function newClassMetadataInstance($className) + { + return $this->metadata; + } + + protected function getDriver() + { + return $this->driver; + } + protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService) + { + } + + protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService) + { + } +} + +class RootEntity +{ + +} + +class ChildEntity extends RootEntity +{ + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php new file mode 100644 index 00000000..3c600c40 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php @@ -0,0 +1,90 @@ +assertEquals(array($path), $locator->getPaths()); + + $locator = new DefaultFileLocator($path); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testGetFileExtension() + { + $locator = new DefaultFileLocator(array(), ".yml"); + $this->assertEquals(".yml", $locator->getFileExtension()); + $locator->setFileExtension(".xml"); + $this->assertEquals(".xml", $locator->getFileExtension()); + } + + public function testUniquePaths() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path, $path)); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testFindMappingFile() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->assertEquals(__DIR__ . '/_files/stdClass.yml', $locator->findMappingFile('stdClass')); + } + + public function testFindMappingFileNotFound() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->setExpectedException( + 'Doctrine\Common\Persistence\Mapping\MappingException', + "No mapping file found named 'stdClass2.yml' for class 'stdClass2'" + ); + $locator->findMappingFile('stdClass2'); + } + + public function testGetAllClassNames() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + $classes = $locator->getAllClassNames(null); + sort($classes); + + $this->assertEquals(array('global', 'stdClass'), $classes); + $this->assertEquals(array('stdClass'), $locator->getAllClassNames("global")); + } + + public function testGetAllClassNamesNonMatchingFileExtension() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".xml"); + $this->assertEquals(array(), $locator->getAllClassNames("global")); + } + + public function testFileExists() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->assertTrue($locator->fileExists("stdClass")); + $this->assertFalse($locator->fileExists("stdClass2")); + $this->assertTrue($locator->fileExists("global")); + $this->assertFalse($locator->fileExists("global2")); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php new file mode 100644 index 00000000..020c2424 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php @@ -0,0 +1,142 @@ +assertNull($driver->getGlobalBasename()); + + $driver->setGlobalBasename("global"); + $this->assertEquals("global", $driver->getGlobalBasename()); + } + + public function testGetElementFromGlobalFile() + { + $driver = new TestFileDriver($this->newLocator()); + $driver->setGlobalBasename("global"); + + $element = $driver->getElement('stdGlobal'); + + $this->assertEquals('stdGlobal', $element); + } + + public function testGetElementFromFile() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('findMappingFile') + ->with($this->equalTo('stdClass')) + ->will($this->returnValue(__DIR__ . '/_files/stdClass.yml')); + + $driver = new TestFileDriver($locator); + + $this->assertEquals('stdClass', $driver->getElement('stdClass')); + } + + public function testGetAllClassNamesGlobalBasename() + { + $driver = new TestFileDriver($this->newLocator()); + $driver->setGlobalBasename("global"); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdGlobal', 'stdGlobal2'), $classNames); + } + + public function testGetAllClassNamesFromMappingFile() + { + $locator = $this->newLocator(); + $locator->expects($this->any()) + ->method('getAllClassNames') + ->with($this->equalTo(null)) + ->will($this->returnValue(array('stdClass'))); + $driver = new TestFileDriver($locator); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdClass'), $classNames); + } + + public function testGetAllClassNamesBothSources() + { + $locator = $this->newLocator(); + $locator->expects($this->any()) + ->method('getAllClassNames') + ->with($this->equalTo('global')) + ->will($this->returnValue(array('stdClass'))); + $driver = new TestFileDriver($locator); + $driver->setGlobalBasename("global"); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdGlobal', 'stdGlobal2', 'stdClass'), $classNames); + } + + public function testIsNotTransient() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('fileExists') + ->with($this->equalTo('stdClass')) + ->will($this->returnValue( true )); + + $driver = new TestFileDriver($locator); + $driver->setGlobalBasename("global"); + + $this->assertFalse($driver->isTransient('stdClass')); + $this->assertFalse($driver->isTransient('stdGlobal')); + $this->assertFalse($driver->isTransient('stdGlobal2')); + } + + public function testIsTransient() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('fileExists') + ->with($this->equalTo('stdClass2')) + ->will($this->returnValue( false )); + + $driver = new TestFileDriver($locator); + + $this->assertTrue($driver->isTransient('stdClass2')); + } + + public function testNonLocatorFallback() + { + $driver = new TestFileDriver(__DIR__ . '/_files', '.yml'); + $this->assertTrue($driver->isTransient('stdClass2')); + $this->assertFalse($driver->isTransient('stdClass')); + } + + private function newLocator() + { + $locator = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\FileLocator'); + $locator->expects($this->any())->method('getFileExtension')->will($this->returnValue('.yml')); + $locator->expects($this->any())->method('getPaths')->will($this->returnValue(array(__DIR__ . "/_files"))); + return $locator; + } +} + +class TestFileDriver extends FileDriver +{ + protected function loadMappingFile($file) + { + if (strpos($file, "global.yml") !== false) { + return array('stdGlobal' => 'stdGlobal', 'stdGlobal2' => 'stdGlobal2'); + } + return array('stdClass' => 'stdClass'); + } + + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php new file mode 100644 index 00000000..8fc4d807 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php @@ -0,0 +1,18 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $metadata->expects($this->once())->method('getFieldNames'); + + $driver = new PHPDriver(array(__DIR__ . "/_files")); + $driver->loadMetadataForClass('TestEntity', $metadata); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php new file mode 100644 index 00000000..5f06cad9 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Tests\Common\Persistence\Mapping; + +use Doctrine\Common\Persistence\Mapping\RuntimeReflectionService; + +/** + * @group DCOM-93 + */ +class RuntimeReflectionServiceTest extends \PHPUnit_Framework_TestCase +{ + private $reflectionService; + + public function setUp() + { + $this->reflectionService = new RuntimeReflectionService(); + } + + public function testShortname() + { + $this->assertEquals("RuntimeReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); + } + + public function testClassNamespaceName() + { + $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); + } + + public function testGetParentClasses() + { + $classes = $this->reflectionService->getParentClasses(__CLASS__); + $this->assertTrue(count($classes) >= 1, "The test class ".__CLASS__." should have at least one parent."); + } + + public function testGetReflectionClass() + { + $class = $this->reflectionService->getClass(__CLASS__); + $this->assertInstanceOf("ReflectionClass", $class); + } + + public function testGetMethods() + { + $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); + $this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); + } + + public function testGetAccessibleProperty() + { + $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); + $this->assertInstanceOf("ReflectionProperty", $reflProp); + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php new file mode 100644 index 00000000..9f1c5684 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php @@ -0,0 +1,35 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $metadata->expects($this->once())->method('getFieldNames'); + + $driver = new StaticPHPDriver(array(__DIR__)); + $driver->loadMetadataForClass(__NAMESPACE__ . '\\TestEntity', $metadata); + } + + public function testGetAllClassNames() + { + $driver = new StaticPHPDriver(array(__DIR__)); + $classNames = $driver->getAllClassNames(); + + $this->assertContains( + 'Doctrine\Tests\Common\Persistence\Mapping\TestEntity', $classNames); + } +} + +class TestEntity +{ + static public function loadMetadata($metadata) + { + $metadata->getFieldNames(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php new file mode 100644 index 00000000..ffce6d40 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Tests\Common\Persistence\Mapping; + +use Doctrine\Common\Persistence\Mapping\StaticReflectionService; + +/** + * @group DCOM-93 + */ +class StaticReflectionServiceTest extends \PHPUnit_Framework_TestCase +{ + private $reflectionService; + + public function setUp() + { + $this->reflectionService = new StaticReflectionService(); + } + + public function testShortname() + { + $this->assertEquals("StaticReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); + } + + public function testClassNamespaceName() + { + $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); + } + + public function testGetParentClasses() + { + $classes = $this->reflectionService->getParentClasses(__CLASS__); + $this->assertTrue(count($classes) == 0, "The test class ".__CLASS__." should have no parents according to static reflection."); + } + + public function testGetReflectionClass() + { + $class = $this->reflectionService->getClass(__CLASS__); + $this->assertNull($class); + } + + public function testGetMethods() + { + $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); + $this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); + } + + public function testGetAccessibleProperty() + { + $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); + $this->assertNull($reflProp); + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php new file mode 100644 index 00000000..b51162e6 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php @@ -0,0 +1,88 @@ + $prefix)); + $this->assertEquals(array($path), $locator->getPaths()); + + $locator = new SymfonyFileLocator(array($path => $prefix)); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testGetPrefixes() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix)); + $this->assertEquals(array($path => $prefix), $locator->getNamespacePrefixes()); + } + + public function testGetFileExtension() + { + $locator = new SymfonyFileLocator(array(), ".yml"); + $this->assertEquals(".yml", $locator->getFileExtension()); + $locator->setFileExtension(".xml"); + $this->assertEquals(".xml", $locator->getFileExtension()); + } + + public function testFileExists() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->assertTrue($locator->fileExists("Foo\stdClass")); + $this->assertTrue($locator->fileExists("Foo\global")); + $this->assertFalse($locator->fileExists("Foo\stdClass2")); + $this->assertFalse($locator->fileExists("Foo\global2")); + } + + public function testGetAllClassNames() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + $classes = $locator->getAllClassNames(null); + sort($classes); + + $this->assertEquals(array("Foo\\global", "Foo\\stdClass"), $classes); + $this->assertEquals(array("Foo\\stdClass"), $locator->getAllClassNames("global")); + } + + public function testFindMappingFile() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->assertEquals(__DIR__ . "/_files/stdClass.yml", $locator->findMappingFile("Foo\\stdClass")); + } + + public function testFindMappingFileNotFound() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->setExpectedException( + "Doctrine\Common\Persistence\Mapping\MappingException", + "No mapping file found named '".__DIR__."/_files/stdClass2.yml' for class 'Foo\stdClass2'." + ); + $locator->findMappingFile("Foo\\stdClass2"); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php new file mode 100644 index 00000000..d0e9976a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php @@ -0,0 +1,3 @@ +getFieldNames(); \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php new file mode 100644 index 00000000..a0f77b50 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php @@ -0,0 +1,247 @@ +cm = new TestObjectMetadata; + $this->om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); + $this->om->expects($this->any())->method('getClassMetadata') + ->will($this->returnValue($this->cm)); + $this->object = new TestObject; + PersistentObject::setObjectManager($this->om); + $this->object->injectObjectManager($this->om, $this->cm); + } + + public function testGetObjectManager() + { + $this->assertSame($this->om, PersistentObject::getObjectManager()); + } + + public function testNonMatchingObjectManager() + { + $this->setExpectedException('RuntimeException'); + $om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); + $this->object->injectObjectManager($om, $this->cm); + } + + public function testGetField() + { + $this->assertEquals('beberlei', $this->object->getName()); + } + + public function testSetField() + { + $this->object->setName("test"); + $this->assertEquals("test", $this->object->getName()); + } + + public function testGetIdentifier() + { + $this->assertEquals(1, $this->object->getId()); + } + + public function testSetIdentifier() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->setId(2); + } + + public function testSetUnknownField() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->setUnknown("test"); + } + + public function testGetUnknownField() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->getUnknown(); + } + + public function testGetToOneAssociation() + { + $this->assertNull($this->object->getParent()); + } + + public function testSetToOneAssociation() + { + $parent = new TestObject(); + $this->object->setParent($parent); + $this->assertSame($parent, $this->object->getParent($parent)); + } + + public function testSetInvalidToOneAssocation() + { + $parent = new \stdClass(); + + $this->setExpectedException('InvalidArgumentException'); + $this->object->setParent($parent); + } + + public function testSetToOneAssociationNull() + { + $parent = new TestObject(); + $this->object->setParent($parent); + $this->object->setParent(null); + $this->assertNull($this->object->getParent()); + } + + public function testAddToManyAssocation() + { + $child = new TestObject(); + $this->object->addChildren($child); + + $this->assertSame($this->object, $child->getParent()); + $this->assertEquals(1, count($this->object->getChildren())); + + $child = new TestObject(); + $this->object->addChildren($child); + + $this->assertEquals(2, count($this->object->getChildren())); + } + + public function testAddInvalidToManyAssocation() + { + $this->setExpectedException('InvalidArgumentException'); + $this->object->addChildren(new \stdClass()); + } + + public function testNoObjectManagerSet() + { + PersistentObject::setObjectManager(null); + $child = new TestObject(); + + $this->setExpectedException('RuntimeException'); + $child->setName("test"); + } + + public function testInvalidMethod() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->asdf(); + } + + public function testAddInvalidCollection() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->addAsdf(new \stdClass()); + } +} + +class TestObject extends PersistentObject +{ + protected $id = 1; + protected $name = 'beberlei'; + protected $parent; + protected $children; +} + +class TestObjectMetadata implements ClassMetadata +{ + + public function getAssociationMappedByTargetField($assocName) + { + $assoc = array('children' => 'parent'); + return $assoc[$assocName]; + } + + public function getAssociationNames() + { + return array('parent', 'children'); + } + + public function getAssociationTargetClass($assocName) + { + return __NAMESPACE__ . '\TestObject'; + } + + public function getFieldNames() + { + return array('id', 'name'); + } + + public function getIdentifier() + { + return array('id'); + } + + public function getName() + { + return __NAMESPACE__ . '\TestObject'; + } + + public function getReflectionClass() + { + return new \ReflectionClass($this->getName()); + } + + public function getTypeOfField($fieldName) + { + $types = array('id' => 'integer', 'name' => 'string'); + return $types[$fieldName]; + } + + public function hasAssociation($fieldName) + { + return in_array($fieldName, array('parent', 'children')); + } + + public function hasField($fieldName) + { + return in_array($fieldName, array('id', 'name')); + } + + public function isAssociationInverseSide($assocName) + { + return ($assocName === 'children'); + } + + public function isCollectionValuedAssociation($fieldName) + { + return ($fieldName === 'children'); + } + + public function isIdentifier($fieldName) + { + return $fieldName === 'id'; + } + + public function isSingleValuedAssociation($fieldName) + { + return $fieldName === 'parent'; + } + + public function getIdentifierValues($entity) + { + + } + + public function getIdentifierFieldNames() + { + + } + + public function initializeReflection(ReflectionService $reflService) + { + + } + + public function wakeupReflection(ReflectionService $reflService) + { + + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php new file mode 100644 index 00000000..a2814500 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php @@ -0,0 +1,100 @@ +assertEquals($expectedClassName, ClassUtils::getRealClass($className)); + } + + /** + * @dataProvider dataGetClass + */ + public function testGetClass( $className, $expectedClassName ) + { + $object = new $className(); + $this->assertEquals($expectedClassName, ClassUtils::getClass($object)); + } + + public function testGetParentClass() + { + $parentClass = ClassUtils::getParentClass( 'MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject' ); + $this->assertEquals('stdClass', $parentClass); + } + + public function testGenerateProxyClassName() + { + $this->assertEquals( 'Proxies\__CG__\stdClass', ClassUtils::generateProxyClassName( 'stdClass', 'Proxies' ) ); + } + + /** + * @dataProvider dataGetClass + */ + public function testNewReflectionClass( $className, $expectedClassName ) + { + $reflClass = ClassUtils::newReflectionClass( $className ); + $this->assertEquals( $expectedClassName, $reflClass->getName() ); + } + + /** + * @dataProvider dataGetClass + */ + public function testNewReflectionObject( $className, $expectedClassName ) + { + $object = new $className; + $reflClass = ClassUtils::newReflectionObject( $object ); + $this->assertEquals( $expectedClassName, $reflClass->getName() ); + } + } + + class ChildObject extends \stdClass + { + } +} + +namespace MyProject\Proxies\__CG__ +{ + class stdClass extends \stdClass + { + } +} + +namespace MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util +{ + class ChildObject extends \Doctrine\Tests\Common\Util\ChildObject + { + } +} + +namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__ +{ + class stdClass extends \MyProject\Proxies\__CG__\stdClass + { + } +} + +namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util +{ + class ChildObject extends \MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject + { + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php new file mode 100644 index 00000000..b4e9eed2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php @@ -0,0 +1,27 @@ +foo = "bar"; + $obj->bar = 1234; + + $var = Debug::export($obj, 2); + $this->assertEquals( "stdClass", $var->__CLASS__ ); + } + + public function testExportDateTime() + { + $obj = new \DateTime( "2010-10-10 10:10:10" ); + + $var = Debug::export( $obj, 2 ); + $this->assertEquals( "DateTime", $var->__CLASS__ ); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php b/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php new file mode 100644 index 00000000..e8323d29 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php @@ -0,0 +1,10 @@ + + */ +class NativePhpunitTask extends Task +{ + private $test; + private $testfile; + private $testdirectory; + private $configuration = null; + private $coverageClover = null; + private $junitlogfile = null; + private $haltonfailure = true; + private $haltonerror = true; + + public function setTestdirectory($directory) { + $this->testdirectory = $directory; + } + + public function setTest($test) { + $this->test = $test; + } + + public function setTestfile($testfile) { + $this->testfile = $testfile; + } + + public function setJunitlogfile($junitlogfile) { + if (strlen($junitlogfile) == 0) { + $junitlogfile = NULL; + } + + $this->junitlogfile = $junitlogfile; + } + + public function setConfiguration($configuration) { + if (strlen($configuration) == 0) { + $configuration = NULL; + } + + $this->configuration = $configuration; + } + + public function setCoverageClover($coverageClover) { + if (strlen($coverageClover) == 0) { + $coverageClover = NULL; + } + + $this->coverageClover = $coverageClover; + } + + public function setHaltonfailure($haltonfailures) { + $this->haltonfailure = $haltonfailures; + } + + public function setHaltonerror($haltonerrors) { + $this->haltonerror = $haltonerrors; + } + + public function init() + { + require_once "PHPUnit/Runner/Version.php"; + $version = PHPUnit_Runner_Version::id(); + + if (version_compare($version, '3.4.0') < 0) { + throw new BuildException("NativePHPUnitTask requires PHPUnit version >= 3.2.0", $this->getLocation()); + } + + require_once 'PHPUnit/Util/Filter.php'; + + // point PHPUnit_MAIN_METHOD define to non-existing method + if (!defined('PHPUnit_MAIN_METHOD')) { + define('PHPUnit_MAIN_METHOD', 'PHPUnitTask::undefined'); + } + } + + public function main() + { + if (!is_dir(realpath($this->testdirectory))) { + throw new BuildException("NativePHPUnitTask requires a Test Directory path given, '".$this->testdirectory."' given."); + } + set_include_path(realpath($this->testdirectory) . PATH_SEPARATOR . get_include_path()); + + $printer = new NativePhpunitPrinter(); + + $arguments = array( + 'configuration' => $this->configuration, + 'coverageClover' => $this->coverageClover, + 'junitLogfile' => $this->junitlogfile, + 'printer' => $printer, + ); + + $runner = new PHPUnit_TextUI_TestRunner(); + $suite = $runner->getTest($this->test, $this->testfile, true); + + try { + $result = $runner->doRun($suite, $arguments); + /* @var $result PHPUnit_Framework_TestResult */ + + if ( ($this->haltonfailure && $result->failureCount() > 0) || ($this->haltonerror && $result->errorCount() > 0) ) { + throw new BuildException("PHPUnit: ".$result->failureCount()." Failures and ".$result->errorCount()." Errors, ". + "last failure message: ".$printer->getMessages()); + } + + $this->log("PHPUnit Success: ".count($result->passed())." tests passed, no ". + "failures (".$result->skippedCount()." skipped, ".$result->notImplementedCount()." not implemented)"); + + // Hudson for example doesn't like the backslash in class names + if (file_exists($this->coverageClover)) { + $this->log("Generated Clover Coverage XML to: ".$this->coverageClover); + $content = file_get_contents($this->coverageClover); + $content = str_replace("\\", ".", $content); + file_put_contents($this->coverageClover, $content); + unset($content); + } + + } catch(\Exception $e) { + throw new BuildException("NativePhpunitTask failed: ".$e->getMessage()); + } + } +} + +class NativePhpunitPrinter extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener +{ + private $_messages = array(); + + public function write($buffer) + { + // do nothing + } + + public function getMessages() + { + return $this->_messages; + } + + /** + * An error occurred. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + */ + public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) + { + $this->_messages[] = "Test ERROR: ".$test->getName().": ".$e->getMessage(); + } + + /** + * A failure occurred. + * + * @param PHPUnit_Framework_Test $test + * @param PHPUnit_Framework_AssertionFailedError $e + * @param float $time + */ + public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) + { + $this->_messages[] = "Test FAILED: ".$test->getName().": ".$e->getMessage(); + } + + /** + * Incomplete test. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + */ + public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) + { + + } + + /** + * Skipped test. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + * @since Method available since Release 3.0.0 + */ + public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) + { + + } + + /** + * A test suite started. + * + * @param PHPUnit_Framework_TestSuite $suite + * @since Method available since Release 2.2.0 + */ + public function startTestSuite(PHPUnit_Framework_TestSuite $suite) + { + + } + + /** + * A test suite ended. + * + * @param PHPUnit_Framework_TestSuite $suite + * @since Method available since Release 2.2.0 + */ + public function endTestSuite(PHPUnit_Framework_TestSuite $suite) + { + + } + + /** + * A test started. + * + * @param PHPUnit_Framework_Test $test + */ + public function startTest(PHPUnit_Framework_Test $test) + { + + } + + /** + * A test ended. + * + * @param PHPUnit_Framework_Test $test + * @param float $time + */ + public function endTest(PHPUnit_Framework_Test $test, $time) + { + + } +} diff --git a/vendor/doctrine/common/tests/README.markdown b/vendor/doctrine/common/tests/README.markdown new file mode 100644 index 00000000..e6f1703d --- /dev/null +++ b/vendor/doctrine/common/tests/README.markdown @@ -0,0 +1,27 @@ +# Running the Doctrine 2 Testsuite + +## Running tests + +Execute PHPUnit in the root folder of your doctrine-common clone. + + phpunit + +## Testing Lock-Support + +The Lock support in Doctrine 2 is tested using Gearman, which allows to run concurrent tasks in parallel. +Install Gearman with PHP as follows: + +1. Go to http://www.gearman.org and download the latest Gearman Server +2. Compile it and then call ldconfig +3. Start it up "gearmand -vvvv" +4. Install pecl/gearman by calling "gearman-beta" + +You can then go into tests/ and start up two workers: + + php Doctrine/Tests/ORM/Functional/Locking/LockAgentWorker.php + +Then run the locking test-suite: + + phpunit --configuration Doctrine/Tests/ORM/Functional/Locking/GearmanLockTest.php + +This can run considerable time, because it is using sleep() to test for the timing ranges of locks. \ No newline at end of file From 0620d1eaa50097e65ad0a425b8a81c42e6150c93 Mon Sep 17 00:00:00 2001 From: "cheresharov@hotmail.com" <> Date: Tue, 12 Feb 2013 16:38:40 +0000 Subject: [PATCH 107/180] Fixing README.db, .gitignore, index.phtml --- .gitignore | 165 ------------------ README.md | 3 - .../view/application/index/index.phtml | 1 - 3 files changed, 169 deletions(-) diff --git a/.gitignore b/.gitignore index 314d4af3..ad907fa5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,167 +1,3 @@ -################# -## Eclipse -################# - -*.pydevproject -.project -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.classpath -.settings/ -.loadpath - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - - -################# -## Visual Studio -################# - -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# User-specific files -*.suo -*.user -*.sln.docstates - -# Build results -[Dd]ebug/ -[Rr]elease/ -*_i.c -*_p.c -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.vspscc -.builds -*.dotCover - -## TODO: If you have NuGet Package Restore enabled, uncomment this -#packages/ - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opensdf -*.sdf - -# Visual Studio profiler -*.psess -*.vsp - -# ReSharper is a .NET coding add-in -_ReSharper* - -# Installshield output folder -[Ee]xpress - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish - -# Others -[Bb]in -[Oo]bj -sql -TestResults -*.Cache -ClientBin -stylecop.* -~$* -*.dbmdl -Generated_Code #added for RIA/Silverlight projects - -# Backup & report files from converting an old project file to a newer -# Visual Studio version. Backup files are not needed, because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML - - - -############ -## Windows -############ - -# Windows image file caches -Thumbs.db - -# Folder config file -Desktop.ini - - -############# -## Python -############# - -*.py[co] - -# Packages -*.egg -*.egg-info -dist -build -eggs -parts -bin -var -sdist -develop-eggs -.installed.cfg - -# Installer logs -pip-log.txt - -# Unit test / coverage reports -.coverage -.tox - -#Translations -*.mo - -#Mr Developer -.mr.developer.cfg - -# Mac crap -.DS_Store - nbproject ._* .~lock.* @@ -171,4 +7,3 @@ nbproject .project .settings composer.lock - diff --git a/README.md b/README.md index 3955ec74..4e7d164a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -This is a sample PHP project - ZendSkeletonApplication ======================= @@ -33,4 +31,3 @@ Virtual Host ------------ Afterwards, set up a virtual host to point to the public/ directory of the project and you should be ready to go! - diff --git a/module/Application/view/application/index/index.phtml b/module/Application/view/application/index/index.phtml index bdc4445f..5c7aa028 100644 --- a/module/Application/view/application/index/index.phtml +++ b/module/Application/view/application/index/index.phtml @@ -1,4 +1,3 @@ -

Hello World FMI

translate('Welcome to %sZend Framework 2%s'), '', '') ?>

translate('Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2.'), '', '', \Zend\Version\Version::VERSION) ?>

From 2ae215cddcf52de719500205910fd2ef46e71a7a Mon Sep 17 00:00:00 2001 From: coolcsn Date: Wed, 13 Feb 2013 09:28:01 +0000 Subject: [PATCH 108/180] Initial commit --- .gitignore | 9 + LICENSE.txt | 27 + README.md | 33 + composer.json | 22 + composer.phar | Bin 0 -> 570295 bytes config/application.config.php | 15 + config/autoload/.gitignore | 2 + config/autoload/README.md | 8 + config/autoload/global.php | 16 + config/autoload/local.php.dist | 16 + data/cache/.gitignore | 2 + init_autoloader.php | 49 + module/Application/Module.php | 39 + module/Application/config/module.config.php | 91 ++ module/Application/language/ar_SY.mo | Bin 0 -> 5526 bytes module/Application/language/ar_SY.po | 184 +++ module/Application/language/cs_CZ.mo | Bin 0 -> 5005 bytes module/Application/language/cs_CZ.po | 153 +++ module/Application/language/de_DE.mo | Bin 0 -> 5126 bytes module/Application/language/de_DE.po | 153 +++ module/Application/language/en_US.mo | Bin 0 -> 545 bytes module/Application/language/en_US.po | 153 +++ module/Application/language/es_ES.mo | Bin 0 -> 5063 bytes module/Application/language/es_ES.po | 111 ++ module/Application/language/fr_CA.mo | Bin 0 -> 5074 bytes module/Application/language/fr_CA.po | 153 +++ module/Application/language/fr_FR.mo | Bin 0 -> 5077 bytes module/Application/language/fr_FR.po | 153 +++ module/Application/language/it_IT.mo | Bin 0 -> 4922 bytes module/Application/language/it_IT.po | 154 +++ module/Application/language/ja_JP.mo | Bin 0 -> 5185 bytes module/Application/language/ja_JP.po | 140 +++ module/Application/language/nl_NL.mo | Bin 0 -> 4815 bytes module/Application/language/nl_NL.po | 153 +++ module/Application/language/pl_PL.mo | Bin 0 -> 4934 bytes module/Application/language/pl_PL.po | 153 +++ module/Application/language/tr_TR.mo | Bin 0 -> 4785 bytes module/Application/language/tr_TR.po | 153 +++ .../Controller/IndexController.php | 21 + .../view/application/index/index.phtml | 26 + module/Application/view/error/404.phtml | 61 + module/Application/view/error/index.phtml | 62 + module/Application/view/layout/layout.phtml | 57 + public/.htaccess | 7 + public/css/bootstrap-responsive.min.css | 3 + public/css/bootstrap.min.css | 610 +++++++++ public/css/style.css | 37 + public/images/favicon.ico | Bin 0 -> 1406 bytes public/images/zf2-logo.png | Bin 0 -> 738 bytes public/index.php | 12 + public/js/html5.js | 4 + public/js/jquery-1.7.2.min.js | 4 + vendor/.gitignore | 5 + vendor/README.md | 1 + vendor/doctrine/common/.gitignore | 4 + vendor/doctrine/common/.gitmodules | 3 + vendor/doctrine/common/.travis.yml | 5 + vendor/doctrine/common/LICENSE | 504 ++++++++ vendor/doctrine/common/README.md | 12 + vendor/doctrine/common/UPGRADE_TO_2_1 | 39 + vendor/doctrine/common/UPGRADE_TO_2_2 | 61 + vendor/doctrine/common/build.properties | 6 + vendor/doctrine/common/build.xml | 59 + vendor/doctrine/common/composer.json | 21 + .../Common/Annotations/Annotation.php | 75 ++ .../Annotations/Annotation/Attribute.php | 47 + .../Annotations/Annotation/Attributes.php | 37 + .../Annotation/IgnoreAnnotation.php | 44 + .../Annotations/Annotation/Required.php | 33 + .../Common/Annotations/Annotation/Target.php | 105 ++ .../Annotations/AnnotationException.php | 111 ++ .../Common/Annotations/AnnotationReader.php | 303 +++++ .../Common/Annotations/AnnotationRegistry.php | 129 ++ .../Common/Annotations/CachedReader.php | 179 +++ .../Doctrine/Common/Annotations/DocLexer.php | 140 +++ .../Doctrine/Common/Annotations/DocParser.php | 891 +++++++++++++ .../Common/Annotations/FileCacheReader.php | 209 +++ .../Common/Annotations/IndexedReader.php | 94 ++ .../Doctrine/Common/Annotations/PhpParser.php | 203 +++ .../Doctrine/Common/Annotations/Reader.php | 35 + .../Annotations/SimpleAnnotationReader.php | 152 +++ .../lib/Doctrine/Common/Cache/ApcCache.php | 97 ++ .../lib/Doctrine/Common/Cache/ArrayCache.php | 96 ++ .../lib/Doctrine/Common/Cache/Cache.php | 102 ++ .../Doctrine/Common/Cache/CacheProvider.php | 188 +++ .../Doctrine/Common/Cache/MemcacheCache.php | 121 ++ .../Doctrine/Common/Cache/MemcachedCache.php | 124 ++ .../Doctrine/Common/Cache/WinCacheCache.php | 92 ++ .../lib/Doctrine/Common/Cache/XcacheCache.php | 110 ++ .../Doctrine/Common/Cache/ZendDataCache.php | 84 ++ .../lib/Doctrine/Common/ClassLoader.php | 262 ++++ .../Common/Collections/ArrayCollection.php | 447 +++++++ .../Common/Collections/Collection.php | 243 ++++ .../lib/Doctrine/Common/CommonException.php | 28 + .../common/lib/Doctrine/Common/Comparable.php | 47 + .../common/lib/Doctrine/Common/EventArgs.php | 69 + .../lib/Doctrine/Common/EventManager.php | 136 ++ .../lib/Doctrine/Common/EventSubscriber.php | 45 + .../common/lib/Doctrine/Common/Lexer.php | 266 ++++ .../Doctrine/Common/NotifyPropertyChanged.php | 45 + .../Persistence/AbstractManagerRegistry.php | 224 ++++ .../Common/Persistence/ConnectionRegistry.php | 63 + .../Persistence/Event/LifecycleEventArgs.php | 77 ++ .../Event/LoadClassMetadataEventArgs.php | 76 ++ .../Persistence/Event/ManagerEventArgs.php | 59 + .../Persistence/Event/OnClearEventArgs.php | 84 ++ .../Persistence/Event/PreUpdateEventArgs.php | 129 ++ .../Common/Persistence/ManagerRegistry.php | 112 ++ .../Mapping/AbstractClassMetadataFactory.php | 359 ++++++ .../Persistence/Mapping/ClassMetadata.php | 165 +++ .../Mapping/ClassMetadataFactory.php | 74 ++ .../Mapping/Driver/AnnotationDriver.php | 214 ++++ .../Mapping/Driver/DefaultFileLocator.php | 169 +++ .../Persistence/Mapping/Driver/FileDriver.php | 178 +++ .../Mapping/Driver/FileLocator.php | 69 + .../Mapping/Driver/MappingDriver.php | 56 + .../Mapping/Driver/MappingDriverChain.php | 125 ++ .../Persistence/Mapping/Driver/PHPDriver.php | 70 ++ .../Mapping/Driver/StaticPHPDriver.php | 131 ++ .../Mapping/Driver/SymfonyFileLocator.php | 198 +++ .../Persistence/Mapping/MappingException.php | 57 + .../Persistence/Mapping/ReflectionService.php | 80 ++ .../Mapping/RuntimeReflectionService.php | 102 ++ .../Mapping/StaticReflectionService.php | 107 ++ .../Common/Persistence/ObjectManager.php | 143 +++ .../Common/Persistence/ObjectManagerAware.php | 49 + .../Common/Persistence/ObjectRepository.php | 78 ++ .../Common/Persistence/PersistentObject.php | 233 ++++ .../lib/Doctrine/Common/Persistence/Proxy.php | 60 + .../Common/PropertyChangedListener.php | 48 + .../lib/Doctrine/Common/Util/ClassUtils.php | 103 ++ .../common/lib/Doctrine/Common/Util/Debug.php | 123 ++ .../lib/Doctrine/Common/Util/Inflector.php | 72 ++ .../common/lib/Doctrine/Common/Version.php | 55 + vendor/doctrine/common/phpunit.xml.dist | 31 + vendor/doctrine/common/tests/.gitignore | 3 + .../Common/Annotations/AbstractReaderTest.php | 538 ++++++++ .../Annotations/AnnotationReaderTest.php | 13 + .../Common/Annotations/CachedReaderTest.php | 56 + .../Tests/Common/Annotations/DocLexerTest.php | 27 + .../Common/Annotations/DocParserTest.php | 1118 +++++++++++++++++ .../Annotations/FileCacheReaderTest.php | 40 + .../Annotation/AnnotWithDefaultValue.php | 10 + .../Fixtures/Annotation/Autoload.php | 10 + .../Annotations/Fixtures/Annotation/Route.php | 11 + .../Fixtures/Annotation/Secure.php | 18 + .../Fixtures/Annotation/Template.php | 14 + .../Fixtures/Annotation/Version.php | 11 + .../Fixtures/AnnotationTargetAll.php | 14 + .../Fixtures/AnnotationTargetAnnotation.php | 14 + .../Fixtures/AnnotationTargetClass.php | 15 + .../Fixtures/AnnotationTargetMethod.php | 15 + .../AnnotationTargetPropertyMethod.php | 14 + .../Fixtures/AnnotationWithAttributes.php | 119 ++ .../AnnotationWithRequiredAttributes.php | 50 + ...ithRequiredAttributesWithoutContructor.php | 24 + .../AnnotationWithTargetSyntaxError.php | 11 + .../Fixtures/AnnotationWithVarType.php | 62 + .../Annotations/Fixtures/ClassDDC1660.php | 30 + ...assWithAnnotationWithTargetSyntaxError.php | 21 + .../ClassWithAnnotationWithVarType.php | 31 + .../ClassWithFullyQualifiedUseStatements.php | 11 + ...lassWithInvalidAnnotationTargetAtClass.php | 17 + ...assWithInvalidAnnotationTargetAtMethod.php | 20 + ...sWithInvalidAnnotationTargetAtProperty.php | 24 + .../ClassWithValidAnnotationTarget.php | 41 + .../Annotations/Fixtures/Controller.php | 300 +++++ ...erentNamespacesPerFileWithClassAsFirst.php | 15 + ...ferentNamespacesPerFileWithClassAsLast.php | 15 + ...EqualNamespacesPerFileWithClassAsFirst.php | 13 + .../EqualNamespacesPerFileWithClassAsLast.php | 12 + ...lobalNamespacesPerFileWithClassAsFirst.php | 12 + ...GlobalNamespacesPerFileWithClassAsLast.php | 12 + .../InvalidAnnotationUsageButIgnoredClass.php | 14 + .../Fixtures/InvalidAnnotationUsageClass.php | 10 + .../Fixtures/MultipleClassesInFile.php | 9 + .../MultipleImportsInUseStatement.php | 10 + .../NamespaceAndClassCommentedOut.php | 20 + .../NamespaceWithClosureDeclaration.php | 15 + .../Fixtures/NamespacedSingleClassLOC1000.php | 1009 +++++++++++++++ .../Annotations/Fixtures/NoAnnotation.php | 5 + .../Fixtures/NonNamespacedClass.php | 10 + .../Fixtures/SingleClassLOC1000.php | 1006 +++++++++++++++ .../Annotations/Fixtures/TestInterface.php | 13 + .../Common/Annotations/PerformanceTest.php | 194 +++ .../Common/Annotations/PhpParserTest.php | 179 +++ .../SimpleAnnotationReaderTest.php | 97 ++ .../Common/Annotations/Ticket/DCOM55Test.php | 65 + .../Annotations/Ticket/DCOM58Entity.php | 8 + .../Common/Annotations/Ticket/DCOM58Test.php | 112 ++ .../Common/Annotations/TopLevelAnnotation.php | 8 + .../Tests/Common/Cache/ApcCacheTest.php | 20 + .../Tests/Common/Cache/ArrayCacheTest.php | 13 + .../Doctrine/Tests/Common/Cache/CacheTest.php | 87 ++ .../Tests/Common/Cache/MemcacheCacheTest.php | 38 + .../Tests/Common/Cache/MemcachedCacheTest.php | 40 + .../Tests/Common/Cache/WinCacheCacheTest.php | 20 + .../Tests/Common/Cache/XcacheCacheTest.php | 20 + .../Tests/Common/Cache/ZendDataCacheTest.php | 20 + .../Doctrine/Tests/Common/ClassLoaderTest.php | 45 + .../Common/ClassLoaderTest/ClassA.class.php | 6 + .../Common/ClassLoaderTest/ClassB.class.php | 6 + .../Common/ClassLoaderTest/ClassC.class.php | 6 + .../Tests/Common/ClassLoaderTest/ClassD.php | 5 + .../Common/Collections/CollectionTest.php | 195 +++ .../Tests/Common/DoctrineExceptionTest.php | 0 .../Tests/Common/EventManagerTest.php | 88 ++ .../Persistence/Mapping/ChainDriverTest.php | 94 ++ .../Mapping/ClassMetadataFactoryTest.php | 134 ++ .../Mapping/DefaultFileLocatorTest.php | 90 ++ .../Persistence/Mapping/FileDriverTest.php | 142 +++ .../Persistence/Mapping/PHPDriverTest.php | 18 + .../Mapping/RuntimeReflectionServiceTest.php | 70 ++ .../Mapping/StaticPHPDriverTest.php | 35 + .../Mapping/StaticReflectionServiceTest.php | 70 ++ .../Mapping/SymfonyFileLocatorTest.php | 88 ++ .../Persistence/Mapping/_files/TestEntity.php | 3 + .../Persistence/Mapping/_files/global.yml | 1 + .../Persistence/Mapping/_files/stdClass.yml | 1 + .../Persistence/PersistentObjectTest.php | 247 ++++ .../Tests/Common/Util/ClassUtilsTest.php | 100 ++ .../Doctrine/Tests/Common/Util/DebugTest.php | 27 + .../tests/Doctrine/Tests/DoctrineTestCase.php | 10 + .../common/tests/Doctrine/Tests/TestInit.php | 31 + .../common/tests/NativePhpunitTask.php | 246 ++++ vendor/doctrine/common/tests/README.markdown | 27 + 226 files changed, 20736 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 composer.json create mode 100644 composer.phar create mode 100644 config/application.config.php create mode 100644 config/autoload/.gitignore create mode 100644 config/autoload/README.md create mode 100644 config/autoload/global.php create mode 100644 config/autoload/local.php.dist create mode 100644 data/cache/.gitignore create mode 100644 init_autoloader.php create mode 100644 module/Application/Module.php create mode 100644 module/Application/config/module.config.php create mode 100644 module/Application/language/ar_SY.mo create mode 100644 module/Application/language/ar_SY.po create mode 100644 module/Application/language/cs_CZ.mo create mode 100644 module/Application/language/cs_CZ.po create mode 100644 module/Application/language/de_DE.mo create mode 100644 module/Application/language/de_DE.po create mode 100644 module/Application/language/en_US.mo create mode 100644 module/Application/language/en_US.po create mode 100644 module/Application/language/es_ES.mo create mode 100644 module/Application/language/es_ES.po create mode 100644 module/Application/language/fr_CA.mo create mode 100644 module/Application/language/fr_CA.po create mode 100644 module/Application/language/fr_FR.mo create mode 100644 module/Application/language/fr_FR.po create mode 100644 module/Application/language/it_IT.mo create mode 100644 module/Application/language/it_IT.po create mode 100644 module/Application/language/ja_JP.mo create mode 100644 module/Application/language/ja_JP.po create mode 100644 module/Application/language/nl_NL.mo create mode 100644 module/Application/language/nl_NL.po create mode 100644 module/Application/language/pl_PL.mo create mode 100644 module/Application/language/pl_PL.po create mode 100644 module/Application/language/tr_TR.mo create mode 100644 module/Application/language/tr_TR.po create mode 100644 module/Application/src/Application/Controller/IndexController.php create mode 100644 module/Application/view/application/index/index.phtml create mode 100644 module/Application/view/error/404.phtml create mode 100644 module/Application/view/error/index.phtml create mode 100644 module/Application/view/layout/layout.phtml create mode 100644 public/.htaccess create mode 100644 public/css/bootstrap-responsive.min.css create mode 100644 public/css/bootstrap.min.css create mode 100644 public/css/style.css create mode 100644 public/images/favicon.ico create mode 100644 public/images/zf2-logo.png create mode 100644 public/index.php create mode 100644 public/js/html5.js create mode 100644 public/js/jquery-1.7.2.min.js create mode 100644 vendor/.gitignore create mode 100644 vendor/README.md create mode 100644 vendor/doctrine/common/.gitignore create mode 100644 vendor/doctrine/common/.gitmodules create mode 100644 vendor/doctrine/common/.travis.yml create mode 100644 vendor/doctrine/common/LICENSE create mode 100644 vendor/doctrine/common/README.md create mode 100644 vendor/doctrine/common/UPGRADE_TO_2_1 create mode 100644 vendor/doctrine/common/UPGRADE_TO_2_2 create mode 100644 vendor/doctrine/common/build.properties create mode 100644 vendor/doctrine/common/build.xml create mode 100644 vendor/doctrine/common/composer.json create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/CommonException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Comparable.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventManager.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Lexer.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Version.php create mode 100644 vendor/doctrine/common/phpunit.xml.dist create mode 100644 vendor/doctrine/common/tests/.gitignore create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/CachedReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Autoload.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Route.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Secure.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetAll.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetPropertyMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithAttributes.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithTargetSyntaxError.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithVarType.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithAnnotationWithTargetSyntaxError.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithAnnotationWithVarType.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithFullyQualifiedUseStatements.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtProperty.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithValidAnnotationTarget.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Controller.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/EqualNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/EqualNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/GlobalNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/GlobalNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/InvalidAnnotationUsageButIgnoredClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/InvalidAnnotationUsageClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/MultipleClassesInFile.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/MultipleImportsInUseStatement.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespaceAndClassCommentedOut.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespaceWithClosureDeclaration.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespacedSingleClassLOC1000.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NonNamespacedClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/SingleClassLOC1000.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PerformanceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Test.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/CacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassB.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassC.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassD.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/CollectionTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/TestInit.php create mode 100644 vendor/doctrine/common/tests/NativePhpunitTask.php create mode 100644 vendor/doctrine/common/tests/README.markdown diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..ad907fa5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +nbproject +._* +.~lock.* +.buildpath +.DS_Store +.idea +.project +.settings +composer.lock diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..36e97601 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,27 @@ +Copyright (c) 2005-2012, Zend Technologies USA, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Zend Technologies USA, Inc. nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..4e7d164a --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +ZendSkeletonApplication +======================= + +Introduction +------------ +This is a simple, skeleton application using the ZF2 MVC layer and module +systems. This application is meant to be used as a starting place for those +looking to get their feet wet with ZF2. + + +Installation +------------ + +Using Composer (recommended) +---------------------------- +The recommended way to get a working copy of this project is to clone the repository +and use composer to install dependencies: + + cd my/project/dir + git clone git://github.com/zendframework/ZendSkeletonApplication.git + cd ZendSkeletonApplication + php composer.phar install + +Using Git submodules +-------------------- +Alternatively, you can install using native git submodules: + + git clone git://github.com/zendframework/ZendSkeletonApplication.git --recursive + +Virtual Host +------------ +Afterwards, set up a virtual host to point to the public/ directory of the +project and you should be ready to go! diff --git a/composer.json b/composer.json new file mode 100644 index 00000000..b70734ed --- /dev/null +++ b/composer.json @@ -0,0 +1,22 @@ +{ + "name": "zendframework/skeleton-application", + "description": "Skeleton Application for ZF2", + "license": "BSD-3-Clause", + "keywords": [ + "framework", + "zf2" + ], + "homepage": "http://framework.zend.com/", + "repositories": [ + { + "type": "composer", + "url": "http://packages.zendframework.com/" + } + ], + "require": { + "php": ">=5.3.3", + "zendframework/zendframework": "2.*", + "zendframework/zendservice-recaptcha": "2.*", + "doctrine/common": ">=2.1" + } +} diff --git a/composer.phar b/composer.phar new file mode 100644 index 0000000000000000000000000000000000000000..48edaa6149f3581df05a06f283f27ad50ff879de GIT binary patch literal 570295 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 literal 0 HcmV?d00001 diff --git a/config/application.config.php b/config/application.config.php new file mode 100644 index 00000000..6504dea7 --- /dev/null +++ b/config/application.config.php @@ -0,0 +1,15 @@ + array( + 'Application', + ), + 'module_listener_options' => array( + 'config_glob_paths' => array( + 'config/autoload/{,*.}{global,local}.php', + ), + 'module_paths' => array( + './module', + './vendor', + ), + ), +); diff --git a/config/autoload/.gitignore b/config/autoload/.gitignore new file mode 100644 index 00000000..1a83fda6 --- /dev/null +++ b/config/autoload/.gitignore @@ -0,0 +1,2 @@ +local.php +*.local.php diff --git a/config/autoload/README.md b/config/autoload/README.md new file mode 100644 index 00000000..4e504db0 --- /dev/null +++ b/config/autoload/README.md @@ -0,0 +1,8 @@ +About this directory: +===================== + +By default, this application is configured to load all configs in +`./config/autoload/{,*.}{global,local}.php`. Doing this provides a +location for a developer to drop in configuration override files provided by +modules, as well as cleanly provide individual, application-wide config files +for things like database connections, etc. diff --git a/config/autoload/global.php b/config/autoload/global.php new file mode 100644 index 00000000..1473720f --- /dev/null +++ b/config/autoload/global.php @@ -0,0 +1,16 @@ +add('Zend', $zf2Path . '/Zend'); + } else { + include $zf2Path . '/Zend/Loader/AutoloaderFactory.php'; + Zend\Loader\AutoloaderFactory::factory(array( + 'Zend\Loader\StandardAutoloader' => array( + 'autoregister_zf' => true + ) + )); + } +} + +if (!class_exists('Zend\Loader\AutoloaderFactory')) { + throw new RuntimeException('Unable to load ZF2. Run `php composer.phar install` or define a ZF2_PATH environment variable.'); +} diff --git a/module/Application/Module.php b/module/Application/Module.php new file mode 100644 index 00000000..86d9d4e2 --- /dev/null +++ b/module/Application/Module.php @@ -0,0 +1,39 @@ +getApplication()->getServiceManager()->get('translator'); + $eventManager = $e->getApplication()->getEventManager(); + $moduleRouteListener = new ModuleRouteListener(); + $moduleRouteListener->attach($eventManager); + } + + public function getConfig() + { + return include __DIR__ . '/config/module.config.php'; + } + + public function getAutoloaderConfig() + { + return array( + 'Zend\Loader\StandardAutoloader' => array( + 'namespaces' => array( + __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, + ), + ), + ); + } +} diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php new file mode 100644 index 00000000..a6dd62b8 --- /dev/null +++ b/module/Application/config/module.config.php @@ -0,0 +1,91 @@ + array( + 'routes' => array( + 'home' => array( + 'type' => 'Zend\Mvc\Router\Http\Literal', + 'options' => array( + 'route' => '/', + 'defaults' => array( + 'controller' => 'Application\Controller\Index', + 'action' => 'index', + ), + ), + ), + // The following is a route to simplify getting started creating + // new controllers and actions without needing to create a new + // module. Simply drop new controllers in, and you can access them + // using the path /application/:controller/:action + 'application' => array( + 'type' => 'Literal', + 'options' => array( + 'route' => '/application', + 'defaults' => array( + '__NAMESPACE__' => 'Application\Controller', + 'controller' => 'Index', + 'action' => 'index', + ), + ), + 'may_terminate' => true, + 'child_routes' => array( + 'default' => array( + 'type' => 'Segment', + 'options' => array( + 'route' => '/[:controller[/:action]]', + 'constraints' => array( + 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', + 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', + ), + 'defaults' => array( + ), + ), + ), + ), + ), + ), + ), + 'service_manager' => array( + 'factories' => array( + 'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory', + ), + ), + 'translator' => array( + 'locale' => 'en_US', + 'translation_file_patterns' => array( + array( + 'type' => 'gettext', + 'base_dir' => __DIR__ . '/../language', + 'pattern' => '%s.mo', + ), + ), + ), + 'controllers' => array( + 'invokables' => array( + 'Application\Controller\Index' => 'Application\Controller\IndexController' + ), + ), + 'view_manager' => array( + 'display_not_found_reason' => true, + 'display_exceptions' => true, + 'doctype' => 'HTML5', + 'not_found_template' => 'error/404', + 'exception_template' => 'error/index', + 'template_map' => array( + 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', + 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', + 'error/404' => __DIR__ . '/../view/error/404.phtml', + 'error/index' => __DIR__ . '/../view/error/index.phtml', + ), + 'template_path_stack' => array( + __DIR__ . '/../view', + ), + ), +); diff --git a/module/Application/language/ar_SY.mo b/module/Application/language/ar_SY.mo new file mode 100644 index 0000000000000000000000000000000000000000..fa7ae166939da5c016a79122da666e4ff85e3cf8 GIT binary patch literal 5526 zcmb7|%X1u86~-?l1dzik51s+80fkWU46^K$!#F0$mJ}Q8pt8mZ32b_1u4X#w>7MjM ziYSUIzhp%eVFQ0aFp9=1+p@47$0-)D;jw{Y0oA?9jtx~TS+D_q=XTFS!XYrFo-^I| z+;hHj&Ueo3(p&f4{S(DUb3G*2yOerVhL))ZdT~ zAxGr?Zlykqd=UA5PLLt4~8Ej-^+dXJ-Od& z$PaS=8>HC#Gg5H<6}b!fFQj7Mu6vXk=jXj_K7o7^Sw{X4`2_M8$gd#(ffWDy-j~~- zMV?~+3rO+vOThn=`#&J}bN_psXyje@D)l+!7m$MEDY-}Q+sF@b|NRf-daocQKbuI& z>#vYNQ*RaPe?dx~@4=bi7)O2@c@p_2>~)a*scDiaeoi69j*Aq%Wu(OaGvvpRw~>e0 z_ebQD+&@5)Uqn`slgM8qzmD96vFDJ_ARj?qLrT6fT){cp$t{6MFyHer>`q2z5}eCt+wBYNF9_V>j>}PrLqH5Vjq;Qxl%2L$}$A zBORK^gbSuoRulft-A4ky89H&|*je`= zK*d~HS6gnRqn^dO<7U3SGY*siIQqImZ0L$sT)-#hI-I$C%zlQ>PQO_ z#V$sNlI;vBMQ&`9HpIu!5R)4R;gSuoDV@P@A*67ooij>EZFDCLUNH4oeDy=2P<@8v zNq!=v6}p$5HzM4D~q7J-nr(9WHmj*N!@$dm+hlGb5u&xt6qIe#{`8%j5z9@;$-X@!d!hBghOR*i_8Z{8L?fN7%Mu$AdE_qvQkt91* z#e38EhFK_s@>%0S6Kk4bw|#7lk48$$JTwOM42|u0YNw_YH1Qiu8K*8y(&LznjMp}yAjy2;C*+ci!Q7miFKrKC z(bO#4m@y0x2)f`lOa!C+dGeCCr&t?}7TtMwG}^;2KO3&mcNX1UzUh@wfMwUm?B&OSu`v`&CmAzxOzqS=p!e>pJofmbWBbrM?nH5^8ajSN1VLEQ zRcCR|%Hp$B0@sk+nwd2C*azufVd3kNlA6GkRJbgDXCdVHWKz~)R?n)2&`%<_tU zyynIu-zv=nhPQ{(H_Q@)un`>xD+Y@=%s`=sv!bW`CZne{SUM6UOoXM1KK1mm>eQs3 ztxi;@W(VtsIVx!ARz;Tw4`(@n>a7_bm&RBqkIZ;U=y)ZL({@zRe#hQMhsF=;{O6%Z z{N0E4e(B(dO0T3hvvWGVn%+t;+TPux)Aj5ePfxRUNvCgStLc``&Sxv>Wv4rk{JPNmSQ&+MxteinRy^@{A#v9n!?pXF|m2PAgaK48#?W>z6`L{vwuK8yE%CCQ*_46>AD4*RgP0*i@|d`6kL+>1(9!Iu}G)vsI9k zOGP(`L#Sts3VBzAzPZDmlhZ;Wsn3eu<|!`#rDT(kS||kFyJSQtAmA<+0e3~{u-t=Z$+1ifbOtE;rn%qIJEZtJ@d`tV-n(d%{OTZEEUwcqZ}3eDieQBa zIG{dIMzXe%US=aK<$-uCQr)i))+Hr(ig!(_DPD!cd5x&9FbHQwCRbop(a{6Mc}fM! z8I)fmx&n;wjXGH{qtSo7om#+K!U73gNr1ExBSuPVDGLYtMUW&C>w4Zo^1f>K2{&)y z_SHOop;Q+fm+t)LS_H)WkdVZ0;YZNZhOA4i>`K2|Gyy=|A&w2`!(+ypY_Xk7VzUb} z26`hwI@C@S#;0W>otnOmM!K`@w#^zg-5_}@Id6)o+pGGvcirtXst*UqS8c7pBCP1q zT_VFcgOKkW(<-bY&C)G7tA@(hr_eUIMdFG{)y=1deJF#Wo8Gbs#KA3`t)$(-0a6Sq zAZ=zZ7g}gs&Mw&UlW9EK!3v27c6y_(K;Jjph0LqNJSS2+6oEmL*jTN3duC|@l}D?5 z{~&us71rL)cyZ_nr#EH%4O)(5T(*H0gNsQ2Pa^{Z0z&eXcDHAMVL?G;5!1GZI0U71 z>-m9HoY|s~Pj~r8hV8^`aAa9-ZZKUhW*1Q89P3JR%NZo6=k}Lac?)M, 2012. +# Tawfek Daghistani , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-07 13:58+0300\n" +"Last-Translator: Tawfek Daghistani \n" +"Language-Team: Arabic <>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: English\n" +"X-Poedit-Country: UNITED STATES\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +#: ../view/layout/layout.phtml:6 ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "الصفحة الرئيسية" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "جميع الحقوق محفوظة" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "أهلا بك في %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "" +"Congratulations! You have successfully installed the %sZF2 Skeleton " +"Application%s. You are currently running Zend Framework version %s. This " +"skeleton can serve as a simple starting point for you to begin building your " +"application on ZF2." +msgstr "" +"تهانينا! لقد قمت بتنصيب %sZF2 Skeleton Application%s . أنت الآن تستخدم مكتبة " +"زيند الإصدار %s . هذا التطبيق يمكن أن يكون لك نقطة بداية سهلة في بناء " +"برامجك الخاصة على مكتبة زيند " + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "اشتق مكتبة زيند على GitHub " + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "تابع أخر التطورات" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "" +"Zend Framework 2 is under active development. If you are interested in " +"following the development of ZF2, there is a special ZF2 portal on the " +"official Zend Framework website which provides links to the ZF2 %swiki%s, " +"%sdev blog%s, %sissue tracker%s, and much more. This is a great resource for " +"staying up to date with the latest developments!" +msgstr "" +"مكتبة زيند تخضع للتطوير المستمر , إذا كان لديك الرغبة في متابعة التطورات , " +"بإمكانك تصفح الموقع الرسمي للمكتبة الذي يحتوي على روابط إلى %swiki%s, %sdev " +"blog%s, %sissue tracker%s, ,و المزيد . هذه مصادر رائعة لمتابعة أخر التطورات" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "بوابة التطوير الخاصة ب زيند" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "تعرف على الإضافات" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "" +"The community is working on developing a community site to serve as a " +"repository and gallery for ZF2 modules. The project is available %son GitHub" +"%s. The site is currently live and currently contains a list of some of the " +"modules already available for ZF2." +msgstr "" +"المجتمع البرمجي يعمل على تطوير موقع خاص به ليكون كمصدر و معرض لإضافات ZF2 . " +"هذا المشروع موجود على %son GitHub%s . هذا الموقع يخضع للتطوير المستمر و " +"يحتوي على قائمة من الإضافات الخاصة ب ZF2 " + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "إكتشف إضافات ZF2 " + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "الدعم و المساعدة " + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "" +"If you need any help or support while developing with ZF2, you may reach us " +"via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or " +"feedback you may have regarding the beta releases. Alternatively, you may " +"subscribe and post questions to the %smailing lists%s." +msgstr "" +"إذا كنت تريد الحصول على دعم فني أو مساعدة في تطوير ZF2 , بإمكانك التواصل عبر " +"IRC: %s#zftalk.2 on Freenode%s. نحن نريد أن نسمع منك المزيد من الأسئلة , " +"الأراء و الملاحظات على النسخة التجربية من المكتبة , أو بإمكانك الإشتراك و " +"التفاعل أو وضع الأسئلة في القائمة البريدية %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "تواصل معنا في IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "حصل خطأ ما " + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "مزيد من المعلومات" + +#: ../view/error/index.phtml:11 ../view/error/index.phtml:35 +msgid "File" +msgstr "ملف" + +#: ../view/error/index.phtml:15 ../view/error/index.phtml:39 +msgid "Message" +msgstr "الرسالة" + +#: ../view/error/index.phtml:19 ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "تفاصيل الخطأ" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "الأخطاء السابقة" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "لايوجد خطأ" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "حصل خطأ 404 , الصفحة غير موجودة" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "المتحكم المطلوب غير قادر على إجابة الطلب" + +#: ../view/error/404.phtml:13 +msgid "" +"The requested controller could not be mapped to an existing controller class." +msgstr "لا يمكن ربط المتحكم المطلوب بأي من المتحكمات الموجودة حالياًَ" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "المتحكم المطلوب غير قادر على الإجابة " + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "الرابط المطلوب غير معرف لدى الموجه" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "لا يمكنني التحديد لماذا حصل الخطأ 404 في هذا الوقت " + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "المتحكم " + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "يوصل إلى %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "خطأ برمجي" diff --git a/module/Application/language/cs_CZ.mo b/module/Application/language/cs_CZ.mo new file mode 100644 index 0000000000000000000000000000000000000000..46f2c0f637a83e5aea25000e19c7016663ff5d98 GIT binary patch literal 5005 zcmai&ON<;x8OJLjyqxgL3jzVkiZ&#QXIO6%l57IRUVE_>J6XJIJ6H%*(_OpW(~lau zx@R*3S0pYL7mx_yvYg0a6)xPcg*09PCoYI%jtC*aEe8%feqZ&>&Uiy$^3h;0L+?#rs>mzXU(Z{ck~$ z_a{*7`YU)h_-|0L@9qyMwZi2+Y`zG773_l7!56?^gU^Bg07d_kA8O@qf|uFf2Sv|s zF#hk{{{eh}`I5UP9i_K}=NdV9X=nKS7EAaW;$J&w^slMQ{oHHux9t``|iQl7w%8 zzXD$d?`QE-U<958e*%jBw?XmeU!XznLnMbw^<9kOR*~jl2N2c^ewHt4)Mxn0TCofF zga4QvKH`hm`8mE4zlZp0zVZ=&r3NH#@{xLxm`lCLN8%+Pi63PZK2n>rkHk@I{?zn= z)Qvi&pIUxO+p2Pvc2U$+m5tS@I8N)-l_u9|x$UaL$elWs=ekOFlG^LadRq-`+*PN_ zqr2B!xl@_C$-^#xTz|tgIx$15eG^62`|T#rM@aUy$#Wa)I;bmB&=Xb@f(~dhKTtBU9>N zvo>BE?bBkAV^M9YTI38|TGkq0^$2Tgr+aoMEp@L+^H|>Vw9;m7l|~5`cNN~&mBWup zok@M&<2`a8<3&xx%XR+rjqI5>iu+bRz3;$hV91Zh}G`x0=MK z-Ly``q7z|XVTh_VQKB2KhpEx$FRiT-$VbN8G`Ni zdln@z+4A**CiJ&8RG2gu&+^pQ9vjs~%FXOp^|I54$kzbsdaNuyrM0U@ z!NDEr46dahrDlq@qNJ#;9#pPxqgr$wxV(2Mkh zL`}PG?Wra~iRo0aHaWEsW85ruGt;^u0F@1Sr}8dex`3xm9_!N8Bv(ToQNoKJ<>eY_ zwxe6bgtmo_?i>t+9vmi<60DQ3F0RgvC&?0%xd99BcWHI8B2N84tdN}lpXE&{i$v#a zQwYOUd{}BjL!9fBxa}qcDUhmY-?62I3xz1J+MF^8q9ME6X=`Q4 zD@pSL4d@LT+vMu#N=ax_#;}Zuq)BEqCe+c@Qw|WWgwHHAjczW zoiy&8ZgzZU%dP5T8?S72*2FTnuX6^St9oVmgc*J>61^cE9}p~>w1m$N_!15*f-wp5cisQFOEs!?R#+J;`xhb=P@|hT|Oq;sgusu zXn;?(eXaiDAcrxY*ECe+ZT;oTTkD-?=j+7eZCiEDmXQ;dU)9g{()!q|oegK1D>^UP z5fmBw3p6wWrykn*f|(1edTnf@Wd35!H8919=hx1zozs`jZd^Wn;r!Zs!D-GAIz3s{ z-TA{!j;1Kt;BjY}7u{p(%E)Jn z^l+3^hOn9LyG5wexk=pM;C0)#g*~n(KlOuKZyfBEx8Bfwx=@$Gvb2&LnmncGq#b7U zb#&g@5PfVMxaQ#IWPdo>L% z-^QHYG}Yt=3vNV-8{=@##V0hfG6-YxX5w^l@Ycai=naSall@xbRjTWut9sZpgmmkY zZHKB#6AM+`HVeJd>r0un!_G)uncV27MP{Va#+hph+dq6Md)20EdahEN%!7@*!n&dB zzsD>@My9jShAUh&9fmesOlKN3`RUNb>U0z1L5ENW>sxuLWLyG2a5b6gk&8M+rpcVF z4AM%Tb1A}_6Z2SZmBq&>r)4+YJ(`bLvx-vCp2wCwkvhf^ z*W)T{^kWNy*W>CX7ltlrPZKqLX|ZYDq_jhL$2RJj(}_%m^1i`HA7fT%3*r;nLiiya z5+TMeTcy*f=iseS)p`r|qafsn$k@Q?Nvk!3k{(*}hovZuc-8jgy~*lkvX@J8hT$x9 zV+p_Od6S5lZAdlmTa!5B`su;Vx!iE*@e^Wdf!ZW>2RBVjxuUfQGZqCig26&@`+^M5 z;`P{c%6gn|Lzz=E6gBt23w&Ya?MYoFn=}EdZc+K z`*E`%q4B9M@F?Pft-;1 zy3eQrnFmlAcF9f?~C=mkb1i~l$PR1>92OdbI zjxiS6=65TMQsNxfM^r9!p&k#RfrGt3*9%sjkWOjYUOKZcObJh9W(*OTK#+@rT5H*% zyYD%(QR7AF=(o5%NfXD})HcsFLQ?!0#E=uUaZE=Y_Db+?`kxKLc$A^-myWf4Ih2c8 QV;@(@2=$5oVl3(S4+(UTng9R* literal 0 HcmV?d00001 diff --git a/module/Application/language/cs_CZ.po b/module/Application/language/cs_CZ.po new file mode 100644 index 00000000..2485e2d6 --- /dev/null +++ b/module/Application/language/cs_CZ.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-06 13:05+0100\n" +"Last-Translator: David Lukas \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Czech\n" +"X-Poedit-Country: CZECH REPUBLIC\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton aplikace" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Úvod" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Všechna práva vyhrazena." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Vítejte v %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Blahopřejeme! Úspěšně jste nainstalovali %sZF2 Skeleton Application%s. Právě používáte Zend Framework verze %s. Tato kostra aplikace vám poslouží jako jednoduchý výchozí bod, ze kterého můžete vyjít při tvorbě vlastní aplikace nad ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 na GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Sledujte vývoj" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 je aktivně vyvíjen. Chcete-li sledovat vývoj ZF2, máte na oficiálních webových stránkách Zend Framework k dispozici zvláštní portál ZF2, na kterém najdete odkazy na ZF2 %swiki%s, %svývojářský blog%s, %sissue tracker%s a mnoho dalšího. Tento portál je skvělý zdroj aktuálních informací o nejnovějším vývoji!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Vývojářský portál ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Objevte Moduly" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Komunita pracuje na vývoji komunitního webu, který bude sloužit jako archiv a galerie modulů ZF2. Tento projekt je dostupný %sna GitHub%s. Web je aktuálně v provozu a obsahuje seznam některých již dostupných modulů ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Prozkoumejte Moduly ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Pomoc & Podpora" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Budete-li při vývoji se ZF2 potřebovat jakoukoli pomoc nebo podporu, můžete nás zastihnout přes IRC: %s#zftalk.2 na Freenode%s. Budeme rádi za jakékoli vaše otázky nebo připomínky týkající se beta verzí. Případně se také můžete přihlásit k odběru a posílat otázky na naše %se-mailové distribuční seznamy%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Ozvěte se nám na IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Vyskytla se chyba" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Další informace" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Soubor" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Zpráva" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Trasování zásobníku (Stack trace)" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Předchozí výjimky" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Žádná výjimka není k dispozici" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Vyskytla se chyba 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Požadovaný controller nemohl vyřídit požadavek." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Požadovaný controller se nepodařilo namapovat na žádnou existující třídu controlleru." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Požadovaný controller nepodporuje vyřízení (controller not dispatchable)." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "S požadovaným URL nebyla při směrování (routing) nalezena shoda." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Momentálně nedokážeme určit, proč byla vygenerována chyba 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "je mapován na %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Výjimka" + diff --git a/module/Application/language/de_DE.mo b/module/Application/language/de_DE.mo new file mode 100644 index 0000000000000000000000000000000000000000..fcea0366faf48b28a5e7b083f717dc36c6dda9c4 GIT binary patch literal 5126 zcma)3*uf4mr6|b{+*LLC)HQhBcmFejo zs;XzatB4a42M!=15C;Sj%00lr;$U$Zi4zClP7rsH5H}7;{9bj>&UlFvTD$Y6yQ|*c z?|t>=?Gwj-oNztQ|7ZDs`h7|ACFJq<^TG8i@|R5bIEfE$AV0+Y4?kGj{VDP( z?%zU+zTY7~g8VZwVg1|4Rlff9i6q%Zo?vqu`7PuHzG6B0r7%0#aOD zLw*u@38|2GkP^oPDf_>Vd;@(yLE>U^@?-V7=aA2Fe*r0Zd$o}Rl$yDeYb=u$CT2;FPlbcW$YJD`yZ5kDv_U))a zJENk1MPRq9iozB>bs!{ zvUxu>qnNtQ`=h)h010yTcFX1_*|M3tTGdIenS7+q z=;7!kwOfrwr3=Zma%ht4-ROH^NU1LNRbSQ-kgpf1NgsnMt1U@P6C3*C(Q@23)MVA@ zw67|!##XEAx2~*_$S)prsnehxUD$HQ6lG>4zjw_GnaT-R($zPb{9yIlmGKg?7t>vQ z>F9KDXduGCnVxnrt5W%n2^zz>(cYkSJrBkeRGx(F&pq>1$EVJA3`R1l<->v{?AI6? zYMV=Bx%I*0W3mn0bk8I=OLbTbrN=DO9kRb8iwT$H5^b{M%-ELPn_1y}vKz$z;B;z| zJ={&p;jk)f0Ki@e=0pYi7xJnX7I_Q|TQ`Wb$}?4zfjTO9BJJ~{1Cq*0`s(NwaiQ*(qdP|f6a(imi*N)PTvMEl6l! z4S5chyiNKfDe|XS@0r3td%}r#O%6<=YIyBYhFU%C6DjjT$EzKBSm(*nl~T~E$RHG* zNnbgAb;*wAaUjdhF zEW2G>zj`!)iRnbNK__qp03F-Rco0<#$V=UcqV2Sw*nvImm-&Vhs*{(!`p$Y^ksMlT zV4OUXmL67U8^VzdaYyfZATh{c1N){X;t-}8YvpULl^50OSJuwG$oG{M7PfA|C~_hlUH4VBa(?aX`FhB191 z>DJWdm^QdV(EIAb&|EUy(r9kK4XnPgbVC=t3RY|F89l`NEtb+&wo|d$s|yF+76}i$ zymUbA9^Hih+t;@@=fR(CuPn)a0Mgpq9}!G2_rsS*IaKkIqLZ9A;o|MRt=9SZI`Oq@ zTx%1*gvr;``Hl@sueNqd!|c#{+3drOnZH3Nqp%6h%okjS?P=8hnrhD<&H`IgSLruh z%-@g;BHZW2=B@4Zo3G8^>~ip={T)=bR#4VnN;WAqji?O0Aj8d;=|iweSKZ`Z<)?3k z14awba{bZK#;98+?E|NA={lybIfsgNvWb#Lflww&dL}sdpx_*KwI)vHeEKjQOsc}C z{Zne!8s?pj;ZWe)yG=HXPIN0MmsV;9B5PcbwuexQDo{X}#p#SrMp*+{l!9`9WJ=)l z+^`I0UeY&xh`R&$OI`05DABoB1Ou^}o*z}kAS|oy^r7Q5Tre>lAjr)kOl&&HtD?88 zI@;rmbU$HZZ+OI>VsgMKv_CQip(8W2b`cX%Pdmwa;VxRPBMk%~osuEnLVn_dKgQ|n~AW9(6zYG{Q> z{x@VP%k)98(EYL+$cZ{2rDQ2;2LUQ8DJJ0S$}BZ~*ddsV^Wi7GfLp9+q0m^)ZOl_bd_9;xjFHCpF3YIZK&a6%eSp%% zsY?x}4+;T{pg3x*L40Ji!eYq;9s?J!Mzf7?8KlW%ZJ297#P<}*zjQ~kiH zBBvjWDzgRF-NK?>S+WfNbD;!jlB*iFKv8UtIY1-QId+>4i^s@72D3mj&Y?(S&O?f; znUgyahH)+4V$rKt3Jy#Y`yAi;(>L=-SVjqBGD(3xxP+q^ZPN!`3LONng5tViIOnB% z1zAVuhIXWC*z z{JHapDoN?#WcPB;tY&~{&tSTs0{@RX$z&lR3fs7<3nbp%{)Ar~^#(Xvn&1YV5m|D* z=t`GJlaRg!2SjtPlGi?VwGEL3V^LsCX}Mb2aQdL`7j2Xdu=5|GoCSZz1id-QZ3S325l6x zfl%lh9D(^r)QgLxl=\n" +"Language-Team: ZF Contributors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Startseite" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Alle Rechte vorbehalten." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Willkommen zu dem %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Herzlichen Glückwunsch! Sie haben die %sZF2 Skeleton Application%s erfolgreich installiert und benutzen gerade die Version %s des Zend Frameworks. Dieses Gerüst kann Ihnen als Einstiegspunkt, für Ihre weitere Entwicklung, basierend auf dem Zend Framework 2, dienen." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 auf GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Folge der Entwicklung" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Das Zend Framework 2 wird z.Z. aktiv weiterentwickelt. Sollten Sie daran interessiert sein, die Entwicklung von ZF2 zu verfolgen, so bietet Ihnen die offizielle Webseite einen eigens für das Zend Framework 2 eingerichteten Bereich, auf der Sie Verlinkungen zum ZF2 %sWiki%s, %sEntwickler Blog%s, einem %sFehlerverfolgungssystem%s und noch vielem mehr finden. Dieser Bereich ist eine hervorragende Quelle um stets aktuell zu bleiben." + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Entwickler Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Entdecken Sie Module" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Die Community arbeitet momentan an einer Community Seite, welche als Galerie für ZF2 Module dient. Dieses Projekt ist %sauf GitHub%s verfügbar. Die Webseite ist bereits Online und enthält eine Liste mit schon veröffentlichten Modulen für das Zend Framework 2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Erkunden Sie ZF2 Module" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Hilfe & Support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Sollten Sie Hilfe jeglicher Art bei der Entwicklung mit dem Zend Framework 2 benötigen, kontaktieren Sie uns doch einfach über das IRC: %s#zftalk.2 on Freenode%s. Wir freuen uns darauf, Ihnen bei Ihren Fragen zu helfen oder aber auch Ihre Meinung bezüglich der Beta Versionen zu hören. Alternativ können Sie auch die %smailing lists%s abonnieren und Ihre Fragen dort stellen." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Schreiben Sie uns im IRC an" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Ein Fehler ist aufgetreten" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Zusätzliche Information" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Datei" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Meldung" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stapelüberwachung" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Vorherige Ausnahme" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Es ist keine Ausnahme verfügbar" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Es trat ein 404 Fehler auf" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Der angeforderte Controller war nicht in der Lage die Anfrage zu verarbeiten." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Der angeforderte Controller konnte keiner Controller Klasse zugeordnet werden." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Der angeforderte Controller ist nicht aufrufbar." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Für die angeforderte URL konnte keine Übereinstimmung gefunden werden." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Zu diesem Zeitpunkt ist es uns nicht möglich zu bestimmen, warum ein 404 Fehler aufgetreten ist." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "wird aufgelöst in %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Ausnahme" + diff --git a/module/Application/language/en_US.mo b/module/Application/language/en_US.mo new file mode 100644 index 0000000000000000000000000000000000000000..972a28ab34c2f0d90cabf56f0d021c5f205bbc09 GIT binary patch literal 545 zcmaJ+O;5r=5XI=JN6#Mi;L*WCV!(=quaXc!i4ehb)vOfK!O`$uD#=6e|OmacsLHr?6s=z73-+k!ZznDgs*g(XHw}45ig~6 zNSCu{0L@ZYSY4onkZmPOr-5kB6?qRZF_\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: English\n" +"X-Poedit-Country: UNITED STATES\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "" + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "" + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "" + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "" + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "" + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "" + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "" + diff --git a/module/Application/language/es_ES.mo b/module/Application/language/es_ES.mo new file mode 100644 index 0000000000000000000000000000000000000000..3728554767333faa67772174898cf3de1d245970 GIT binary patch literal 5063 zcmai&&5s;M8OAG+@UaO55=@*)yz{h}at&GPZZ|3a_*Bt}$2$siwPjro25} z?XK=w&x!+QB*X>&fJh*bgQZB303jq0djJjyP8@TMgv5~pT;TUs_k8SPk&$QLsp+cs z`+e#ezx~vsKT*6i@8{(Gh*D=nzK1`&{)qe-@=wT*Bj0Y<|3rS2_0oHl`Umnk6?8-$U|G{fIwLCLWcjV*9{~#6T9)F)wt9*Qd!&}I&A-l*QA}=C;gS>$J7gFqh`2&sq9po*} z-$ja@-{Jf_tp9@i1nXa7MB@J|^3%w7kYfL_CzSd(@>!(Bf9gX`UNlnHt4PV~B_t-* z9i*J=BhMlakP^>Nk+`mYg?tUWzeURaC!bVm8TkzI6!H>M{Mc#NcahJt{yy?W&ixE2 zasHVi>>!sY(i!A;k>`;=Kwd%~AwP$Fgkp$)&m$|&_mEP*U*Hr=MVX@?h?p;t518Et&aZX6{pKO&s{#ycWj>Ojna(lfiL&<*p>lTQPBEzG~l$Gcyyvr+1ta^gCmDhbcaJlZ+E=%P(-CI_^vV9VY$jZiOSEdc zv}5O4+iBr~dRR-Uol1hLN|RW%OALu0jq2Q0bal|uh@uyz3&}PMn}Vxi(iZx$w8Z2p zUru6x1DOmyOG8S}jGB&;rnb5${au?>Vrv!(g_?Cp)BH5Im|@d=YBI7K_0PXb=wHJu zG82+D?e}z`n?y=ZTf^F9^hSzv)7(v6>&66>HrAcayLIzAk=9wNb6-(h4R|C&9`tE1 zU(2waJR&YMBXsg)Q3yPET&5&=Cuv>WotZ$9B`0$S7M>q4>f%M}LLpvA&EI8voy#V% zIXx89(5mmM+Z5a6QK_X-M=mF!6?@2Y<;dH?kR(M=73%|=Td+`o^0v)rlc*Z7I}Tf` z%Rxz*7hphdGuS3mCwEFg>pTTzOd>-v?JbEaM(($piRx^ooo_Zb$XZ0;>F_UHM@u)E)UxVq zg@H>um+L|3?D{pmwEfy{=Zbg+_I0jeb4{AWeb-H>I=iLG0}=RgP4`lt?RnkfW*X>=Ca#PuUL6STb?L6JE?qbIpa$_e zyVi^dVnbh%>2m!V9YJ3_-0P6{iifWrQo`oY*5=mwJn(bfl_fbub98nm1%Xude)Xjy z114V4Oi>wZb?MgbM(6x|pZK|F%g%b9c!BmceZKFinL8xtTb*rh;T4^4*a;AshU*M8 zy4wite8XjK0_JtNrn~bmr-7~Mox2YB{YS*WpF6Pa^*<{FvhWU{F@K9~)_pfhQ zsEgxJfRSIUxg0>cO+d4S-3?IF0+PE@~@aN9ttMOqmncLkSeVEfT03 z?BkH(0xpjpkPl0674)NkAyF7?W2iRSz1s0)My60UV}07oO?Ncm zHPPt;N~gboXH#PKMRh%LE_hjL(x!@nHhpt9R5{gSN9G0Rmnq4cw`NxZSS<{-v`(%P zS|iL*a=v?N<7~s3rAekN&W4uRE!4jq!Fk{Lmf}4GUU6RVC=xun&*p#*^=N_N_Ke!G zkICkKdopwAcf0Seg)yR`Y-=!Naz3n literal 0 HcmV?d00001 diff --git a/module/Application/language/es_ES.po b/module/Application/language/es_ES.po new file mode 100644 index 00000000..5170d3ce --- /dev/null +++ b/module/Application/language/es_ES.po @@ -0,0 +1,111 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-06 19:07+0100\n" +"PO-Revision-Date: 2012-07-06 19:09+0100\n" +"Last-Translator: Adolfo Abegg \n" +"Language-Team: ZF Contributors \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: Spanish\n" +"X-Poedit-Country: SPAIN\n" +"X-Poedit-SearchPath-0: ..\n" + +msgid "Skeleton Application" +msgstr "Aplicación Esqueleto" + +msgid "Home" +msgstr "Inicio" + +msgid "All rights reserved." +msgstr "Todos los derechos reservados" + +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenido al %sZend Framework 2%s" + +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "¡Felicitaciones! Haz instalado correctamente el %sla aplicación esqueleto del ZF2%s. Estás corriendo la versión %s del Zend Framework. Este esqueleto te servirá como un punto de inicio sencillo para empezar a construir tu aplicación con el ZF2." + +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Hacer un Fork del Zend Framework 2 en GitHub" + +msgid "Follow Development" +msgstr "Seguir el Desarrollo" + +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "El Zend Framework 2 está en pleno desarrollo. Si estás interesado en seguir el desarrollo del ZF2, existe un portal especial para el ZF2 en el sitio web oficial del Zend Framework el cual provee enlaces %sa la Wiki%s, %sal Blog de desarrollo%s, %sal issue tracker%s y mucho más. Este es un gran recurso para mantenerte al día con los últimos avances en el desarrollo!" + +msgid "ZF2 Development Portal" +msgstr "Portal de Desarrollo del ZF2" + +msgid "Discover Modules" +msgstr "Descubre Módulos" + +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La comunidad está trabajando en el desarrollo de una web comunitaria que servirá de repositorio y galería de los módulos del ZF2. El proyecto está disponible %sen GitHub%s. El sitio web está en línea y actualmente posee una lista de algunos módulos que ya están disponibles para el ZF2." + +msgid "Explore ZF2 Modules" +msgstr "Explora los módulos del ZF2" + +msgid "Help & Support" +msgstr "Ayuda & Soporte" + +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si necesitas alguna ayuda o soporte mientras estás desarrollando con el ZF2, puedes encontrarnos via IRC: %s#zftalk.2 en Freenode%s. Nos encantaría leer tus preguntas o cualquier feedback que puedas tener en relación a los lanzamientos de las versiones beta. También puedes subscribirte y enviar preguntas %sa la lista de correos%s" + +msgid "Ping us on IRC" +msgstr "Escríbenos en el IRC" + +msgid "An error occurred" +msgstr "Ha ocurrido un error" + +msgid "Additional information" +msgstr "Información adicional" + +msgid "File" +msgstr "Archivo" + +msgid "Message" +msgstr "Mensaje" + +msgid "Stack trace" +msgstr "Seguimiento de la pila (stack trace)" + +msgid "Previous exceptions" +msgstr "Excepciones anteriores" + +msgid "No Exception available" +msgstr "No hay ninguna Excepción disponible." + +msgid "A 404 error occurred" +msgstr "Ha ocurrido un error 404" + +msgid "The requested controller was unable to dispatch the request." +msgstr "El controlador solicitado no pudo ejecutar la petición." + +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "El controlador solicitado no se pudo mapear con una clase de controlador existente." + +msgid "The requested controller was not dispatchable." +msgstr "El controlador solicitado no es ejecutable." + +msgid "The requested URL could not be matched by routing." +msgstr "El ruteador no ha encontrado la ruta para la URL solicitada." + +msgid "We cannot determine at this time why a 404 was generated." +msgstr "No pudimos determinar por qué un error 404 ha sido generado." + +msgid "Controller" +msgstr "Controller" + +msgid "resolves to %s" +msgstr "se resuelve a %s" + +msgid "Exception" +msgstr "Excepción" + diff --git a/module/Application/language/fr_CA.mo b/module/Application/language/fr_CA.mo new file mode 100644 index 0000000000000000000000000000000000000000..956a0d9d90577e1c8366e18ddc2efc7397c014ef GIT binary patch literal 5074 zcmai%O>i7X6~~7VzLY?~!GwSqX=b|L$Nzow zf8Rd$_|GCP#phZ1yf2ErDDpABxc-RzB=S$lPa)r)-Tw>u3GSEPA4UH}K8swE`^Tf` zG6!{_UAAX>=`)lOKxc>uE z^!)`Xe*GQ!1oA(~h<#6dFp5_B_enPIAisfZBY%v%hWriktH^hdV*jNN*ZTL6x7mLe zDRzE`^MB?3&&bbl{}3b3A>TqigZ$e}{u}ui>&`t{`*HrGwZ02TiT?`n)5tX>CZq4q z?qg(&``3|z#~Vm_|6Al1`hGvVf9k2){xe9y|0Sg8`xa8-kCBpx`^XpA_ao$0?teuR zZX*AI>>#@=lDH3$d&plPpGUrfd;$3!PW+JlYe-B-Zvis55or#7Ap%|^1qaLoT-YA` zBK(kl*(;Z%L;U+ZpYwb^!$aOuR^gJ`Y%Wq9eU^{l zAeYol)Kix`mz8lYcPfwL$~luny(F=v%`=@Un+=-LA?qn+?@#CQH<&(_?d(y8|^b&f_ZT+G>Afz4DF5SZ6Bu zth85Jc{?srJSw#-MNg62tW?CRj_|h3Ro@J4ruvml6M4^5r}W$_g%Lb%M?_n?oH$&x zVSSwAf!fKFDm6a3em^!vfbRPJBFzavf^6Py+SEjwY|RhVhMAZ&FUBS-c|;&*;#w7Z z-?Zh8svq4jX`x=!g-63WE}zddXYLDVNfNtC5h?K zmLu`#V%RsMfG>R=ADkEnW#G(EyMU@>zHds6;nZkv(ArB&<1#W2AV+i0eAV}{vwee+ zglze8!4mfC8X9YxN@S_^rN_r;hjPbm zaXxxfNk)661XVg6n`oaH;(R==GFwvBUP&Q}UX(6?trr$~TL#b;>d_fuvSsd$LV!c* z4E~pbl$sgW6(vP&RN?ZwCN9O+Nhl=hq(bWAr?|xoi{@REf@;t|e-u-{nqH(Q1T~cp zl&6|R3Z^r|N~hFDf^!Xajce@yfHNWQRNn1d+eBKWiOTYl>NA61)>w7gwj+lVrhU?!dzPLt0(DNUSf!3(5I=EUz+IBsQB(0fw3S zc65hi>ntcW6zbS!09vvJoJ$LCha*4=LshH~O=g&dGAQqulrjmb8Fr_~*6Om4B+UzB zK<(1lI*rb*l!R7U!j#dmG)YrqGCJC7HUnf<{gM zUG^9G4<}SV&4=}!^}YfeTI#?!c_e*4uFy7SaL%TA@NP&YmU03yl4BFic|xYqS7&Sk83)s?<2m%iKD%?(7N^=)&+OicVX9gM|Z);KNb=}}j;=MVQdgyPXIk6RsHw3njWv?t`oaCirv zLm~JI;*wRImvd^vjLhK!(_`rfZK;lEU(SKVQdTG0HmAoh7F*V& zM_o{_iUL^AgNEr$k0~{2f~KlYvm99)2Z}U($T=9cGcFm*sG!#?!;ug=_RL6Fm*KQP|bD{2Ep{WfB`jhs1TOJv#|yM@9BY-vV>q8>cg*fiR+H8defeI^2PGFj2G0S?GF z6Q;B>BMmPaCp7m>%ol3~z$SUl1n0YGN$^`-fK#Z`6iS{ha;Tf3NH{lKpiH2h>FF;8 z;z{lo7!LjjP9b}<3YE7f=AE-rC6k;K>k8v{jf^~qTs_WwpjmCTXR|yz?RBUQ-N&+V z7ZuweBII5+&$*oVO*Jfg;Rtema6AqMl?<^(n$@e~N;FGb>!{mI0b!W*)Qx zPBVPw72!EHD4OYU0^&5_qq+pbCiSpl?z58I@S|kAAy&F7=`f~?Fcek=m(Latd#Rgn zR0)=x_EqTjI-}`I-WO(N2O;})$4IPn$@ERiKrmHsGty-gKnW_~)Q}|U0<}FOXe^gw z2kKD+0C?h3P2z>3u`oCimQ9cEPJb?SmI_884-`XPeFABXJIMpwk*=UZ;pm^+#z)aG zw+Ei$U+B#36`^Gbr$)v)qp}sP3g}6}PaQ~^{AM9Ap=ZKn>3wlJq0*sCxGA2vy0K4` zD4d!v4cag-uExU3PHzh2?LF0nVKsdt3>YXQ+-iFKf9%g=;75zBt|yjIHI(3aXf7O* z_LLta5;5V=Xq#*DNBY886}awIxeY\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: CANADA\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Une erreur 404 est survenue" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Le contrôleur demandé n'a pas pu acheminer la requête." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Le contrôleur demandé ne correspond pas à une classe contrôleur existante." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Le contrôleur demandé ne peut être acheminé." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "L'URL demandée n'a pas pu trouver de route correspondante." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nous ne pouvons pas déterminer pour le moment pourquoi une 404 a été générée." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Contrôleur" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "résout en %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exception" + +#: ../view/error/404.phtml:55 +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +msgid "Stack trace" +msgstr "Pile d'exécution" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Une erreur est survenue" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informations complémentaires" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Fichier" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Message" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Exceptions précédentes" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Aucune exception disponible" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenue dans %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Félicitations ! Vous avez installé %sZF2 Skeleton Application%s avec succès. Vous utilisez actuellement Zend Framework version %s. Cette structure peut vous servir comme point de départ simple pour démarrer la construction de votre application avec ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Faites un Fork de Zend Framework 2 sur GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Suivre le développement" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 est en cours de développement. Si vous êtes intéressé pour suivre l'évolution de ZF2, il existe un portail dédié à ZF2 sur le site officiel Zend Framework qui propose des liens vers le %swiki%s ZF2, le %sblogue de dev%s, le %ssuivi des problèmes%s, et bien plus encore. Il s'agit d'une excellente ressource pour rester à jour sur les dernières évolutions !" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portail sur le développement de ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Découvrez les modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La communauté travaille sur le développement d'un site communautaire avec l'objectif de servir de dépôt et de galerie pour les modules ZF2. Le projet est disponible %ssur GitHub%s. Le site est déjà en ligne, et contient une liste non exhaustive des modules déjà disponibles pour ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Explorer les modules ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aide & support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si vous avez besoin d'aide ou de soutient en développant avec ZF2, vous pouvez nous joindre sur IRC : %s#zftalk.2 sur Freenode%s. Nous aimerions connaître vos questions ou les commentaires que vous pourriez avoir au sujet des versions beta. Sinon, vous pouvez vous abonner, et poser des questions sur la %sliste de diffusion%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Rejoignez-nous sur IRC" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Accueil" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tous droits réservés." + diff --git a/module/Application/language/fr_FR.mo b/module/Application/language/fr_FR.mo new file mode 100644 index 0000000000000000000000000000000000000000..28f1932ad37233a88a93cdd0dc86a9c817716d66 GIT binary patch literal 5077 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 literal 0 HcmV?d00001 diff --git a/module/Application/language/fr_FR.po b/module/Application/language/fr_FR.po new file mode 100644 index 00000000..49f89d92 --- /dev/null +++ b/module/Application/language/fr_FR.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:32-0700\n" +"PO-Revision-Date: 2012-07-05 23:36-0700\n" +"Last-Translator: Evan Coury \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: FRANCE\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Accueil" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tous droits réservés." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenue dans le %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Félicitations ! Vous avez installé avec succès le %sZF2 Skeleton Application%s. Vous utilisez actuellement Zend Framework version %s. Cette structure peut vous servir comme un point de départ simple pour démarrer la construction de votre application avec ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Faites un Fork de Zend Framework 2 sur GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Suivre le développement" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 est en cours de développement. Si vous êtes intéressé pour suivre l'évolution de ZF2, il existe un portail dédié à ZF2 sur le site officiel Zend Framework qui propose des liens vers le %swiki%s ZF2, %sdev blog%s, %ssuivi des problèmes%s, et bien plus encore. Il s'agit d'une excellente ressource pour rester à jour sur les dernières évolutions !" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portail sur le développement de ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Découvrez les modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La communauté travaille sur le développement d'un site communautaire avec l'objectif de servir de dépôt et de galerie pour les modules ZF2. Le projet est disponible %ssur GitHub%s. Le site est déjà en ligne, et contient une liste non exhaustive des modules déjà disponibles pour ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Explorer les modules ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aide & support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si vous avez besoin d'aide ou de support en développant avec ZF2, vous pouvez nous joindre sur IRC : %s#zftalk.2 sur Freenode%s. Nous aimerions avoir vos questions ou vos commentaires que vous pourriez avoir au sujet des versions bêta. Sinon, vous pouvez vous abonner, et poser des questions sur la %sliste de diffusion%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Rejoignez-nous sur IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Une erreur est survenue" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informations complémentaires" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Fichier" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Message" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Pile d'exécution" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Exceptions précédentes" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Aucune exception disponible" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Une erreur 404 est survenue" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Le contrôleur demandé n'a pas pu dispatcher la requête." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Le contrôleur demandé ne correspond pas à une classe existante de contrôleur." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Le contrôleur demandé n'est pas dispatchable." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "L'URL demandée n'a pas pu trouver de route correspondante." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nous ne pouvons pas déterminer pour le moment pourquoi une 404 a été générée." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Contrôleur" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "résout en %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exception" + diff --git a/module/Application/language/it_IT.mo b/module/Application/language/it_IT.mo new file mode 100644 index 0000000000000000000000000000000000000000..3656ac349512a2f60b0ea2ad8658554c27c13cdf GIT binary patch literal 4922 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\n" +"Language-Team: ZF Contributors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,-1,5,-1,-1,-1\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Pagina iniziale" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tutti i diritti sono riservati." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Benvenuto in %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Congratulazioni! Hai appena installato con successo %sZF2 Skeleton Application%s e stai utilizzando la versione %s di Zend Framework. Questa struttura può servirti come semplice punto di riferimento per iniziare a costruire un'applicazione basata su ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Crea un fork di Zend Framework 2 su GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Segui lo sviluppo" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 è in forte sviluppo. Se sei interessato a seguire lo sviluppo di ZF2, è presente un portale che fornisce link al %swiki%s, al %sdev blog%s, all'%sissue tracker%s e a molto altro riguardo a ZF2. Il Portale è un'ottima risorsa per rimanere aggiornati con gli ultimi sviluppi!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portale sullo sviluppo di ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Scopri i Moduli" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La community sta lavorando allo sviluppo di un sito che deve servire come raccolta e gallery di Moduli per ZF2. Il progetto è disponibile %son Github%s. Il sito è visitabile e al momento contiene una lista di alcuni dei Moduli già disponibili per ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Esplora i Moduli di ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aiuto & Supporto" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Qualora ti servisse aiuto o supporto mentre sviluppi con ZF2, puoi contattarci tramite IRC: %s#zftalk.2 on Freenode%s. Ci piacerebbe moltissimo ricevere le tue domande o qualunque feedback tu possa avere riguardo alle beta release. In alternativa, puoi iscriverti e inviare domande alla %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Contattaci su IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Si è verificato un errore" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informazioni aggiuntive" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "File" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Messaggio" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Eccezioni precedenti" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Non è disponibile alcuna eccezione" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Si è verificato un errore 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Il controller richiesto non è stato in grado di elaborare la richiesta." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Non è stato possibile mappare il controller richiesto ad una classe di tipo controller." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Il controller richiesto non è un oggetto dispatchable." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Non è stato possibile effettuare il match dell'indirizzo richiesto tramite routing." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "In questo momento non siamo in grado di determinare perchè sia stato generato un 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "viene risolto in %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Eccezione" + diff --git a/module/Application/language/ja_JP.mo b/module/Application/language/ja_JP.mo new file mode 100644 index 0000000000000000000000000000000000000000..66b6f3ccb4213eae7758f2b6cd6bfb94f6f23a06 GIT binary patch literal 5185 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 literal 0 HcmV?d00001 diff --git a/module/Application/language/ja_JP.po b/module/Application/language/ja_JP.po new file mode 100644 index 00000000..d6a953ee --- /dev/null +++ b/module/Application/language/ja_JP.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 19:30-0700\n" +"PO-Revision-Date: 2012-07-15 08:20+0900\n" +"Last-Translator: sasezaki \n" +"Language-Team: Japanese\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Japanese\n" +"X-Poedit-Country: Japan\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "%sZend Framework 2%s へようこそ" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "おめでとうございます! %sZF2 Skeleton Application%s のインストールに成功しました。 あなたは Zend Framework version %s を動作させています。このスケルトンはZF2上でのアプリケーション構築を始めるためにシンプルなスタートポイントを提供します。" + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "GitHub で Zend Framework 2 をフォーク" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "開発を追う" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 は鋭意開発中です。ZF2の開発進行にご関心がおありでしょうか、Zend Framework公式ウェブサイト上ではZF2特別ポータルがあり、 %swiki%s、 %sdev blog%s、 %sissue tracker%s、 などのZF2関連のものを提供しています。最新の開発状況に追随するためのすばらしいリソースです。" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 開発ポータル" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "モジュールを見つける" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "コミュニティーはZF2モジュールのためのリポジトリとギャラリーを提供するコミュニティーサイトを開発中です。プロジェクトは %s GitHub%s で利用可能です。サイトは現在運営されており、ZF2ですでに利用可能なモジュールのリストを持っています。" + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "ZF2モジュールを探す" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "ヘルプとサポート" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "ZF2 で開発中に何らかのお手伝いやサポートが必要な場合、IRC を通じて私たちと連絡することができます。: %s#zftalk.2 on Freenode%s ベータ版についてあなたが抱えるかもしれない質問やフィードバックを何でも聞きたいと望みます。あるいは、%smailing lists%s を購読したり質問をポストしたりできます。" + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "IRC で呼び出す" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "エラーが発生しました" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "追加の情報" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "ファイル" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "メッセージ" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "スタックトレース" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "前の例外" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "例外が利用できません" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "404エラーが発生しました" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "要求されたコントローラはリクエストをディスパッチできませんでした。" + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "要求されたコントローラは存在するコントローラクラスにマッピングできませんでした。" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "要求されたコントローラはディスパッチ不可能でした。" + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "要求されたURLはルーティングにマッチしませんでした。" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "404が生成された理由について現時点で判断できません。" + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "コントローラ" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "%s に解決" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "例外" + diff --git a/module/Application/language/nl_NL.mo b/module/Application/language/nl_NL.mo new file mode 100644 index 0000000000000000000000000000000000000000..a03a3328cfb393bb53fab0b04298f56255c8086f GIT binary patch literal 4815 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 literal 0 HcmV?d00001 diff --git a/module/Application/language/nl_NL.po b/module/Application/language/nl_NL.po new file mode 100644 index 00000000..fa97eae1 --- /dev/null +++ b/module/Application/language/nl_NL.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-24 12:48+0100\n" +"Last-Translator: Walter Tamboer\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Dutch\n" +"X-Poedit-Country: NETHERLANDS\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Applicatie Fundering" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Home" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Alle rechten voorbehouden." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Welkom bij %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Gefeliciteerd! Je hebt de %sZF2 Applicatie Fundering%s succesvol geinstalleerd. Je gebruikt Zend Framework versie %s. Deze fundering biedt je een startpunt om je ZF2 applicatie op voort te bouwen." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 op GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Volg de Ontwikkeling" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 wordt actief ontwikkeld. Als je interesse hebt in het volgen van deze ontwikkelingen dan kun je de ZF2 portaal bezoeken op de officiële website van Zend Framework. Daar staan links naar de ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s en nog veel meer. Het is het perfecte middel om up-to-date te blijven met de ontwikkelingen." + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Ontwikkelaars Portaal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Ontdek Modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "De community werkt aan een eigen community website die dient als een bewaarplaats en galerij voor ZF2 modules. Het project is beschikbaar %sop GitHub%s. De site staat op dit moment live en bevat een lijst met modules die op dit moment beschikbaar zijn voor ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Verken ZF2 Modules" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Hulp & Support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Als je hulp nodig hebt tijdens het ontwikkelen met ZF2, dan kun je ons bereiken via IRC: %s#zftalk.2 op Freenode%s. We beantwoorde met alle liefde je vragen en zouden graag feedback krijgen betreffende de beta releases. Je kunt je ook abonneren op de %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Ping ons via IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Er is een fout opgetreden" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Additionele informatie" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Bestand" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Bericht" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stack trace" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Vorige excepties" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Geen exceptie beschikbaar" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "De pagina kon niet worden gevonden." + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "De opgevraagde controller kon deze aanvraag niet verwerken." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Er is geen mapping beschikbaar voor de opgevraagde controller." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "De opgevraagde controller is niet bruikbaar (dispatchable)." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Er is geen route gevonden die overeenkomt met de opgevraagde URL." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "We kunnen op dit moment niet achterhalen waarom de pagina niet kon worden gevonden." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "verwijst naar %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exceptie" + diff --git a/module/Application/language/pl_PL.mo b/module/Application/language/pl_PL.mo new file mode 100644 index 0000000000000000000000000000000000000000..0df3fc6d1c60bd28da8262ba9698a293a35d4155 GIT binary patch literal 4934 zcmb7`PmCm09mh)r(EsytZD| z6xHG4#*G(^7d@BiGwHn{9biW&yFO7N_T&|s^0JS zet*C3_x3%v{UYL0d>@qW$D-&l!H@I9^=I%4;9tNmf^X07-vd9-{mLhz=-=Rj;ELSe z7Db-}?*l&#J_6ngu7P}_GyL2Go&&!Qet&-d7RV?189(=8!_UDxxc~L--M+sCKg0c> zK+*RPQ0#gKyc2vMjF7wYlTozJ-@6dL06q)$!JmT9fH%NzgZ~9(|HnVo>E8igMScv* zK7Yjc|8W0T@ILPUz$UWa-$9AfJD~V~$6ZnMH}C;a{CyV``S(CnMYrAE`Fl4g{weUQ z;41hqcp4PFL-4cUTi`DH{sa_#|3cXV;Je`0z}s0Q@%zRcp9IDK7s30HdkuV+`+_8F zgTDdS!1qCk%NjiZ!I4*tK z6~j_jbrz)jL+W)`tC8L}%GYshyx*&{tVOf0be5S!RU@NT{To~BY9}?Bsa&BpCzH&^ zLBXo;2MxM3D%e+4NSAd{*kY*OFh!!aN}Zd=m8se{rN>m%_0{gkdgT`yV_m3Vv(jE^ z*VY9#A$$ajlWGh#!PbUTSpjjcvv z(TO0JYocm&JW{n+`&O%S7f){x$cLwUP;Po?qL-aIOor0?EYky`zb%V#m*C=Uv|XBg>$o?I z#QErhN;2B1#Hp&(v59u^A$ECQ7q+6Ry^=x{y(m2rY<*;rw^az*k$Nl*KH18ZZE$cX zoxy)8NU52;t0*aIqb8*ro4As_4qYKphZWKlKgBKEuxQye8Bq=TmycrVSJR91ghWlb zJ>{t;L5b;nW2G}{Bf+>u>=vf=LjXz>@=oQwdhtA-)>)zoSCL!=dBh`L3@9&GOS2sp z5fi!=Ixabx2t7DVCM8%WVLiG!)1D+tOqK>5dEe0LVnt&8M68gUf5`H>kVUfRLMVh` zuD%~#BH6kKN)3gY+k${rtRc>oC2q}#AO%vD-G``bg4z zga*_$jjglj_)1A=T_muKj-^Q!H73;2S91;!u7uAFG|k@pC0oKX5sX5*;{z z=OPuzabjW%`HM-yFZ`vrM9}T++3wY?4m4&!dc=DRfl#3PHZh)xDpKOowWnxX^^HyK zsz1R$j8KEj4ZAz*eNAv^snnG6Ncudl(UwD;b2bmw4XMORP9P{bHlYro@m74RCn0kL zydyU;nPZ439Cg`06p3`UkA>Jq?6YYn^uXQKLMquDY^B*~mRxZ-1W!1ajhc@Y* zs)xR}>o(NN_A9%+(_$Ii*E_?W8)|*+rb-p zB3=w@sIRwcbdEP$>NIU;2Q|99dS<%UBmNcdo|}?N5nIaO&V_Rq&MsqdvcI+>;?zrT zx1HcyW!|j5Imuv-rxlG=dQ*Mp)!nV$Q_FQ?`kpC!XN%Yg+i$3+2DV!HUT@nO=8N7- zriCgKf1b)g;oMWRT(EFqgI<7}M$0#+T@7Wlym;mO=F4Z6FHUiY(CVWN)n7i`;cSXW z+dS^A@uI&HU21)GaAjg=m(^f)`QS<-4I7 zs%JM^xMX^KCTLVct&S~F1I*8KDbhu^w@Keinh@b z&3?&rH~XDLjy}Zz#=@LrxAC-)$)`-~@o}ftW#4Yld6e_nDZc&~^d4b=Z<>3`I%tRf>9scJQedo z3(kHIMagij6ArF0VoB!mo7aah*c8ikfFZgb3--3Xpq_IO!56e6QbTv~=E zXGPWKs?<{mmGH#Vt{}shCFVnChkOn_+e(jBBTReixbjivt&q}2&ZiXik>t{0k{&6~ z1%1p}jmLd8=Od95nit*=lUNsCTE;Angt1s(x@qIa^$Cf(1Rdh;#xHU)AHL+AAT5sB zYs{Ho#$CB#%`v}N)YTNxS#+%OSKEe>@2sORUslxBU)!2;1KWd!0X?Bel m73B>rjlHx=%QNxL1`-$-PS}moveXqb7miASb}fw+(f\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Polish\n" +"X-Poedit-Country: POLAND\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Szkielet Aplikacji" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Strona startowa" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Wszelkie prawa zastrzeżone." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Witaj w %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Gratulacje! Z powodzeniem zainstalowałeś %sZF2 Skeleton Application%s. Aktualnie używasz Zend Framework w wersji %s. Ten szkielet może służyć jak prosty punkt startowy do budowy Twoich aplikacji na ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Forkuj Zend Framework 2 na GitHub'e" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Śledź prace programistyczne" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 jest w trakcie aktywnych prac programistycznych. Jeśli jesteś zainteresowany śledzeniem jego rozwoju, istnieje specialny portal ZF2 na oficjalnej stronie Zend Framework na którym dostępne są linki do ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, oraz wiele więcej. Jest to świetne miejsce by śledzić najnowsze zmiany!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Development Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Odkryj Moduły" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Społeczność pracuje nad stworzeniem społecznościowego serwisu który posłuży jako repozytorium i galeria dla modułów ZF2. Projekt wkrótce będzie dostępny na %son GitHub%s. Ta strona jest aktualnie online i udostępnia listę niektórych modułów dostępnych dla ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Odkryj Moduły ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Pomoc & Wsparcie" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Jeśli potrzebujesz jakiejkolwiek pomocy lub wsparcia podczas programowania na ZF2, możesz skontaktować się z nami via IRC: %s#zftalk.2 w sieci Freenode%s. Z przyjemnością wysłuchamy wszelkich pytań lub sugestii które możesz mieć odnoście wydań beta. Alternatywnie, możesz zapisać się i wysłać pytanie na %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Wyślij nam wiadomość na IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Wystąpił błąd" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Dodatkowe informacje" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Plik" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Komunikat" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stack trace" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Poprzedni wyjątek" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Brak dostępnego wyjątku" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Wystąpił błąd 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Żądany kontroler nie mógł zmapować żądania." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Żądany kontroler nie mógł być zmapowany na isteniejącą klasę kontrolera." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Żądany kontroler nie mógł zostać zmapowany." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Żądany adres URL nie mógł zostać powiązany z routing'iem." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nie możemy określić tym razem dlaczego wygenerowano błąd 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Kontroler" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "rozwiązuje na %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Wyjątek" + diff --git a/module/Application/language/tr_TR.mo b/module/Application/language/tr_TR.mo new file mode 100644 index 0000000000000000000000000000000000000000..952882142e8f6f0863f0fb0c08efdf31590512d3 GIT binary patch literal 4785 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\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Turkish\n" +"X-Poedit-Country: TURKEY\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Anasayfa" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tüm haklar saklıdır." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "%sZend Framework 2%s'a hoş geldiniz" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Tebrikler! %sZF2 Skeleton Application%s'u başarıyla yüklediniz. Şu anda Zend Framework %s sürüm ile çalışıyorsunuz. Bu iskelet ZF2 üzerinde uygulama oluşturmak için basit bir başlangıç ​​noktası olarak hizmet verebilir." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Zend Framework 2'yi GitHub'da fork edin" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Gelişimi izleyin" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 aktif geliştirilmektedir. Eğer ZF2'nin gelişimi ile ilgileniyorsanız, ZF2 için resmi Zend Framework websitesinde özel portal mevcut, orada ZF2 %swiki%s'ye, %sDEV blog%s'a, %ssorun takibi%s'ne bağlantılarını ve çok daha fazlasını sunar. Bu son gelişmeler ile güncel kalmak için büyük bir kaynaktır!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Development Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Modülleri keşfedin" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Topluluk ZF2 modülleri için bir depo ve galeri olarak hizmet edecek bir topluluk sitesi geliştirme üzerinde çalışıyor. Proje %sGitHub%s'da mevcut. Site şu anda canlı ve ZF2 için bazı mevcut modüllerin listesini içerir." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "ZF2 Modüllerini keşfedin" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Yardım & Destek" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "ZF2 ile geliştirirken herhangi yardım veya desteğe ihtiyacınız varsa, bize IRC: %sFreenode #zftalk.2%s üzerinden ulaşabilirsiniz. Beta sürümleri ile ilgili olabilecek herhangi bir sorunuzu ya da yorumlarınızı duymak isteriz. Alternatif olarak %smailing listelerine%s abone olup sorularınızı sorabilirsiniz." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "IRC bizi pingleyin" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "An error occurred" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Ek bilgiler" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Klasör" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Mesaj" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Denetleyici" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Önceki istisnalar" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "İstisna yok" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Bir 404 hatası oluştu" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Talep edilen denetleyici işlemi işlemesi mümkün değildir." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Talep edilen denetleyiciye uygun denetleyici sınıfı tahsis edilemedi." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Talep edilen denetleyici çağrılabilir değildir." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "İstenen URL yönlendirmede tahsis edilemedi" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Neden 404 hatasının oluştuğunu şu an belirleyemiyoruz." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Denetleyici" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "Buraya çözümlenir: %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "İstisna" + diff --git a/module/Application/src/Application/Controller/IndexController.php b/module/Application/src/Application/Controller/IndexController.php new file mode 100644 index 00000000..a1aafaee --- /dev/null +++ b/module/Application/src/Application/Controller/IndexController.php @@ -0,0 +1,21 @@ + +

translate('Welcome to %sZend Framework 2%s'), '', '') ?>

+
+

translate('Fork Zend Framework 2 on GitHub') ?> »

+

translate('Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2.'), '', '', \Zend\Version\Version::VERSION) ?>

+ +
+ +
+

translate('Follow Development') ?>

+

translate('Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!'), '', '', '', '', '', '') ?>

+

translate('ZF2 Development Portal') ?> »

+
+ +
+

translate('Discover Modules') ?>

+

translate('The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2.'), '', '') ?>

+

translate('Explore ZF2 Modules') ?> »

+
+ +
+

translate('Help & Support') ?>

+

translate('If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We\'d love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s.'), '', '', '', '') ?>

+

translate('Ping us on IRC') ?> »

+
+
diff --git a/module/Application/view/error/404.phtml b/module/Application/view/error/404.phtml new file mode 100644 index 00000000..3edd37a8 --- /dev/null +++ b/module/Application/view/error/404.phtml @@ -0,0 +1,61 @@ +

translate('A 404 error occurred') ?>

+

message ?>

+ +reason) && $this->reason): ?> + +reason) { + case 'error-controller-cannot-dispatch': + $reasonMessage = $this->translate('The requested controller was unable to dispatch the request.'); + break; + case 'error-controller-not-found': + $reasonMessage = $this->translate('The requested controller could not be mapped to an existing controller class.'); + break; + case 'error-controller-invalid': + $reasonMessage = $this->translate('The requested controller was not dispatchable.'); + break; + case 'error-router-no-match': + $reasonMessage = $this->translate('The requested URL could not be matched by routing.'); + break; + default: + $reasonMessage = $this->translate('We cannot determine at this time why a 404 was generated.'); + break; +} +?> + +

+ + + +controller) && $this->controller): ?> + +
+
translate('Controller') ?>:
+
escapeHtml($this->controller) ?> +controller_class) + && $this->controller_class + && $this->controller_class != $this->controller +) { + echo '(' . sprintf($this->translate('resolves to %s'), $this->escapeHtml($this->controller_class)) . ')'; +} +?> +
+
+ + + +exception) && $this->exception): ?> + +

translate('Exception') ?>:

+ +

escapeHtml($this->exception->getMessage()) ?>

+ +

translate('Stack trace') ?>:

+ +
+exception->getTraceAsString() ?>
+
+ + diff --git a/module/Application/view/error/index.phtml b/module/Application/view/error/index.phtml new file mode 100644 index 00000000..5165cd8e --- /dev/null +++ b/module/Application/view/error/index.phtml @@ -0,0 +1,62 @@ +

translate('An error occurred') ?>

+

message ?>

+ +display_exceptions) && $this->display_exceptions): ?> + +exception) && $this->exception instanceof Exception): ?> +
+

translate('Additional information') ?>:

+

exception); ?>

+
+
translate('File') ?>:
+
+
exception->getFile() ?>:exception->getLine() ?>
+
+
translate('Message') ?>:
+
+
exception->getMessage() ?>
+
+
translate('Stack trace') ?>:
+
+
exception->getTraceAsString() ?>
+
+
+exception->getPrevious(); + if ($e) : +?> +
+

translate('Previous exceptions') ?>:

+
    + +
  • +

    +
    +
    translate('File') ?>:
    +
    +
    getFile() ?>:getLine() ?>
    +
    +
    translate('Message') ?>:
    +
    +
    getMessage() ?>
    +
    +
    translate('Stack trace') ?>:
    +
    +
    getTraceAsString() ?>
    +
    +
    +
  • + getPrevious(); + endwhile; + ?> +
+ + + + +

translate('No Exception available') ?>

+ + + + diff --git a/module/Application/view/layout/layout.phtml b/module/Application/view/layout/layout.phtml new file mode 100644 index 00000000..d5af45f6 --- /dev/null +++ b/module/Application/view/layout/layout.phtml @@ -0,0 +1,57 @@ +doctype(); ?> + + + + + headTitle('ZF2 '. $this->translate('Skeleton Application'))->setSeparator(' - ')->setAutoEscape(false) ?> + + headMeta()->appendName('viewport', 'width=device-width, initial-scale=1.0') ?> + + + headLink(array('rel' => 'shortcut icon', 'type' => 'image/vnd.microsoft.icon', 'href' => $this->basePath() . '/images/favicon.ico')) + ->prependStylesheet($this->basePath() . '/css/bootstrap-responsive.min.css') + ->prependStylesheet($this->basePath() . '/css/style.css') + ->prependStylesheet($this->basePath() . '/css/bootstrap.min.css') ?> + + + headScript()->prependFile($this->basePath() . '/js/html5.js', 'text/javascript', array('conditional' => 'lt IE 9',)) + ->prependFile($this->basePath() . '/js/jquery-1.7.2.min.js') ?> + + + + + + + +
+ + content; ?> + +
+ +
+

© 2005 - 2012 by Zend Technologies Ltd. translate('All rights reserved.') ?>

+
+ +
+ + inlineScript() ?> + + diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 00000000..10d71d77 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,7 @@ +RewriteEngine On +RewriteCond %{REQUEST_FILENAME} -s [OR] +RewriteCond %{REQUEST_FILENAME} -l [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteBase /fmi +RewriteRule ^.*$ - [NC,L] +RewriteRule ^.*$ index.php [NC,L] diff --git a/public/css/bootstrap-responsive.min.css b/public/css/bootstrap-responsive.min.css new file mode 100644 index 00000000..bc3f2ab7 --- /dev/null +++ b/public/css/bootstrap-responsive.min.css @@ -0,0 +1,3 @@ + +.hidden{display:none;visibility:hidden;} +@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:768px){.container{width:auto;padding:0 20px;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;}}@media (min-width:768px) and (max-width:980px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .span1{width:42px;} .span2{width:104px;} .span3{width:166px;} .span4{width:228px;} .span5{width:290px;} .span6{width:352px;} .span7{width:414px;} .span8{width:476px;} .span9{width:538px;} .span10{width:600px;} .span11{width:662px;} .span12,.container{width:724px;} .offset1{margin-left:82px;} .offset2{margin-left:144px;} .offset3{margin-left:206px;} .offset4{margin-left:268px;} .offset5{margin-left:330px;} .offset6{margin-left:392px;} .offset7{margin-left:454px;} .offset8{margin-left:516px;} .offset9{margin-left:578px;} .offset10{margin-left:640px;} .offset11{margin-left:702px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.801104972%;} .row-fluid .span2{width:14.364640883%;} .row-fluid .span3{width:22.928176794%;} .row-fluid .span4{width:31.491712705%;} .row-fluid .span5{width:40.055248616%;} .row-fluid .span6{width:48.618784527%;} .row-fluid .span7{width:57.182320438000005%;} .row-fluid .span8{width:65.74585634900001%;} .row-fluid .span9{width:74.30939226%;} .row-fluid .span10{width:82.87292817100001%;} .row-fluid .span11{width:91.436464082%;} .row-fluid .span12{width:99.999999993%;} input.span1,textarea.span1,.uneditable-input.span1{width:32px;} input.span2,textarea.span2,.uneditable-input.span2{width:94px;} input.span3,textarea.span3,.uneditable-input.span3{width:156px;} input.span4,textarea.span4,.uneditable-input.span4{width:218px;} input.span5,textarea.span5,.uneditable-input.span5{width:280px;} input.span6,textarea.span6,.uneditable-input.span6{width:342px;} input.span7,textarea.span7,.uneditable-input.span7{width:404px;} input.span8,textarea.span8,.uneditable-input.span8{width:466px;} input.span9,textarea.span9,.uneditable-input.span9{width:528px;} input.span10,textarea.span10,.uneditable-input.span10{width:590px;} input.span11,textarea.span11,.uneditable-input.span11{width:652px;} input.span12,textarea.span12,.uneditable-input.span12{width:714px;}}@media (max-width:980px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .span1{width:70px;} .span2{width:170px;} .span3{width:270px;} .span4{width:370px;} .span5{width:470px;} .span6{width:570px;} .span7{width:670px;} .span8{width:770px;} .span9{width:870px;} .span10{width:970px;} .span11{width:1070px;} .span12,.container{width:1170px;} .offset1{margin-left:130px;} .offset2{margin-left:230px;} .offset3{margin-left:330px;} .offset4{margin-left:430px;} .offset5{margin-left:530px;} .offset6{margin-left:630px;} .offset7{margin-left:730px;} .offset8{margin-left:830px;} .offset9{margin-left:930px;} .offset10{margin-left:1030px;} .offset11{margin-left:1130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.982905983%;} .row-fluid .span2{width:14.529914530000001%;} .row-fluid .span3{width:23.076923077%;} .row-fluid .span4{width:31.623931624%;} .row-fluid .span5{width:40.170940171000005%;} .row-fluid .span6{width:48.717948718%;} .row-fluid .span7{width:57.264957265%;} .row-fluid .span8{width:65.81196581200001%;} .row-fluid .span9{width:74.358974359%;} .row-fluid .span10{width:82.905982906%;} .row-fluid .span11{width:91.45299145300001%;} .row-fluid .span12{width:100%;} input.span1,textarea.span1,.uneditable-input.span1{width:60px;} input.span2,textarea.span2,.uneditable-input.span2{width:160px;} input.span3,textarea.span3,.uneditable-input.span3{width:260px;} input.span4,textarea.span4,.uneditable-input.span4{width:360px;} input.span5,textarea.span5,.uneditable-input.span5{width:460px;} input.span6,textarea.span6,.uneditable-input.span6{width:560px;} input.span7,textarea.span7,.uneditable-input.span7{width:660px;} input.span8,textarea.span8,.uneditable-input.span8{width:760px;} input.span9,textarea.span9,.uneditable-input.span9{width:860px;} input.span10,textarea.span10,.uneditable-input.span10{width:960px;} input.span11,textarea.span11,.uneditable-input.span11{width:1060px;} input.span12,textarea.span12,.uneditable-input.span12{width:1160px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}} diff --git a/public/css/bootstrap.min.css b/public/css/bootstrap.min.css new file mode 100644 index 00000000..b01f92e6 --- /dev/null +++ b/public/css/bootstrap.min.css @@ -0,0 +1,610 @@ +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} +audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} +audio:not([controls]){display:none;} +html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} +a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +a:hover,a:active{outline:0;} +sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} +sup{top:-0.5em;} +sub{bottom:-0.25em;} +img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;} +button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} +button,input{*overflow:visible;line-height:normal;} +button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} +button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} +input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} +input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} +textarea{overflow:auto;vertical-align:top;} +body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;} +a{color:#0088cc;text-decoration:none;} +a:hover{color:#005580;text-decoration:underline;} +.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} +.row:after{clear:both;} +[class*="span"]{float:left;margin-left:20px;} +.span1{width:60px;} +.span2{width:140px;} +.span3{width:220px;} +.span4{width:300px;} +.span5{width:380px;} +.span6{width:460px;} +.span7{width:540px;} +.span8{width:620px;} +.span9{width:700px;} +.span10{width:780px;} +.span11{width:860px;} +.span12,.container{width:940px;} +.offset1{margin-left:100px;} +.offset2{margin-left:180px;} +.offset3{margin-left:260px;} +.offset4{margin-left:340px;} +.offset5{margin-left:420px;} +.offset6{margin-left:500px;} +.offset7{margin-left:580px;} +.offset8{margin-left:660px;} +.offset9{margin-left:740px;} +.offset10{margin-left:820px;} +.offset11{margin-left:900px;} +.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} +.row-fluid:after{clear:both;} +.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;} +.row-fluid>[class*="span"]:first-child{margin-left:0;} +.row-fluid .span1{width:6.382978723%;} +.row-fluid .span2{width:14.89361702%;} +.row-fluid .span3{width:23.404255317%;} +.row-fluid .span4{width:31.914893614%;} +.row-fluid .span5{width:40.425531911%;} +.row-fluid .span6{width:48.93617020799999%;} +.row-fluid .span7{width:57.446808505%;} +.row-fluid .span8{width:65.95744680199999%;} +.row-fluid .span9{width:74.468085099%;} +.row-fluid .span10{width:82.97872339599999%;} +.row-fluid .span11{width:91.489361693%;} +.row-fluid .span12{width:99.99999998999999%;} +.container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";} +.container:after{clear:both;} +.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";} +.container-fluid:after{clear:both;} +p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;} +.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;} +h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;} +h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;} +h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;} +h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;} +h4,h5,h6{line-height:18px;} +h4{font-size:14px;}h4 small{font-size:12px;} +h5{font-size:12px;} +h6{font-size:11px;color:#999999;text-transform:uppercase;} +.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;} +.page-header h1{line-height:1;} +ul,ol{padding:0;margin:0 0 9px 25px;} +ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} +ul{list-style:disc;} +ol{list-style:decimal;} +li{line-height:18px;} +ul.unstyled{margin-left:0;list-style:none;} +dl{margin-bottom:18px;} +dt,dd{line-height:18px;} +dt{font-weight:bold;} +dd{margin-left:9px;} +hr{margin:18px 0;border:0;border-top:1px solid #e5e5e5;border-bottom:1px solid #ffffff;} +strong{font-weight:bold;} +em{font-style:italic;} +.muted{color:#999999;} +abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;} +blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;} +blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} +blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} +q:before,q:after,blockquote:before,blockquote:after{content:"";} +address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;} +small{font-size:100%;} +cite{font-style:normal;} +code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} +pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;}pre.prettyprint{margin-bottom:18px;} +pre code{padding:0;background-color:transparent;} +form{margin:0 0 18px;} +fieldset{padding:0;margin:0;border:0;} +legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;} +label,input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;} +label{display:block;margin-bottom:5px;color:#333333;} +input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.uneditable-textarea{width:auto;height:auto;} +label input,label textarea,label select{display:block;} +input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:0;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +input[type="file"]{padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;} +select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;} +select{width:220px;background-color:#ffffff;} +select[multiple],select[size]{height:auto;} +input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +textarea{height:auto;} +input[type="hidden"]{display:none;} +.radio,.checkbox{padding-left:18px;} +.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;} +.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} +.radio.inline,.checkbox.inline{display:inline-block;margin-bottom:0;vertical-align:middle;} +.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} +.controls>.radio.inline:first-child,.controls>.checkbox.inline:first-child{padding-top:0;} +input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;} +input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;} +input[type="file"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.input-mini{width:60px;} +.input-small{width:90px;} +.input-medium{width:150px;} +.input-large{width:210px;} +.input-xlarge{width:270px;} +.input-xxlarge{width:530px;} +input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;} +input.span1,textarea.span1,.uneditable-input.span1{width:50px;} +input.span2,textarea.span2,.uneditable-input.span2{width:130px;} +input.span3,textarea.span3,.uneditable-input.span3{width:210px;} +input.span4,textarea.span4,.uneditable-input.span4{width:290px;} +input.span5,textarea.span5,.uneditable-input.span5{width:370px;} +input.span6,textarea.span6,.uneditable-input.span6{width:450px;} +input.span7,textarea.span7,.uneditable-input.span7{width:530px;} +input.span8,textarea.span8,.uneditable-input.span8{width:610px;} +input.span9,textarea.span9,.uneditable-input.span9{width:690px;} +input.span10,textarea.span10,.uneditable-input.span10{width:770px;} +input.span11,textarea.span11,.uneditable-input.span11{width:850px;} +input.span12,textarea.span12,.uneditable-input.span12{width:930px;} +input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;} +.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} +.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;} +.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} +.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} +.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;} +.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} +.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} +.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;} +.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} +input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} +.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;} +.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} +:-moz-placeholder{color:#999999;} +::-webkit-input-placeholder{color:#999999;} +.help-block{margin-top:5px;margin-bottom:0;color:#999999;} +.help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;} +.input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";} +.input-prepend:after,.input-append:after{clear:both;} +.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;} +.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;} +.input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;} +.input-prepend .add-on{*margin-top:1px;} +.input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-append .uneditable-input{border-right-color:#ccc;} +.input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;} +.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;} +.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input{display:inline-block;margin-bottom:0;} +.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;} +.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;} +.control-group{margin-bottom:9px;} +.form-horizontal legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;} +.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";} +.form-horizontal .control-group:after{clear:both;} +.form-horizontal .control-group>label{float:left;width:140px;padding-top:5px;text-align:right;} +.form-horizontal .controls{margin-left:160px;} +.form-horizontal .form-actions{padding-left:160px;} +table{max-width:100%;border-collapse:collapse;border-spacing:0;} +.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;border-top:1px solid #ddd;} +.table th{font-weight:bold;vertical-align:bottom;} +.table td{vertical-align:top;} +.table thead:first-child tr th,.table thead:first-child tr td{border-top:0;} +.table tbody+tbody{border-top:2px solid #ddd;} +.table-condensed th,.table-condensed td{padding:4px 5px;} +.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;} +.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} +.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;} +.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;} +.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;} +.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;} +.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} +table .span1{float:none;width:44px;margin-left:0;} +table .span2{float:none;width:124px;margin-left:0;} +table .span3{float:none;width:204px;margin-left:0;} +table .span4{float:none;width:284px;margin-left:0;} +table .span5{float:none;width:364px;margin-left:0;} +table .span6{float:none;width:444px;margin-left:0;} +table .span7{float:none;width:524px;margin-left:0;} +table .span8{float:none;width:604px;margin-left:0;} +table .span9{float:none;width:684px;margin-left:0;} +table .span10{float:none;width:764px;margin-left:0;} +table .span11{float:none;width:844px;margin-left:0;} +table .span12{float:none;width:924px;margin-left:0;} +[class^="icon-"]{display:inline-block;width:14px;height:14px;vertical-align:text-top;background-image:url(../img/glyphicons-halflings.png);background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child{*margin-left:0;} +.icon-white{background-image:url(../img/glyphicons-halflings-white.png);} +.icon-glass{background-position:0 0;} +.icon-music{background-position:-24px 0;} +.icon-search{background-position:-48px 0;} +.icon-envelope{background-position:-72px 0;} +.icon-heart{background-position:-96px 0;} +.icon-star{background-position:-120px 0;} +.icon-star-empty{background-position:-144px 0;} +.icon-user{background-position:-168px 0;} +.icon-film{background-position:-192px 0;} +.icon-th-large{background-position:-216px 0;} +.icon-th{background-position:-240px 0;} +.icon-th-list{background-position:-264px 0;} +.icon-ok{background-position:-288px 0;} +.icon-remove{background-position:-312px 0;} +.icon-zoom-in{background-position:-336px 0;} +.icon-zoom-out{background-position:-360px 0;} +.icon-off{background-position:-384px 0;} +.icon-signal{background-position:-408px 0;} +.icon-cog{background-position:-432px 0;} +.icon-trash{background-position:-456px 0;} +.icon-home{background-position:0 -24px;} +.icon-file{background-position:-24px -24px;} +.icon-time{background-position:-48px -24px;} +.icon-road{background-position:-72px -24px;} +.icon-download-alt{background-position:-96px -24px;} +.icon-download{background-position:-120px -24px;} +.icon-upload{background-position:-144px -24px;} +.icon-inbox{background-position:-168px -24px;} +.icon-play-circle{background-position:-192px -24px;} +.icon-repeat{background-position:-216px -24px;} +.icon-refresh{background-position:-240px -24px;} +.icon-list-alt{background-position:-264px -24px;} +.icon-lock{background-position:-287px -24px;} +.icon-flag{background-position:-312px -24px;} +.icon-headphones{background-position:-336px -24px;} +.icon-volume-off{background-position:-360px -24px;} +.icon-volume-down{background-position:-384px -24px;} +.icon-volume-up{background-position:-408px -24px;} +.icon-qrcode{background-position:-432px -24px;} +.icon-barcode{background-position:-456px -24px;} +.icon-tag{background-position:0 -48px;} +.icon-tags{background-position:-25px -48px;} +.icon-book{background-position:-48px -48px;} +.icon-bookmark{background-position:-72px -48px;} +.icon-print{background-position:-96px -48px;} +.icon-camera{background-position:-120px -48px;} +.icon-font{background-position:-144px -48px;} +.icon-bold{background-position:-167px -48px;} +.icon-italic{background-position:-192px -48px;} +.icon-text-height{background-position:-216px -48px;} +.icon-text-width{background-position:-240px -48px;} +.icon-align-left{background-position:-264px -48px;} +.icon-align-center{background-position:-288px -48px;} +.icon-align-right{background-position:-312px -48px;} +.icon-align-justify{background-position:-336px -48px;} +.icon-list{background-position:-360px -48px;} +.icon-indent-left{background-position:-384px -48px;} +.icon-indent-right{background-position:-408px -48px;} +.icon-facetime-video{background-position:-432px -48px;} +.icon-picture{background-position:-456px -48px;} +.icon-pencil{background-position:0 -72px;} +.icon-map-marker{background-position:-24px -72px;} +.icon-adjust{background-position:-48px -72px;} +.icon-tint{background-position:-72px -72px;} +.icon-edit{background-position:-96px -72px;} +.icon-share{background-position:-120px -72px;} +.icon-check{background-position:-144px -72px;} +.icon-move{background-position:-168px -72px;} +.icon-step-backward{background-position:-192px -72px;} +.icon-fast-backward{background-position:-216px -72px;} +.icon-backward{background-position:-240px -72px;} +.icon-play{background-position:-264px -72px;} +.icon-pause{background-position:-288px -72px;} +.icon-stop{background-position:-312px -72px;} +.icon-forward{background-position:-336px -72px;} +.icon-fast-forward{background-position:-360px -72px;} +.icon-step-forward{background-position:-384px -72px;} +.icon-eject{background-position:-408px -72px;} +.icon-chevron-left{background-position:-432px -72px;} +.icon-chevron-right{background-position:-456px -72px;} +.icon-plus-sign{background-position:0 -96px;} +.icon-minus-sign{background-position:-24px -96px;} +.icon-remove-sign{background-position:-48px -96px;} +.icon-ok-sign{background-position:-72px -96px;} +.icon-question-sign{background-position:-96px -96px;} +.icon-info-sign{background-position:-120px -96px;} +.icon-screenshot{background-position:-144px -96px;} +.icon-remove-circle{background-position:-168px -96px;} +.icon-ok-circle{background-position:-192px -96px;} +.icon-ban-circle{background-position:-216px -96px;} +.icon-arrow-left{background-position:-240px -96px;} +.icon-arrow-right{background-position:-264px -96px;} +.icon-arrow-up{background-position:-289px -96px;} +.icon-arrow-down{background-position:-312px -96px;} +.icon-share-alt{background-position:-336px -96px;} +.icon-resize-full{background-position:-360px -96px;} +.icon-resize-small{background-position:-384px -96px;} +.icon-plus{background-position:-408px -96px;} +.icon-minus{background-position:-433px -96px;} +.icon-asterisk{background-position:-456px -96px;} +.icon-exclamation-sign{background-position:0 -120px;} +.icon-gift{background-position:-24px -120px;} +.icon-leaf{background-position:-48px -120px;} +.icon-fire{background-position:-72px -120px;} +.icon-eye-open{background-position:-96px -120px;} +.icon-eye-close{background-position:-120px -120px;} +.icon-warning-sign{background-position:-144px -120px;} +.icon-plane{background-position:-168px -120px;} +.icon-calendar{background-position:-192px -120px;} +.icon-random{background-position:-216px -120px;} +.icon-comment{background-position:-240px -120px;} +.icon-magnet{background-position:-264px -120px;} +.icon-chevron-up{background-position:-288px -120px;} +.icon-chevron-down{background-position:-313px -119px;} +.icon-retweet{background-position:-336px -120px;} +.icon-shopping-cart{background-position:-360px -120px;} +.icon-folder-close{background-position:-384px -120px;} +.icon-folder-open{background-position:-408px -120px;} +.icon-resize-vertical{background-position:-432px -119px;} +.icon-resize-horizontal{background-position:-456px -118px;} +.dropdown{position:relative;} +.dropdown-toggle{*margin-bottom:-3px;} +.dropdown-toggle:active,.open .dropdown-toggle{outline:0;} +.caret{display:inline-block;width:0;height:0;text-indent:-99999px;*text-indent:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"\2193";} +.dropdown .caret{margin-top:8px;margin-left:2px;} +.dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);} +.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;max-width:220px;_width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.bottom-up{top:auto;bottom:100%;margin-bottom:2px;} +.dropdown-menu .divider{height:1px;margin:5px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;} +.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#555555;white-space:nowrap;} +.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;} +.dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);} +.dropdown.open .dropdown-menu{display:block;} +.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} +.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;} +.collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;} +.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;} +.btn{display:inline-block;padding:4px 10px 4px;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#fafafa;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;*margin-left:.3em;}.btn:first-child{*margin-left:0;} +.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} +.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;color:rgba(0, 0, 0, 0.5);outline:0;} +.btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.btn-large .icon{margin-top:1px;} +.btn-small{padding:5px 9px;font-size:11px;line-height:16px;} +.btn-small .icon{margin-top:-1px;} +.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;} +.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active{color:rgba(255, 255, 255, 0.75);} +.btn-primary{background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-ms-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(top, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0044cc;} +.btn-primary:active,.btn-primary.active{background-color:#003399 \9;} +.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;} +.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} +.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;} +.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} +.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;} +.btn-success:active,.btn-success.active{background-color:#408140 \9;} +.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;} +.btn-info:active,.btn-info.active{background-color:#24748c \9;} +button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} +button.btn.large,input[type="submit"].btn.large{*padding-top:7px;*padding-bottom:7px;} +button.btn.small,input[type="submit"].btn.small{*padding-top:3px;*padding-bottom:3px;} +.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";} +.btn-group:after{clear:both;} +.btn-group:first-child{*margin-left:0;} +.btn-group+.btn-group{margin-left:5px;} +.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;} +.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} +.btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} +.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} +.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;} +.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} +.btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:5px;*padding-bottom:5px;} +.btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);} +.btn .caret{margin-top:7px;margin-left:0;} +.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);} +.btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret{border-top-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);} +.btn-small .caret{margin-top:4px;} +.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.alert,.alert-heading{color:#c09853;} +.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;} +.alert-success{background-color:#dff0d8;border-color:#d6e9c6;} +.alert-success,.alert-success .alert-heading{color:#468847;} +.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;} +.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading{color:#b94a48;} +.alert-info{background-color:#d9edf7;border-color:#bce8f1;} +.alert-info,.alert-info .alert-heading{color:#3a87ad;} +.alert-block{padding-top:14px;padding-bottom:14px;} +.alert-block>p,.alert-block>ul{margin-bottom:0;} +.alert-block p+p{margin-top:5px;} +.nav{margin-left:0;margin-bottom:18px;list-style:none;} +.nav>li>a{display:block;} +.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} +.nav-list{padding-left:14px;padding-right:14px;margin-bottom:0;} +.nav-list>li>a,.nav-list .nav-header{display:block;padding:3px 15px;margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} +.nav-list .nav-header{font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-transform:uppercase;} +.nav-list>li+.nav-header{margin-top:9px;} +.nav-list .active>a,.nav-list .active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} +.nav-list [class^="icon-"]{margin-right:2px;} +.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";} +.nav-tabs:after,.nav-pills:after{clear:both;} +.nav-tabs>li,.nav-pills>li{float:left;} +.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} +.nav-tabs{border-bottom:1px solid #ddd;} +.nav-tabs>li{margin-bottom:-1px;} +.nav-tabs>li>a{padding-top:9px;padding-bottom:9px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} +.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} +.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.nav-pills .active>a,.nav-pills .active>a:hover{color:#ffffff;background-color:#0088cc;} +.nav-stacked>li{float:none;} +.nav-stacked>li>a{margin-right:0;} +.nav-tabs.nav-stacked{border-bottom:0;} +.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} +.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} +.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} +.nav-pills.nav-stacked>li>a{margin-bottom:3px;} +.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} +.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;} +.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;margin-top:6px;} +.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;} +.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;} +.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;} +.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} +.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;opacity:1;filter:alpha(opacity=100);} +.tabs-stacked .open>a:hover{border-color:#999999;} +.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";} +.tabbable:after{clear:both;} +.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;} +.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} +.tab-content>.active,.pill-content>.active{display:block;} +.tabs-below .nav-tabs{border-top:1px solid #ddd;} +.tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;} +.tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} +.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;} +.tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;} +.tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} +.tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} +.tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} +.tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} +.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} +.tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} +.tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} +.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} +.navbar{overflow:visible;margin-bottom:18px;} +.navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);} +.btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;} +.btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;} +.btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} +.btn-navbar .icon-bar+.icon-bar{margin-top:3px;} +.nav-collapse.collapse{height:auto;} +.navbar .brand:hover{text-decoration:none;} +.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;} +.navbar .navbar-text{margin-bottom:0;line-height:40px;color:#999999;}.navbar .navbar-text a:hover{color:#ffffff;background-color:transparent;} +.navbar .btn,.navbar .btn-group{margin-top:5px;} +.navbar .btn-group .btn{margin-top:0;} +.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";} +.navbar-form:after{clear:both;} +.navbar-form input,.navbar-form select{display:inline-block;margin-top:5px;margin-bottom:0;} +.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} +.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} +.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;color:rgba(255, 255, 255, 0.75);background:#666;background:rgba(255, 255, 255, 0.3);border:1px solid #111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query :-moz-placeholder{color:#eeeeee;} +.navbar-search .search-query::-webkit-input-placeholder{color:#eeeeee;} +.navbar-search .search-query:hover{color:#ffffff;background-color:#999999;background-color:rgba(255, 255, 255, 0.5);} +.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} +.navbar-fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030;} +.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} +.navbar .nav.pull-right{float:right;} +.navbar .nav>li{display:block;float:left;} +.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} +.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;} +.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;background-color:rgba(0, 0, 0, 0.5);} +.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;} +.navbar .nav.pull-right{margin-left:10px;margin-right:0;} +.navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} +.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} +.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;} +.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);} +.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;} +.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;} +.navbar .nav.pull-right .dropdown-menu{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before{left:auto;right:12px;} +.navbar .nav.pull-right .dropdown-menu:after{left:auto;right:13px;} +.breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;} +.breadcrumb .divider{padding:0 5px;color:#999999;} +.breadcrumb .active a{color:#333333;} +.pagination{height:36px;margin:18px 0;} +.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} +.pagination li{display:inline;} +.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;} +.pagination a:hover,.pagination .active a{background-color:#f5f5f5;} +.pagination .active a{color:#999999;cursor:default;} +.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;} +.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.pagination-centered{text-align:center;} +.pagination-right{text-align:right;} +.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";} +.pager:after{clear:both;} +.pager li{display:inline;} +.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} +.pager a:hover{text-decoration:none;background-color:#f5f5f5;} +.pager .next a{float:right;} +.pager .previous a{float:left;} +.modal-open .dropdown-menu{z-index:2050;} +.modal-open .dropdown.open{*z-index:2050;} +.modal-open .popover{z-index:2060;} +.modal-open .tooltip{z-index:2070;} +.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} +.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} +.modal{position:fixed;top:50%;left:50%;z-index:1050;max-height:500px;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} +.modal.fade.in{top:50%;} +.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} +.modal-body{padding:15px;} +.modal-footer{padding:14px 15px 15px;margin-bottom:0;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";} +.modal-footer:after{clear:both;} +.modal-footer .btn{float:right;margin-left:5px;margin-bottom:0;} +.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} +.tooltip.top{margin-top:-2px;} +.tooltip.right{margin-left:2px;} +.tooltip.bottom{margin-top:2px;} +.tooltip.left{margin-left:-2px;} +.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.tooltip-arrow{position:absolute;width:0;height:0;} +.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;} +.popover.right{margin-left:5px;} +.popover.bottom{margin-top:5px;} +.popover.left{margin-left:-5px;} +.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.popover .arrow{position:absolute;width:0;height:0;} +.popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);} +.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;} +.popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;} +.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";} +.thumbnails:after{clear:both;} +.thumbnails>li{float:left;margin:0 0 18px 20px;} +.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);} +a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} +.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} +.thumbnail .caption{padding:9px;} +.label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.label-important{background-color:#b94a48;} +.label-warning{background-color:#f89406;} +.label-success{background-color:#468847;} +.label-info{background-color:#3a87ad;} +@-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} +.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} +.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} +.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);} +.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);} +.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);} +.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.accordion{margin-bottom:18px;} +.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.accordion-heading{border-bottom:0;} +.accordion-heading .accordion-toggle{display:block;padding:8px 15px;} +.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} +.carousel{position:relative;margin-bottom:18px;line-height:1;} +.carousel-inner{overflow:hidden;width:100%;position:relative;} +.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;} +.carousel .item>img{display:block;line-height:1;} +.carousel .active,.carousel .next,.carousel .prev{display:block;} +.carousel .active{left:0;} +.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;} +.carousel .next{left:100%;} +.carousel .prev{left:-100%;} +.carousel .next.left,.carousel .prev.right{left:0;} +.carousel .active.left{left:-100%;} +.carousel .active.right{left:100%;} +.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} +.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} +.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);} +.carousel-caption h4,.carousel-caption p{color:#ffffff;} +.hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;} +.hero-unit p{font-size:18px;font-weight:200;line-height:27px;} +.pull-right{float:right;} +.pull-left{float:left;} +.hide{display:none;} +.show{display:block;} +.invisible{visibility:hidden;} diff --git a/public/css/style.css b/public/css/style.css new file mode 100644 index 00000000..28af8659 --- /dev/null +++ b/public/css/style.css @@ -0,0 +1,37 @@ +body { + padding-top: 60px; + padding-bottom: 40px; +} + +.zf-green { + color: #68b604; +} + +.btn-success { + background-color: #57a900; + background-image: -moz-linear-gradient(top, #70d900, #57a900); + background-image: -ms-linear-gradient(top, #70d900, #57a900); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#70d900), to(#57a900)); + background-image: -webkit-linear-gradient(top, #70d900, #57a900); + background-image: -o-linear-gradient(top, #70d900, #57a900); + background-image: linear-gradient(top, #70d900, #57a900); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#70d900', endColorstr='#57a900', GradientType=0); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #57a900; +} + +.btn-success:active, .btn-success.active { + background-color: #57a900; +} + +div.container a.brand { + background: url("../images/zf2-logo.png") no-repeat scroll 0 10px transparent; + margin-left: 0; + padding: 8px 20px 12px 40px; +} diff --git a/public/images/favicon.ico b/public/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..17f119909ffcba66c8a48cba1050d724ab0a51aa GIT binary patch literal 1406 zcmeH{u@S;B3`L(4!_kq77D~2&f)%m@8>CIi3Rxj5&{O4(F&KaWl5ZuLa4BgmpX9H9 z`YL`QaC$|7#dQTcp`$WT2c=`93TJ2EqV#>w00001b5ch_0Itp) z=>Px#24YJ`L;!yP_W%GgN~tse000SaNLh0L04^f{04^f|c%?sf00007bV*G`2iyV+ z0u~zPmpWDe00Lr3L_t(I%azo>i(FL{2k_6yUMCTM712~SHnN3^LXZ#>#6mD{K>q+S zX(BTq2r-aC&_W?)Kx6SHAYz+Fn|-UGg{D#q@kj43WQ(W}QBZutvDmjev$Joqn*)z` zx!n6b_xnBHb7I_-lIg1mkJx`4z((?5a5tV$o(yi!+&@Tx2+;xVFVZx_aXf%ea3pTw zz=& z*KA7NE5{=1(-GdEtJD{D)gIf$xG8VowH+1R9lzF9d;hp8Cvg#v;TN1QJ&Es)a4EB6 zlK#nXw&z@AdSR|r`@17O)2%PzXt!R)mC_@{hd3M|rRdt~`z5`4L;AAE*sb(4E>DKr zcVERJ{Dg0?5({kJiSSaU?AW|pSMAxQrfkZjWC_xn=92RG&mP?K#vF4 za9gH`@MmYF>p7EgOP%X=)!yiw{*-V5$C87=q2#_v)&Aa-_&C;awXWJ1OP6>h_%s*lEe?=BYch#lx|Y3run(); diff --git a/public/js/html5.js b/public/js/html5.js new file mode 100644 index 00000000..6692336c --- /dev/null +++ b/public/js/html5.js @@ -0,0 +1,4 @@ +// iepp v2.1pre @jon_neal & @aFarkas github.com/aFarkas/iepp +// html5shiv @rem remysharp.com/html5-enabling-script +// Dual licensed under the MIT or GPL Version 2 licenses +/*@cc_on(function(a,b){function r(a){var b=-1;while(++b").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( +a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f +.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); diff --git a/vendor/.gitignore b/vendor/.gitignore new file mode 100644 index 00000000..4578c85a --- /dev/null +++ b/vendor/.gitignore @@ -0,0 +1,5 @@ +!.gitignore +.composer +composer +zendframework +autoload.php diff --git a/vendor/README.md b/vendor/README.md new file mode 100644 index 00000000..52144c94 --- /dev/null +++ b/vendor/README.md @@ -0,0 +1 @@ +This vendor/ directory is where third-party modules should be installed. diff --git a/vendor/doctrine/common/.gitignore b/vendor/doctrine/common/.gitignore new file mode 100644 index 00000000..fb5e79d6 --- /dev/null +++ b/vendor/doctrine/common/.gitignore @@ -0,0 +1,4 @@ +build/ +logs/ +reports/ +dist/ diff --git a/vendor/doctrine/common/.gitmodules b/vendor/doctrine/common/.gitmodules new file mode 100644 index 00000000..51f08435 --- /dev/null +++ b/vendor/doctrine/common/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/vendor/doctrine-build-common"] + path = lib/vendor/doctrine-build-common + url = git://github.com/doctrine/doctrine-build-common.git diff --git a/vendor/doctrine/common/.travis.yml b/vendor/doctrine/common/.travis.yml new file mode 100644 index 00000000..4464d4f7 --- /dev/null +++ b/vendor/doctrine/common/.travis.yml @@ -0,0 +1,5 @@ +language: php + +php: + - 5.3 + - 5.4 diff --git a/vendor/doctrine/common/LICENSE b/vendor/doctrine/common/LICENSE new file mode 100644 index 00000000..1c03f74b --- /dev/null +++ b/vendor/doctrine/common/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/vendor/doctrine/common/README.md b/vendor/doctrine/common/README.md new file mode 100644 index 00000000..c63f7627 --- /dev/null +++ b/vendor/doctrine/common/README.md @@ -0,0 +1,12 @@ +# Doctrine Common + +[![Build Status](https://secure.travis-ci.org/doctrine/common.png)](http://travis-ci.org/doctrine/common) + +The Doctrine Common project is a library that provides extensions to core PHP functionality. + +## More resources: + +* [Website](http://www.doctrine-project.org) +* [Documentation](http://www.doctrine-project.org/projects/common/current/docs/en) +* [Issue Tracker](http://www.doctrine-project.org/jira/browse/DCOM) +* [Downloads](http://github.com/doctrine/common/downloads) diff --git a/vendor/doctrine/common/UPGRADE_TO_2_1 b/vendor/doctrine/common/UPGRADE_TO_2_1 new file mode 100644 index 00000000..891a2e5c --- /dev/null +++ b/vendor/doctrine/common/UPGRADE_TO_2_1 @@ -0,0 +1,39 @@ +This document details all the possible changes that you should investigate when updating +your project from Doctrine Common 2.0.x to 2.1 + +## AnnotationReader changes + +The annotation reader was heavily refactored between 2.0 and 2.1-RC1. In theory the operation of the new reader should be backwards compatible, but it has to be setup differently to work that way: + + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\'); + // new code necessary starting here + $reader->setIgnoreNotImportedAnnotations(true); + $reader->setEnableParsePhpImports(false); + $reader = new \Doctrine\Common\Annotations\CachedReader( + new \Doctrine\Common\Annotations\IndexedReader($reader), new ArrayCache() + ); + +## Annotation Base class or @Annotation + +Beginning after 2.1-RC2 you have to either extend ``Doctrine\Common\Annotations\Annotation`` or add @Annotation to your annotations class-level docblock, otherwise the class will simply be ignored. + +## Removed methods on AnnotationReader + +* AnnotationReader::setAutoloadAnnotations() +* AnnotationReader::getAutoloadAnnotations() +* AnnotationReader::isAutoloadAnnotations() + +## AnnotationRegistry + +Autoloading through the PHP autoloader is removed from the 2.1 AnnotationReader. Instead you have to use the global AnnotationRegistry for loading purposes: + + \Doctrine\Common\Annotations\AnnotationRegistry::registerFile($fileWithAnnotations); + \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespace($namespace, $dirs = null); + \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespaces($namespaces); + \Doctrine\Common\Annotations\AnnotationRegistry::registerLoader($callable); + +The $callable for registering a loader accepts a class as first and only parameter and must try to silently autoload it. On success true has to be returned. +The registerAutoloadNamespace function registers a PSR-0 compatible silent autoloader for all classes with the given namespace in the given directories. +If null is passed as directory the include path will be used. + diff --git a/vendor/doctrine/common/UPGRADE_TO_2_2 b/vendor/doctrine/common/UPGRADE_TO_2_2 new file mode 100644 index 00000000..1d93a131 --- /dev/null +++ b/vendor/doctrine/common/UPGRADE_TO_2_2 @@ -0,0 +1,61 @@ +This document details all the possible changes that you should investigate when +updating your project from Doctrine Common 2.1 to 2.2: + +## Annotation Changes + +- AnnotationReader::setIgnoreNotImportedAnnotations has been removed, you need to + add ignore annotation names which are supposed to be ignored via + AnnotationReader::addGlobalIgnoredName + +- AnnotationReader::setAutoloadAnnotations was deprecated by the AnnotationRegistry + in 2.1 and has been removed in 2.2 + +- AnnotationReader::setEnableParsePhpImports was added to ease transition to the new + annotation mechanism in 2.1 and is removed in 2.2 + +- AnnotationReader::isParsePhpImportsEnabled is removed (see above) + +- AnnotationReader::setDefaultAnnotationNamespace was deprecated in favor of explicit + configuration in 2.1 and will be removed in 2.2 (for isolated projects where you + have full-control over _all_ available annotations, we offer a dedicated reader + class ``SimpleAnnotationReader``) + +- AnnotationReader::setAnnotationCreationFunction was deprecated in 2.1 and will be + removed in 2.2. We only offer two creation mechanisms which cannot be changed + anymore to allow the same reader instance to work with all annotations regardless + of which library they are coming from. + +- AnnotationReader::setAnnotationNamespaceAlias was deprecated in 2.1 and will be + removed in 2.2 (see setDefaultAnnotationNamespace) + +- If you use a class as annotation which has not the @Annotation marker in it's + class block, we will now throw an exception instead of silently ignoring it. You + can however still achieve the previous behavior using the @IgnoreAnnotation, or + AnnotationReader::addGlobalIgnoredName (the exception message will contain detailed + instructions when you run into this problem). + +## Cache Changes + +- Renamed old AbstractCache to CacheProvider + +- Dropped the support to the following functions of all cache providers: + + - CacheProvider::deleteByWildcard + + - CacheProvider::deleteByRegEx + + - CacheProvider::deleteByPrefix + + - CacheProvider::deleteBySuffix + +- CacheProvider::deleteAll will not remove ALL entries, it will only mark them as invalid + +- CacheProvider::flushAll will remove ALL entries, namespaced or not + +- Added support to MemcachedCache + +- Added support to WincacheCache + +## ClassLoader Changes + +- ClassLoader::fileExistsInIncludePath() no longer exists. Use the native stream_resolve_include_path() PHP function \ No newline at end of file diff --git a/vendor/doctrine/common/build.properties b/vendor/doctrine/common/build.properties new file mode 100644 index 00000000..ff311a45 --- /dev/null +++ b/vendor/doctrine/common/build.properties @@ -0,0 +1,6 @@ +# Project Name +project.name=DoctrineCommon + +# Version class and file +project.version_class = Doctrine\Common\Version +project.version_file = lib/Doctrine/Common/Version.php diff --git a/vendor/doctrine/common/build.xml b/vendor/doctrine/common/build.xml new file mode 100644 index 00000000..71a9a500 --- /dev/null +++ b/vendor/doctrine/common/build.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DoctrineCommon + Doctrine Common PHP Extensions + pear.doctrine-project.org + The Doctrine Common package contains shared code between the other packages. + + + + + LGPL + + + - + + + + + + + diff --git a/vendor/doctrine/common/composer.json b/vendor/doctrine/common/composer.json new file mode 100644 index 00000000..f995f6c6 --- /dev/null +++ b/vendor/doctrine/common/composer.json @@ -0,0 +1,21 @@ +{ + "name": "doctrine/common", + "type": "library","version":"2.2.3", + "description": "Common Library for Doctrine projects", + "keywords": ["collections", "spl", "eventmanager", "annotations", "persistence"], + "homepage": "http://www.doctrine-project.org", + "license": "LGPL", + "authors": [ + {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"}, + {"name": "Roman Borschel", "email": "roman@code-factory.org"}, + {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"}, + {"name": "Jonathan Wage", "email": "jonwage@gmail.com"}, + {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"} + ], + "require": { + "php": ">=5.3.2" + }, + "autoload": { + "psr-0": { "Doctrine\\Common": "lib/" } + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php new file mode 100644 index 00000000..62512522 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php @@ -0,0 +1,75 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Annotations class + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class Annotation +{ + /** + * Value property. Common among all derived classes. + * + * @var string + */ + public $value; + + /** + * Constructor + * + * @param array $data Key-value for properties to be defined in this class + */ + public final function __construct(array $data) + { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + /** + * Error handler for unknown property accessor in Annotation class. + * + * @param string $name Unknown property name + */ + public function __get($name) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } + + /** + * Error handler for unknown property mutator in Annotation class. + * + * @param string $name Unkown property name + * @param mixed $value Property value + */ + public function __set($name, $value) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php new file mode 100644 index 00000000..21597b14 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php @@ -0,0 +1,47 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the attribute type during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attribute +{ + /** + * @var string + */ + public $name; + + /** + * @var string + */ + public $type; + + /** + * @var boolean + */ + public $required = false; +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php new file mode 100644 index 00000000..6e314be4 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php @@ -0,0 +1,37 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the types of all declared attributes during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attributes +{ + /** + * @var array + */ + public $value; +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php new file mode 100644 index 00000000..1b2b20ac --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php @@ -0,0 +1,44 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser to ignore specific + * annotations during the parsing process. + * + * @Annotation + * @author Johannes M. Schmitt + */ +final class IgnoreAnnotation +{ + public $names; + + public function __construct(array $values) + { + if (is_string($values['value'])) { + $values['value'] = array($values['value']); + } + if (!is_array($values['value'])) { + throw new \RuntimeException(sprintf('@IgnoreAnnotation expects either a string name, or an array of strings, but got %s.', json_encode($values['value']))); + } + + $this->names = $values['value']; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php new file mode 100644 index 00000000..7b89a022 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php @@ -0,0 +1,33 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check if that attribute is required during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Required +{ +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php new file mode 100644 index 00000000..c41896ad --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php @@ -0,0 +1,105 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the annotation target during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Target +{ + const TARGET_CLASS = 1; + const TARGET_METHOD = 2; + const TARGET_PROPERTY = 4; + const TARGET_ANNOTATION = 8; + const TARGET_ALL = 15; + + /** + * @var array + */ + private static $map = array( + 'ALL' => self::TARGET_ALL, + 'CLASS' => self::TARGET_CLASS, + 'METHOD' => self::TARGET_METHOD, + 'PROPERTY' => self::TARGET_PROPERTY, + 'ANNOTATION' => self::TARGET_ANNOTATION, + ); + + /** + * @var array + */ + public $value; + + /** + * Targets as bitmask. + * + * @var integer + */ + public $targets; + + /** + * Literal target declaration. + * + * @var integer + */ + public $literal; + + /** + * Annotation construct + * + * @param array $values + */ + public function __construct(array $values) + { + if (!isset($values['value'])){ + $values['value'] = null; + } + if (is_string($values['value'])){ + $values['value'] = array($values['value']); + } + if (!is_array($values['value'])){ + throw new \InvalidArgumentException( + sprintf('@Target expects either a string value, or an array of strings, "%s" given.', + is_object($values['value']) ? get_class($values['value']) : gettype($values['value']) + ) + ); + } + + $bitmask = 0; + foreach ($values['value'] as $literal) { + if(!isset(self::$map[$literal])){ + throw new \InvalidArgumentException( + sprintf('Invalid Target "%s". Available targets: [%s]', + $literal, implode(', ', array_keys(self::$map))) + ); + } + $bitmask += self::$map[$literal]; + } + + $this->targets = $bitmask; + $this->value = $values['value']; + $this->literal = implode(', ', $this->value); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php new file mode 100644 index 00000000..fdc1913a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php @@ -0,0 +1,111 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Description of AnnotationException + * + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class AnnotationException extends \Exception +{ + /** + * Creates a new AnnotationException describing a Syntax error. + * + * @param string $message Exception message + * @return AnnotationException + */ + public static function syntaxError($message) + { + return new self('[Syntax Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing a Semantical error. + * + * @param string $message Exception message + * @return AnnotationException + */ + public static function semanticalError($message) + { + return new self('[Semantical Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing an error which occurred during + * the creation of the annotation. + * + * @since 2.2 + * @param string $message + * @return AnnotationException + */ + public static function creationError($message) + { + return new self('[Creation Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing an type error of an attribute. + * + * @since 2.2 + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * @param mixed $actual + * @return AnnotationException + */ + public static function typeError($attributeName, $annotationName, $context, $expected, $actual) + { + return new self(sprintf( + '[Type Error] Attribute "%s" of @%s declared on %s expects %s, but got %s.', + $attributeName, + $annotationName, + $context, + $expected, + is_object($actual) ? 'an instance of '.get_class($actual) : gettype($actual) + )); + } + + /** + * Creates a new AnnotationException describing an required error of an attribute. + * + * @since 2.2 + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * @return AnnotationException + */ + public static function requiredError($attributeName, $annotationName, $context, $expected) + { + return new self(sprintf( + '[Type Error] Attribute "%s" of @%s declared on %s expects %s. This value should not be null.', + $attributeName, + $annotationName, + $context, + $expected + )); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php new file mode 100644 index 00000000..be87728b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php @@ -0,0 +1,303 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\IgnoreAnnotation; +use Doctrine\Common\Annotations\Annotation\Target; +use Closure; +use ReflectionClass; +use ReflectionMethod; +use ReflectionProperty; + +/** + * A reader for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +final class AnnotationReader implements Reader +{ + /** + * Global map for imports. + * + * @var array + */ + private static $globalImports = array( + 'ignoreannotation' => 'Doctrine\Common\Annotations\Annotation\IgnoreAnnotation', + ); + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names are case sensitive. + * + * @var array + */ + private static $globalIgnoredNames = array( + 'access'=> true, 'author'=> true, 'copyright'=> true, 'deprecated'=> true, + 'example'=> true, 'ignore'=> true, 'internal'=> true, 'link'=> true, 'see'=> true, + 'since'=> true, 'tutorial'=> true, 'version'=> true, 'package'=> true, + 'subpackage'=> true, 'name'=> true, 'global'=> true, 'param'=> true, + 'return'=> true, 'staticvar'=> true, 'category'=> true, 'staticVar'=> true, + 'static'=> true, 'var'=> true, 'throws'=> true, 'inheritdoc'=> true, + 'inheritDoc'=> true, 'license'=> true, 'todo'=> true, 'deprecated'=> true, + 'deprec'=> true, 'author'=> true, 'property' => true, 'method' => true, + 'abstract'=> true, 'exception'=> true, 'magic' => true, 'api' => true, + 'final'=> true, 'filesource'=> true, 'throw' => true, 'uses' => true, + 'usedby'=> true, 'private' => true, 'Annotation' => true, 'override' => true, + 'codeCoverageIgnore' => true, 'codeCoverageIgnoreStart' => true, 'codeCoverageIgnoreEnd' => true, + 'Required' => true, 'Attribute' => true, 'Attributes' => true, + 'Target' => true, 'SuppressWarnings' => true, + 'ingroup' => true, 'code' => true, 'endcode' => true, + 'package_version' => true, + ); + + /** + * Add a new annotation to the globally ignored annotation names with regard to exception handling. + * + * @param string $name + */ + static public function addGlobalIgnoredName($name) + { + self::$globalIgnoredNames[$name] = true; + } + + /** + * Annotations Parser + * + * @var Doctrine\Common\Annotations\DocParser + */ + private $parser; + + /** + * Annotations Parser used to collect parsing metadata + * + * @var Doctrine\Common\Annotations\DocParser + */ + private $preParser; + + /** + * PHP Parser used to collect imports. + * + * @var Doctrine\Common\Annotations\PhpParser + */ + private $phpParser; + + /** + * In-memory cache mechanism to store imported annotations per class. + * + * @var array + */ + private $imports = array(); + + /** + * In-memory cache mechanism to store ignored annotations per class. + * + * @var array + */ + private $ignoredAnnotationNames = array(); + + /** + * Constructor. + * + * Initializes a new AnnotationReader. + */ + public function __construct() + { + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/IgnoreAnnotation.php'); + + $this->parser = new DocParser; + + $this->preParser = new DocParser; + $this->preParser->setImports(self::$globalImports); + $this->preParser->setIgnoreNotImportedAnnotations(true); + + $this->phpParser = new PhpParser; + } + + /** + * Gets the annotations applied to a class. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @return array An array of Annotations. + */ + public function getClassAnnotations(ReflectionClass $class) + { + $this->parser->setTarget(Target::TARGET_CLASS); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($class->getDocComment(), 'class ' . $class->getName()); + } + + /** + * Gets a class annotation. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getClassAnnotation(ReflectionClass $class, $annotationName) + { + $annotations = $this->getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets the annotations applied to a property. + * + * @param ReflectionProperty $property The ReflectionProperty of the property + * from which the annotations should be read. + * @return array An array of Annotations. + */ + public function getPropertyAnnotations(ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + $this->parser->setTarget(Target::TARGET_PROPERTY); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($property->getDocComment(), $context); + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets the annotations applied to a method. + * + * @param ReflectionMethod $property The ReflectionMethod of the method from which + * the annotations should be read. + * @return array An array of Annotations. + */ + public function getMethodAnnotations(ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + $this->parser->setTarget(Target::TARGET_METHOD); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($method->getDocComment(), $context); + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Returns the ignored annotations for the given class. + * + * @param ReflectionClass $class + * @return array + */ + private function getIgnoredAnnotationNames(ReflectionClass $class) + { + if (isset($this->ignoredAnnotationNames[$name = $class->getName()])) { + return $this->ignoredAnnotationNames[$name]; + } + $this->collectParsingMetadata($class); + + return $this->ignoredAnnotationNames[$name]; + } + + private function getImports(ReflectionClass $class) + { + if (isset($this->imports[$name = $class->getName()])) { + return $this->imports[$name]; + } + $this->collectParsingMetadata($class); + + return $this->imports[$name]; + } + + /** + * Collects parsing metadata for a given class + * + * @param ReflectionClass $class + */ + private function collectParsingMetadata(ReflectionClass $class) + { + $ignoredAnnotationNames = self::$globalIgnoredNames; + + $annotations = $this->preParser->parse($class->getDocComment(), 'class '.$class->name); + foreach ($annotations as $annotation) { + if ($annotation instanceof IgnoreAnnotation) { + foreach ($annotation->names AS $annot) { + $ignoredAnnotationNames[$annot] = true; + } + } + } + + $name = $class->getName(); + $this->imports[$name] = array_merge( + self::$globalImports, + $this->phpParser->parseClass($class), + array('__NAMESPACE__' => $class->getNamespaceName()) + ); + $this->ignoredAnnotationNames[$name] = $ignoredAnnotationNames; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php new file mode 100644 index 00000000..60b00f51 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php @@ -0,0 +1,129 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +final class AnnotationRegistry +{ + /** + * A map of namespaces to use for autoloading purposes based on a PSR-0 convention. + * + * Contains the namespace as key and an array of directories as value. If the value is NULL + * the include path is used for checking for the corresponding file. + * + * This autoloading mechanism does not utilize the PHP autoloading but implements autoloading on its own. + * + * @var array + */ + static private $autoloadNamespaces = array(); + + /** + * A map of autoloader callables. + * + * @var array + */ + static private $loaders = array(); + + static public function reset() + { + self::$autoloadNamespaces = array(); + self::$loaders = array(); + } + + static public function registerFile($file) + { + require_once $file; + } + + /** + * Add a namespace with one or many directories to look for files or null for the include path. + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param string $namespace + * @param string|array|null $dirs + */ + static public function registerAutoloadNamespace($namespace, $dirs = null) + { + self::$autoloadNamespaces[$namespace] = $dirs; + } + + /** + * Register multiple namespaces + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param array $namespaces + */ + static public function registerAutoloadNamespaces(array $namespaces) + { + self::$autoloadNamespaces = array_merge(self::$autoloadNamespaces, $namespaces); + } + + /** + * Register an autoloading callabale for annotations, much like spl_autoload_register(). + * + * NOTE: These class loaders HAVE to be silent when a class was not found! + * IMPORTANT: Loaders have to return true if they loaded a class that could contain the searched annotation class. + * + * @param callabale $callabale + */ + static public function registerLoader($callabale) + { + if (!is_callable($callabale)) { + throw new \InvalidArgumentException("A callable is expected in AnnotationRegistry::registerLoader()."); + } + self::$loaders[] = $callabale; + } + + /** + * Autoload an annotation class silently. + * + * @param string $class + * @return void + */ + static public function loadAnnotationClass($class) + { + foreach (self::$autoloadNamespaces AS $namespace => $dirs) { + if (strpos($class, $namespace) === 0) { + $file = str_replace("\\", DIRECTORY_SEPARATOR, $class) . ".php"; + if ($dirs === null) { + if ($path = stream_resolve_include_path($file)) { + require $path; + return true; + } + } else { + foreach((array)$dirs AS $dir) { + if (file_exists($dir . DIRECTORY_SEPARATOR . $file)) { + require $dir . DIRECTORY_SEPARATOR . $file; + return true; + } + } + } + } + } + + foreach (self::$loaders AS $loader) { + if (call_user_func($loader, $class) === true) { + return true; + } + } + return false; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php new file mode 100644 index 00000000..6ea47c6a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php @@ -0,0 +1,179 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Cache\Cache; + +/** + * A cache aware annotation reader. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + */ +final class CachedReader implements Reader +{ + private static $CACHE_SALT = '@[Annot]'; + + /** + * @var Reader + */ + private $delegate; + + /** + * @var Cache + */ + private $cache; + + /** + * @var boolean + */ + private $debug; + + /** + * @var array + */ + private $loadedAnnotations; + + /** + * @param Reader $reader + * @param Cache $cache + */ + public function __construct(Reader $reader, Cache $cache, $debug = false) + { + $this->delegate = $reader; + $this->cache = $cache; + $this->debug = $debug; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $cacheKey = $class->getName() . self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getClassAnnotations($class); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $cacheKey = $class->getName().'$'.$property->getName().self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getPropertyAnnotations($property); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $cacheKey = $class->getName().'#'.$method->getName().self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getMethodAnnotations($method); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = array(); + } + + private function isCacheFresh($cacheKey, \ReflectionClass $class) + { + if (false === $filename = $class->getFilename()) { + return true; + } + + return $this->cache->fetch('[C]'.$cacheKey) >= filemtime($filename); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php new file mode 100644 index 00000000..c6223e36 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php @@ -0,0 +1,140 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Lexer; + +/** + * Simple lexer for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +final class DocLexer extends Lexer +{ + const T_NONE = 1; + const T_IDENTIFIER = 2; + const T_INTEGER = 3; + const T_STRING = 4; + const T_FLOAT = 5; + + const T_AT = 101; + const T_CLOSE_CURLY_BRACES = 102; + const T_CLOSE_PARENTHESIS = 103; + const T_COMMA = 104; + const T_EQUALS = 105; + const T_FALSE = 106; + const T_NAMESPACE_SEPARATOR = 107; + const T_OPEN_CURLY_BRACES = 108; + const T_OPEN_PARENTHESIS = 109; + const T_TRUE = 110; + const T_NULL = 111; + const T_COLON = 112; + + /** + * @inheritdoc + */ + protected function getCatchablePatterns() + { + return array( + '[a-z_][a-z0-9_:]*', + '(?:[+-]?[0-9]+(?:[\.][0-9]+)*)(?:[eE][+-]?[0-9]+)?', + '"(?:[^"]|"")*"', + ); + } + + /** + * @inheritdoc + */ + protected function getNonCatchablePatterns() + { + return array('\s+', '\*+', '(.)'); + } + + /** + * @inheritdoc + */ + protected function getType(&$value) + { + $type = self::T_NONE; + + // Checking numeric value + if (is_numeric($value)) { + return (strpos($value, '.') !== false || stripos($value, 'e') !== false) + ? self::T_FLOAT : self::T_INTEGER; + } + + if ($value[0] === '"') { + $value = str_replace('""', '"', substr($value, 1, strlen($value) - 2)); + + return self::T_STRING; + } else { + switch (strtolower($value)) { + case '@': + return self::T_AT; + + case ',': + return self::T_COMMA; + + case '(': + return self::T_OPEN_PARENTHESIS; + + case ')': + return self::T_CLOSE_PARENTHESIS; + + case '{': + return self::T_OPEN_CURLY_BRACES; + + case '}': + return self::T_CLOSE_CURLY_BRACES; + + case '=': + return self::T_EQUALS; + + case '\\': + return self::T_NAMESPACE_SEPARATOR; + + case 'true': + return self::T_TRUE; + + case 'false': + return self::T_FALSE; + + case 'null': + return self::T_NULL; + + case ':': + return self::T_COLON; + + default: + if (ctype_alpha($value[0]) || $value[0] === '_') { + return self::T_IDENTIFIER; + } + + break; + } + } + + return $type; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php new file mode 100644 index 00000000..9d16b176 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php @@ -0,0 +1,891 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Closure; +use ReflectionClass; +use Doctrine\Common\Annotations\Annotation\Target; +use Doctrine\Common\Annotations\Annotation\Attribute; +use Doctrine\Common\Annotations\Annotation\Attributes; + +/** + * A parser for docblock annotations. + * + * It is strongly discouraged to change the default annotation parsing process. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +final class DocParser +{ + /** + * An array of all valid tokens for a class name. + * + * @var array + */ + private static $classIdentifiers = array(DocLexer::T_IDENTIFIER, DocLexer::T_TRUE, DocLexer::T_FALSE, DocLexer::T_NULL); + + /** + * The lexer. + * + * @var Doctrine\Common\Annotations\DocLexer + */ + private $lexer; + + /** + * Current target context + * + * @var string + */ + private $target; + + /** + * Doc Parser used to collect annotation target + * + * @var Doctrine\Common\Annotations\DocParser + */ + private static $metadataParser; + + /** + * Flag to control if the current annotation is nested or not. + * + * @var boolean + */ + private $isNestedAnnotation = false; + + /** + * Hashmap containing all use-statements that are to be used when parsing + * the given doc block. + * + * @var array + */ + private $imports = array(); + + /** + * This hashmap is used internally to cache results of class_exists() + * look-ups. + * + * @var array + */ + private $classExists = array(); + + /** + * Whether annotations that have not been imported should be ignored. + * + * @var boolean + */ + private $ignoreNotImportedAnnotations = false; + + /** + * An array of default namespaces if operating in simple mode. + * + * @var array + */ + private $namespaces = array(); + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names must be the raw names as used in the class, not the fully qualified + * class names. + * + * @var array + */ + private $ignoredAnnotationNames = array(); + + /** + * @var string + */ + private $context = ''; + + /** + * Hash-map for caching annotation metadata + * @var array + */ + private static $annotationMetadata = array( + 'Doctrine\Common\Annotations\Annotation\Target' => array( + 'is_annotation' => true, + 'has_constructor' => true, + 'properties' => array(), + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'attribute_types' => array( + 'value' => array( + 'required' => false, + 'type' =>'array', + 'array_type'=>'string', + 'value' =>'array' + ) + ), + ), + 'Doctrine\Common\Annotations\Annotation\Attribute' => array( + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_ANNOTATION', + 'targets' => Target::TARGET_ANNOTATION, + 'default_property' => 'name', + 'properties' => array( + 'name' => 'name', + 'type' => 'type', + 'required' => 'required' + ), + 'attribute_types' => array( + 'value' => array( + 'required' => true, + 'type' =>'string', + 'value' =>'string' + ), + 'type' => array( + 'required' =>true, + 'type' =>'string', + 'value' =>'string' + ), + 'required' => array( + 'required' =>false, + 'type' =>'boolean', + 'value' =>'boolean' + ) + ), + ), + 'Doctrine\Common\Annotations\Annotation\Attributes' => array( + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'properties' => array( + 'value' => 'value' + ), + 'attribute_types' => array( + 'value' => array( + 'type' =>'array', + 'required' =>true, + 'array_type'=>'Doctrine\Common\Annotations\Annotation\Attribute', + 'value' =>'array' + ) + ), + ), + ); + + /** + * Hash-map for handle types declaration + * + * @var array + */ + private static $typeMap = array( + 'float' => 'double', + 'bool' => 'boolean', + // allow uppercase Boolean in honor of George Boole + 'Boolean' => 'boolean', + 'int' => 'integer', + ); + + /** + * Constructs a new DocParser. + */ + public function __construct() + { + $this->lexer = new DocLexer; + } + + /** + * Sets the annotation names that are ignored during the parsing process. + * + * The names are supposed to be the raw names as used in the class, not the + * fully qualified class names. + * + * @param array $names + */ + public function setIgnoredAnnotationNames(array $names) + { + $this->ignoredAnnotationNames = $names; + } + + public function setIgnoreNotImportedAnnotations($bool) + { + $this->ignoreNotImportedAnnotations = (Boolean) $bool; + } + + /** + * Sets the default namespaces. + * @param array $namespaces + */ + public function addNamespace($namespace) + { + if ($this->imports) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + $this->namespaces[] = $namespace; + } + + public function setImports(array $imports) + { + if ($this->namespaces) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + $this->imports = $imports; + } + + /** + * Sets current target context as bitmask. + * + * @param integer $target + */ + public function setTarget($target) + { + $this->target = $target; + } + + /** + * Parses the given docblock string for annotations. + * + * @param string $input The docblock string to parse. + * @param string $context The parsing context. + * @return array Array of annotations. If no annotations are found, an empty array is returned. + */ + public function parse($input, $context = '') + { + if (false === $pos = strpos($input, '@')) { + return array(); + } + + // also parse whatever character is before the @ + if ($pos > 0) { + $pos -= 1; + } + + $this->context = $context; + $this->lexer->setInput(trim(substr($input, $pos), '* /')); + $this->lexer->moveNext(); + + return $this->Annotations(); + } + + /** + * Attempts to match the given token with the current lookahead token. + * If they match, updates the lookahead token; otherwise raises a syntax error. + * + * @param int Token type. + * @return bool True if tokens match; false otherwise. + */ + private function match($token) + { + if ( ! $this->lexer->isNextToken($token) ) { + $this->syntaxError($this->lexer->getLiteral($token)); + } + + return $this->lexer->moveNext(); + } + + /** + * Attempts to match the current lookahead token with any of the given tokens. + * + * If any of them matches, this method updates the lookahead token; otherwise + * a syntax error is raised. + * + * @param array $tokens + * @return bool + */ + private function matchAny(array $tokens) + { + if ( ! $this->lexer->isNextTokenAny($tokens)) { + $this->syntaxError(implode(' or ', array_map(array($this->lexer, 'getLiteral'), $tokens))); + } + + return $this->lexer->moveNext(); + } + + /** + * Generates a new syntax error. + * + * @param string $expected Expected string. + * @param array $token Optional token. + * @throws SyntaxException + */ + private function syntaxError($expected, $token = null) + { + if ($token === null) { + $token = $this->lexer->lookahead; + } + + $message = "Expected {$expected}, got "; + + if ($this->lexer->lookahead === null) { + $message .= 'end of string'; + } else { + $message .= "'{$token['value']}' at position {$token['position']}"; + } + + if (strlen($this->context)) { + $message .= ' in ' . $this->context; + } + + $message .= '.'; + + throw AnnotationException::syntaxError($message); + } + + /** + * Attempt to check if a class exists or not. This never goes through the PHP autoloading mechanism + * but uses the {@link AnnotationRegistry} to load classes. + * + * @param string $fqcn + * @return boolean + */ + private function classExists($fqcn) + { + if (isset($this->classExists[$fqcn])) { + return $this->classExists[$fqcn]; + } + + // first check if the class already exists, maybe loaded through another AnnotationReader + if (class_exists($fqcn, false)) { + return $this->classExists[$fqcn] = true; + } + + // final check, does this class exist? + return $this->classExists[$fqcn] = AnnotationRegistry::loadAnnotationClass($fqcn); + } + + /** + * Collects parsing metadata for a given annotation class + * + * @param string $name The annotation name + */ + private function collectAnnotationMetadata($name) + { + if (self::$metadataParser == null){ + self::$metadataParser = new self(); + self::$metadataParser->setTarget(Target::TARGET_CLASS); + self::$metadataParser->setIgnoreNotImportedAnnotations(true); + self::$metadataParser->setImports(array( + 'target' => 'Doctrine\Common\Annotations\Annotation\Target', + 'attribute' => 'Doctrine\Common\Annotations\Annotation\Attribute', + 'attributes' => 'Doctrine\Common\Annotations\Annotation\Attributes' + )); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Target.php'); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attribute.php'); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attributes.php'); + } + + $class = new \ReflectionClass($name); + $docComment = $class->getDocComment(); + + // Sets default values for annotation metadata + $metadata = array( + 'default_property' => null, + 'has_constructor' => (null !== $constructor = $class->getConstructor()) && $constructor->getNumberOfParameters() > 0, + 'properties' => array(), + 'property_types' => array(), + 'attribute_types' => array(), + 'targets_literal' => null, + 'targets' => Target::TARGET_ALL, + 'is_annotation' => false !== strpos($docComment, '@Annotation'), + ); + + // verify that the class is really meant to be an annotation + if ($metadata['is_annotation']) { + foreach (self::$metadataParser->parse($docComment, 'class @' . $name) as $annotation) { + if ($annotation instanceof Target) { + $metadata['targets'] = $annotation->targets; + $metadata['targets_literal'] = $annotation->literal; + + } elseif ($annotation instanceof Attributes) { + foreach ($annotation->value as $attrib) { + // handle internal type declaration + $type = isset(self::$typeMap[$attrib->type]) ? self::$typeMap[$attrib->type] : $attrib->type; + + // handle the case if the property type is mixed + if ('mixed' !== $type) { + // Checks if the property has array + if (false !== $pos = strpos($type, '<')) { + $arrayType = substr($type, $pos+1, -1); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$attrib->name]['array_type'] = $arrayType; + } + + $metadata['attribute_types'][$attrib->name]['type'] = $type; + $metadata['attribute_types'][$attrib->name]['value'] = $attrib->type; + $metadata['attribute_types'][$attrib->name]['required'] = $attrib->required; + } + } + } + } + + // if not has a constructor will inject values into public properties + if (false === $metadata['has_constructor']) { + // collect all public properties + foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) { + $metadata['properties'][$property->name] = $property->name; + + // checks if the property has @var annotation + if ((false !== $propertyComment = $property->getDocComment()) + && false !== strpos($propertyComment, '@var') + && preg_match('/@var\s+([^\s]+)/',$propertyComment, $matches)) { + // literal type declaration + $value = $matches[1]; + + // handle internal type declaration + $type = isset(self::$typeMap[$value]) ? self::$typeMap[$value] : $value; + + // handle the case if the property type is mixed + if ('mixed' !== $type) { + // Checks if the property has @var array annotation + if (false !== $pos = strpos($type, '<')) { + $arrayType = substr($type, $pos+1, -1); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$property->name]['array_type'] = $arrayType; + } + + $metadata['attribute_types'][$property->name]['type'] = $type; + $metadata['attribute_types'][$property->name]['value'] = $value; + $metadata['attribute_types'][$property->name]['required'] = false !== strpos($propertyComment, '@Required'); + } + } + } + + // choose the first property as default property + $metadata['default_property'] = reset($metadata['properties']); + } + } + + self::$annotationMetadata[$name] = $metadata; + } + + /** + * Annotations ::= Annotation {[ "*" ]* [Annotation]}* + * + * @return array + */ + private function Annotations() + { + $annotations = array(); + + while (null !== $this->lexer->lookahead) { + if (DocLexer::T_AT !== $this->lexer->lookahead['type']) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is preceded by non-catchable pattern + if (null !== $this->lexer->token && $this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value'])) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is followed by either a namespace separator, or + // an identifier token + if ((null === $peek = $this->lexer->glimpse()) + || (DocLexer::T_NAMESPACE_SEPARATOR !== $peek['type'] && !in_array($peek['type'], self::$classIdentifiers, true)) + || $peek['position'] !== $this->lexer->lookahead['position'] + 1) { + $this->lexer->moveNext(); + continue; + } + + $this->isNestedAnnotation = false; + if (false !== $annot = $this->Annotation()) { + $annotations[] = $annot; + } + } + + return $annotations; + } + + /** + * Annotation ::= "@" AnnotationName ["(" [Values] ")"] + * AnnotationName ::= QualifiedName | SimpleName + * QualifiedName ::= NameSpacePart "\" {NameSpacePart "\"}* SimpleName + * NameSpacePart ::= identifier | null | false | true + * SimpleName ::= identifier | null | false | true + * + * @return mixed False if it is not a valid annotation. + */ + private function Annotation() + { + $this->match(DocLexer::T_AT); + + // check if we have an annotation + if ($this->lexer->isNextTokenAny(self::$classIdentifiers)) { + $this->lexer->moveNext(); + $name = $this->lexer->token['value']; + } else if ($this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) { + $name = ''; + } else { + $this->syntaxError('namespace separator or identifier'); + } + + while ($this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value']) && $this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) { + $this->match(DocLexer::T_NAMESPACE_SEPARATOR); + $this->matchAny(self::$classIdentifiers); + $name .= '\\'.$this->lexer->token['value']; + } + + // only process names which are not fully qualified, yet + // fully qualified names must start with a \ + $originalName = $name; + if ('\\' !== $name[0]) { + $alias = (false === $pos = strpos($name, '\\'))? $name : substr($name, 0, $pos); + + $found = false; + if ($this->namespaces) { + foreach ($this->namespaces as $namespace) { + if ($this->classExists($namespace.'\\'.$name)) { + $name = $namespace.'\\'.$name; + $found = true; + break; + } + } + } elseif (isset($this->imports[$loweredAlias = strtolower($alias)])) { + if (false !== $pos) { + $name = $this->imports[$loweredAlias].substr($name, $pos); + } else { + $name = $this->imports[$loweredAlias]; + } + $found = true; + } elseif (isset($this->imports['__NAMESPACE__']) && $this->classExists($this->imports['__NAMESPACE__'].'\\'.$name)) { + $name = $this->imports['__NAMESPACE__'].'\\'.$name; + $found = true; + } elseif ($this->classExists($name)) { + $found = true; + } + + if (!$found) { + if ($this->ignoreNotImportedAnnotations || isset($this->ignoredAnnotationNames[$name])) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s was never imported. Did you maybe forget to add a "use" statement for this annotation?', $name, $this->context)); + } + } + + if (!$this->classExists($name)) { + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s does not exist, or could not be auto-loaded.', $name, $this->context)); + } + + // at this point, $name contains the fully qualified class name of the + // annotation, and it is also guaranteed that this class exists, and + // that it is loaded + + + // collects the metadata annotation only if there is not yet + if (!isset(self::$annotationMetadata[$name])) { + $this->collectAnnotationMetadata($name); + } + + // verify that the class is really meant to be an annotation and not just any ordinary class + if (self::$annotationMetadata[$name]['is_annotation'] === false) { + if (isset($this->ignoredAnnotationNames[$originalName])) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The class "%s" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "%s". If it is indeed no annotation, then you need to add @IgnoreAnnotation("%s") to the _class_ doc comment of %s.', $name, $name, $originalName, $this->context)); + } + + //if target is nested annotation + $target = $this->isNestedAnnotation ? Target::TARGET_ANNOTATION : $this->target; + + // Next will be nested + $this->isNestedAnnotation = true; + + //if annotation does not support current target + if (0 === (self::$annotationMetadata[$name]['targets'] & $target) && $target) { + throw AnnotationException::semanticalError( + sprintf('Annotation @%s is not allowed to be declared on %s. You may only use this annotation on these code elements: %s.', + $originalName, $this->context, self::$annotationMetadata[$name]['targets_literal']) + ); + } + + $values = array(); + if ($this->lexer->isNextToken(DocLexer::T_OPEN_PARENTHESIS)) { + $this->match(DocLexer::T_OPEN_PARENTHESIS); + + if ( ! $this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) { + $values = $this->Values(); + } + + $this->match(DocLexer::T_CLOSE_PARENTHESIS); + } + + // checks all declared attributes + foreach (self::$annotationMetadata[$name]['attribute_types'] as $property => $type) { + if ($property === self::$annotationMetadata[$name]['default_property'] + && !isset($values[$property]) && isset($values['value'])) { + $property = 'value'; + } + + // handle a not given attribute or null value + if (!isset($values[$property])) { + if ($type['required']) { + throw AnnotationException::requiredError($property, $originalName, $this->context, 'a(n) '.$type['value']); + } + + continue; + } + + if ($type['type'] === 'array') { + // handle the case of a single value + if (!is_array($values[$property])) { + $values[$property] = array($values[$property]); + } + + // checks if the attribute has array type declaration, such as "array" + if (isset($type['array_type'])) { + foreach ($values[$property] as $item) { + if (gettype($item) !== $type['array_type'] && !$item instanceof $type['array_type']) { + throw AnnotationException::typeError($property, $originalName, $this->context, 'either a(n) '.$type['array_type'].', or an array of '.$type['array_type'].'s', $item); + } + } + } + } elseif (gettype($values[$property]) !== $type['type'] && !$values[$property] instanceof $type['type']) { + throw AnnotationException::typeError($property, $originalName, $this->context, 'a(n) '.$type['value'], $values[$property]); + } + } + + // check if the annotation expects values via the constructor, + // or directly injected into public properties + if (self::$annotationMetadata[$name]['has_constructor'] === true) { + return new $name($values); + } + + $instance = new $name(); + foreach ($values as $property => $value) { + if (!isset(self::$annotationMetadata[$name]['properties'][$property])) { + if ('value' !== $property) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not have a property named "%s". Available properties: %s', $originalName, $this->context, $property, implode(', ', self::$annotationMetadata[$name]['properties']))); + } + + // handle the case if the property has no annotations + if (!$property = self::$annotationMetadata[$name]['default_property']) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not accept any values, but got %s.', $originalName, $this->context, json_encode($values))); + } + } + + $instance->{$property} = $value; + } + + return $instance; + } + + /** + * Values ::= Array | Value {"," Value}* + * + * @return array + */ + private function Values() + { + $values = array(); + + // Handle the case of a single array as value, i.e. @Foo({....}) + if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { + $values['value'] = $this->Value(); + return $values; + } + + $values[] = $this->Value(); + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + $token = $this->lexer->lookahead; + $value = $this->Value(); + + if ( ! is_object($value) && ! is_array($value)) { + $this->syntaxError('Value', $token); + } + + $values[] = $value; + } + + foreach ($values as $k => $value) { + if (is_object($value) && $value instanceof \stdClass) { + $values[$value->name] = $value->value; + } else if ( ! isset($values['value'])){ + $values['value'] = $value; + } else { + if ( ! is_array($values['value'])) { + $values['value'] = array($values['value']); + } + + $values['value'][] = $value; + } + + unset($values[$k]); + } + + return $values; + } + + /** + * Value ::= PlainValue | FieldAssignment + * + * @return mixed + */ + private function Value() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type']) { + return $this->FieldAssignment(); + } + + return $this->PlainValue(); + } + + /** + * PlainValue ::= integer | string | float | boolean | Array | Annotation + * + * @return mixed + */ + private function PlainValue() + { + if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { + return $this->Arrayx(); + } + + if ($this->lexer->isNextToken(DocLexer::T_AT)) { + return $this->Annotation(); + } + + switch ($this->lexer->lookahead['type']) { + case DocLexer::T_STRING: + $this->match(DocLexer::T_STRING); + return $this->lexer->token['value']; + + case DocLexer::T_INTEGER: + $this->match(DocLexer::T_INTEGER); + return (int)$this->lexer->token['value']; + + case DocLexer::T_FLOAT: + $this->match(DocLexer::T_FLOAT); + return (float)$this->lexer->token['value']; + + case DocLexer::T_TRUE: + $this->match(DocLexer::T_TRUE); + return true; + + case DocLexer::T_FALSE: + $this->match(DocLexer::T_FALSE); + return false; + + case DocLexer::T_NULL: + $this->match(DocLexer::T_NULL); + return null; + + default: + $this->syntaxError('PlainValue'); + } + } + + /** + * FieldAssignment ::= FieldName "=" PlainValue + * FieldName ::= identifier + * + * @return array + */ + private function FieldAssignment() + { + $this->match(DocLexer::T_IDENTIFIER); + $fieldName = $this->lexer->token['value']; + + $this->match(DocLexer::T_EQUALS); + + $item = new \stdClass(); + $item->name = $fieldName; + $item->value = $this->PlainValue(); + + return $item; + } + + /** + * Array ::= "{" ArrayEntry {"," ArrayEntry}* [","] "}" + * + * @return array + */ + private function Arrayx() + { + $array = $values = array(); + + $this->match(DocLexer::T_OPEN_CURLY_BRACES); + $values[] = $this->ArrayEntry(); + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + + // optional trailing comma + if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) { + break; + } + + $values[] = $this->ArrayEntry(); + } + + $this->match(DocLexer::T_CLOSE_CURLY_BRACES); + + foreach ($values as $value) { + list ($key, $val) = $value; + + if ($key !== null) { + $array[$key] = $val; + } else { + $array[] = $val; + } + } + + return $array; + } + + /** + * ArrayEntry ::= Value | KeyValuePair + * KeyValuePair ::= Key ("=" | ":") PlainValue + * Key ::= string | integer + * + * @return array + */ + private function ArrayEntry() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type'] + || DocLexer::T_COLON === $peek['type']) { + $this->matchAny(array(DocLexer::T_INTEGER, DocLexer::T_STRING)); + + $key = $this->lexer->token['value']; + $this->matchAny(array(DocLexer::T_EQUALS, DocLexer::T_COLON)); + + return array($key, $this->PlainValue()); + } + + return array(null, $this->Value()); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php new file mode 100644 index 00000000..4a42b583 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php @@ -0,0 +1,209 @@ +. + */ + +namespace Doctrine\Common\Annotations; + + +/** + * File cache reader for annotations. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + */ +class FileCacheReader implements Reader +{ + /** + * @var Reader + */ + private $reader; + private $dir; + private $debug; + private $loadedAnnotations = array(); + + public function __construct(Reader $reader, $cacheDir, $debug = false) + { + $this->reader = $reader; + if (!is_dir($cacheDir) && !@mkdir($cacheDir, 0777, true)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist and could not be created.', $cacheDir)); + } + if (!is_writable($cacheDir)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" is not writable. Both, the webserver and the console user need access. You can manage access rights for multiple users with "chmod +a". If your system does not support this, check out the acl package.', $cacheDir)); + } + + $this->dir = rtrim($cacheDir, '\\/'); + $this->debug = $debug; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $key = $class->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + @unlink($path); + + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $key = $class->getName().'$'.$property->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + unlink($path); + + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $key = $class->getName().'#'.$method->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + unlink($path); + + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + private function saveCacheFile($path, $data) + { + file_put_contents($path, 'getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = array(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php new file mode 100644 index 00000000..1eea4921 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php @@ -0,0 +1,94 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Reader; + +/** + * Allows the reader to be used in-place of Doctrine's reader. + * + * @author Johannes M. Schmitt + */ +class IndexedReader implements Reader +{ + private $delegate; + + public function __construct(Reader $reader) + { + $this->delegate = $reader; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $annotations = array(); + foreach ($this->delegate->getClassAnnotations($class) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getClassAnnotation(\ReflectionClass $class, $annotation) + { + return $this->delegate->getClassAnnotation($class, $annotation); + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $annotations = array(); + foreach ($this->delegate->getMethodAnnotations($method) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getMethodAnnotation(\ReflectionMethod $method, $annotation) + { + return $this->delegate->getMethodAnnotation($method, $annotation); + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $annotations = array(); + foreach ($this->delegate->getPropertyAnnotations($property) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getPropertyAnnotation(\ReflectionProperty $property, $annotation) + { + return $this->delegate->getPropertyAnnotation($property, $annotation); + } + + /** + * Proxy all methods to the delegate. + * + * @param type $method + * @param type $args + * @return type + */ + public function __call($method, $args) + { + return call_user_func_array(array($this->delegate, $method), $args); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php new file mode 100644 index 00000000..a14f8f5b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php @@ -0,0 +1,203 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use SplFileObject; + +/** + * Parses a file for namespaces/use/class declarations. + * + * @author Fabien Potencier + * @author Christian Kaps + */ +final class PhpParser +{ + /** + * The token list. + * + * @var array + */ + private $tokens; + + /** + * The number of tokens. + * + * @var int + */ + private $numTokens = 0; + + /** + * The current array pointer. + * + * @var int + */ + private $pointer = 0; + + /** + * Parses a class. + * + * @param \ReflectionClass $class A ReflectionClass object. + * @return array A list with use statements in the form (Alias => FQN). + */ + public function parseClass(\ReflectionClass $class) + { + if (false === $filename = $class->getFilename()) { + return array(); + } + + $content = $this->getFileContent($filename, $class->getStartLine()); + $namespace = str_replace('\\', '\\\\', $class->getNamespaceName()); + $content = preg_replace('/^.*?(\bnamespace\s+' . $namespace . '\s*[;{].*)$/s', '\\1', $content); + $this->tokens = token_get_all('numTokens = count($this->tokens); + $this->pointer = 0; + + $statements = $this->parseUseStatements($class->getNamespaceName()); + + return $statements; + } + + /** + * Get the content of the file right up to the given line number. + * + * @param string $filename The name of the file to load. + * @param int $lineNumber The number of lines to read from file. + * @return string The content of the file. + */ + private function getFileContent($filename, $lineNumber) + { + $content = ''; + $lineCnt = 0; + $file = new SplFileObject($filename); + while(!$file->eof()) { + if ($lineCnt++ == $lineNumber) { + break; + } + + $content .= $file->fgets(); + } + + return $content; + } + + /** + * Gets the next non whitespace and non comment token. + * + * @return array The token if exists, null otherwise. + */ + private function next() + { + for ($i = $this->pointer; $i < $this->numTokens; $i++) { + $this->pointer++; + if ($this->tokens[$i][0] === T_WHITESPACE || + $this->tokens[$i][0] === T_COMMENT || + $this->tokens[$i][0] === T_DOC_COMMENT) { + + continue; + } + + return $this->tokens[$i]; + } + + return null; + } + + /** + * Get all use statements. + * + * @param string $namespaceName The namespace name of the reflected class. + * @return array A list with all found use statements. + */ + private function parseUseStatements($namespaceName) + { + $statements = array(); + while (($token = $this->next())) { + if ($token[0] === T_USE) { + $statements = array_merge($statements, $this->parseUseStatement()); + continue; + } else if ($token[0] !== T_NAMESPACE || $this->parseNamespace() != $namespaceName) { + continue; + } + + // Get fresh array for new namespace. This is to prevent the parser to collect the use statements + // for a previous namespace with the same name. This is the case if a namespace is defined twice + // or if a namespace with the same name is commented out. + $statements = array(); + } + + return $statements; + } + + /** + * Get the namespace name. + * + * @return string The found namespace name. + */ + private function parseNamespace() + { + $namespace = ''; + while (($token = $this->next())){ + if ($token[0] === T_STRING || $token[0] === T_NS_SEPARATOR) { + $namespace .= $token[1]; + } else { + break; + } + } + + return $namespace; + } + + /** + * Parse a single use statement. + * + * @return array A list with all found class names for a use statement. + */ + private function parseUseStatement() + { + $class = ''; + $alias = ''; + $statements = array(); + $explicitAlias = false; + while (($token = $this->next())) { + $isNameToken = $token[0] === T_STRING || $token[0] === T_NS_SEPARATOR; + if (!$explicitAlias && $isNameToken) { + $class .= $token[1]; + $alias = $token[1]; + } else if ($explicitAlias && $isNameToken) { + $alias .= $token[1]; + } else if ($token[0] === T_AS) { + $explicitAlias = true; + $alias = ''; + } else if ($token === ',') { + $statements[strtolower($alias)] = $class; + $class = ''; + $alias = ''; + $explicitAlias = false; + } else if ($token === ';') { + $statements[strtolower($alias)] = $class; + break; + } else { + break; + } + } + + return $statements; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php new file mode 100644 index 00000000..8e85d392 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php @@ -0,0 +1,35 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Interface for annotation readers. + * + * @author Johannes M. Schmitt + */ +interface Reader +{ + function getClassAnnotations(\ReflectionClass $class); + function getClassAnnotation(\ReflectionClass $class, $annotationName); + function getMethodAnnotations(\ReflectionMethod $method); + function getMethodAnnotation(\ReflectionMethod $method, $annotationName); + function getPropertyAnnotations(\ReflectionProperty $property); + function getPropertyAnnotation(\ReflectionProperty $property, $annotationName); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php new file mode 100644 index 00000000..a13c7fa0 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php @@ -0,0 +1,152 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\Target; + +/** + * Simple Annotation Reader. + * + * This annotation reader is intended to be used in projects where you have + * full-control over all annotations that are available. + * + * @since 2.2 + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +class SimpleAnnotationReader implements Reader +{ + /** + * @var DocParser + */ + private $parser; + + /** + * Constructor. + * + * Initializes a new SimpleAnnotationReader. + */ + public function __construct() + { + $this->parser = new DocParser(); + $this->parser->setIgnoreNotImportedAnnotations(true); + } + + /** + * Adds a namespace in which we will look for annotations. + * + * @param string $namespace + */ + public function addNamespace($namespace) + { + $this->parser->addNamespace($namespace); + } + + /** + * Gets the annotations applied to a class. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @return array An array of Annotations. + */ + public function getClassAnnotations(\ReflectionClass $class) + { + return $this->parser->parse($class->getDocComment(), 'class '.$class->getName()); + } + + /** + * Gets the annotations applied to a method. + * + * @param ReflectionMethod $property The ReflectionMethod of the method from which + * the annotations should be read. + * @return array An array of Annotations. + */ + public function getMethodAnnotations(\ReflectionMethod $method) + { + return $this->parser->parse($method->getDocComment(), 'method '.$method->getDeclaringClass()->name.'::'.$method->getName().'()'); + } + + /** + * Gets the annotations applied to a property. + * + * @param ReflectionProperty $property The ReflectionProperty of the property + * from which the annotations should be read. + * @return array An array of Annotations. + */ + public function getPropertyAnnotations(\ReflectionProperty $property) + { + return $this->parser->parse($property->getDocComment(), 'property '.$property->getDeclaringClass()->name.'::$'.$property->getName()); + } + + /** + * Gets a class annotation. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php new file mode 100644 index 00000000..a59296f5 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php @@ -0,0 +1,97 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * APC cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class ApcCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return apc_fetch($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + $found = false; + + apc_fetch($id, $found); + + return $found; + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return (bool) apc_store($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return apc_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return apc_clear_cache() && apc_clear_cache('user'); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = apc_cache_info(); + $sma = apc_sma_info(); + + return array( + Cache::STATS_HITS => $info['num_hits'], + Cache::STATS_MISSES => $info['num_misses'], + Cache::STATS_UPTIME => $info['start_time'], + Cache::STATS_MEMORY_USAGE => $info['mem_size'], + Cache::STATS_MEMORY_AVAILIABLE => $sma['avail_mem'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php new file mode 100644 index 00000000..8a0b982b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php @@ -0,0 +1,96 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Array cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class ArrayCache extends CacheProvider +{ + /** + * @var array $data + */ + private $data = array(); + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return (isset($this->data[$id])) ? $this->data[$id] : false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return isset($this->data[$id]); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + $this->data[$id] = $data; + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + unset($this->data[$id]); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->data = array(); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php new file mode 100644 index 00000000..d303bde4 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php @@ -0,0 +1,102 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Interface for cache drivers. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Fabio B. Silva + */ +interface Cache +{ + const STATS_HITS = 'hits'; + const STATS_MISSES = 'misses'; + const STATS_UPTIME = 'uptime'; + const STATS_MEMORY_USAGE = 'memory_usage'; + const STATS_MEMORY_AVAILIABLE = 'memory_available'; + + /** + * Fetches an entry from the cache. + * + * @param string $id cache id The id of the cache entry to fetch. + * @return string The cached data or FALSE, if no cache entry exists for the given id. + */ + function fetch($id); + + /** + * Test if an entry exists in the cache. + * + * @param string $id cache id The cache id of the entry to check for. + * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. + */ + function contains($id); + + /** + * Puts data into the cache. + * + * @param string $id The cache id. + * @param string $data The cache entry/data. + * @param int $lifeTime The lifetime. If != 0, sets a specific lifetime for this cache entry (0 => infinite lifeTime). + * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. + */ + function save($id, $data, $lifeTime = 0); + + /** + * Deletes a cache entry. + * + * @param string $id cache id + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + function delete($id); + + /** + * Retrieves cached information from data store + * + * The server's statistics array has the following values: + * + * - hits + * Number of keys that have been requested and found present. + * + * - misses + * Number of items that have been requested and not found. + * + * - uptime + * Time that the server is running. + * + * - memory_usage + * Memory used by this server to store items. + * + * - memory_available + * Memory allowed to use for storage. + * + * @since 2.2 + * @var array Associative array with server's statistics if available, NULL otherwise. + */ + function getStats(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php new file mode 100644 index 00000000..fa11fc22 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php @@ -0,0 +1,188 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Base class for cache provider implementations. + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Fabio B. Silva + */ +abstract class CacheProvider implements Cache +{ + const DOCTRINE_NAMESPACE_CACHEKEY = 'DoctrineNamespaceCacheKey[%s]'; + + /** + * @var string The namespace to prefix all cache ids with + */ + private $namespace = ''; + + /** + * Set the namespace to prefix all cache ids with. + * + * @param string $namespace + * @return void + */ + public function setNamespace($namespace) + { + $this->namespace = (string) $namespace; + } + + /** + * Retrieve the namespace that prefixes all cache ids. + * + * @return string + */ + public function getNamespace() + { + return $this->namespace; + } + + /** + * {@inheritdoc} + */ + public function fetch($id) + { + return $this->doFetch($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function contains($id) + { + return $this->doContains($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function save($id, $data, $lifeTime = 0) + { + return $this->doSave($this->getNamespacedId($id), $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + public function delete($id) + { + return $this->doDelete($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function getStats() + { + return $this->doGetStats(); + } + + /** + * Deletes all cache entries. + * + * @return boolean TRUE if the cache entries were successfully flushed, FALSE otherwise. + */ + public function flushAll() + { + return $this->doFlush(); + } + + /** + * Delete all cache entries. + * + * @return boolean TRUE if the cache entries were successfully deleted, FALSE otherwise. + */ + public function deleteAll() + { + $namespaceCacheKey = sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); + $namespaceVersion = ($this->doContains($namespaceCacheKey)) ? $this->doFetch($namespaceCacheKey) : 1; + + return $this->doSave($namespaceCacheKey, $namespaceVersion + 1); + } + + /** + * Prefix the passed id with the configured namespace value + * + * @param string $id The id to namespace + * @return string $id The namespaced id + */ + private function getNamespacedId($id) + { + $namespaceCacheKey = sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); + $namespaceVersion = ($this->doContains($namespaceCacheKey)) ? $this->doFetch($namespaceCacheKey) : 1; + + return sprintf('%s[%s][%s]', $this->namespace, $id, $namespaceVersion); + } + + /** + * Fetches an entry from the cache. + * + * @param string $id cache id The id of the cache entry to fetch. + * @return string The cached data or FALSE, if no cache entry exists for the given id. + */ + abstract protected function doFetch($id); + + /** + * Test if an entry exists in the cache. + * + * @param string $id cache id The cache id of the entry to check for. + * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. + */ + abstract protected function doContains($id); + + /** + * Puts data into the cache. + * + * @param string $id The cache id. + * @param string $data The cache entry/data. + * @param int $lifeTime The lifetime. If != false, sets a specific lifetime for this cache entry (null => infinite lifeTime). + * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. + */ + abstract protected function doSave($id, $data, $lifeTime = false); + + /** + * Deletes a cache entry. + * + * @param string $id cache id + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + abstract protected function doDelete($id); + + /** + * Deletes all cache entries. + * + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + abstract protected function doFlush(); + + /** + * Retrieves cached information from data store + * + * @since 2.2 + * @return array An associative array with server's statistics if available, NULL otherwise. + */ + abstract protected function doGetStats(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php new file mode 100644 index 00000000..dd6d1e31 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php @@ -0,0 +1,121 @@ +. + */ + +namespace Doctrine\Common\Cache; + +use \Memcache; + +/** + * Memcache cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class MemcacheCache extends CacheProvider +{ + /** + * @var Memcache + */ + private $memcache; + + /** + * Sets the memcache instance to use. + * + * @param Memcache $memcache + */ + public function setMemcache(Memcache $memcache) + { + $this->memcache = $memcache; + } + + /** + * Gets the memcache instance used by the cache. + * + * @return Memcache + */ + public function getMemcache() + { + return $this->memcache; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcache->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (bool) $this->memcache->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + return $this->memcache->set($id, $data, 0, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->memcache->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcache->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcache->getStats(); + return array( + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php new file mode 100644 index 00000000..4675fae7 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php @@ -0,0 +1,124 @@ +. + */ + +namespace Doctrine\Common\Cache; + +use \Memcached; + +/** + * Memcached cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class MemcachedCache extends CacheProvider +{ + /** + * @var Memcached + */ + private $memcached; + + /** + * Sets the memcache instance to use. + * + * @param Memcached $memcached + */ + public function setMemcached(Memcached $memcached) + { + $this->memcached = $memcached; + } + + /** + * Gets the memcached instance used by the cache. + * + * @return Memcached + */ + public function getMemcached() + { + return $this->memcached; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcached->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (false !== $this->memcached->get($id)); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + return $this->memcached->set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->memcached->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcached->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcached->getStats(); + $servers = $this->memcached->getServerList(); + $key = $servers[0]['host'] . ':' . $servers[0]['port']; + $stats = $stats[$key]; + return array( + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php new file mode 100644 index 00000000..ed8ca74a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php @@ -0,0 +1,92 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * WinCache cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class WincacheCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return wincache_ucache_get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return wincache_ucache_exists($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return (bool) wincache_ucache_set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return wincache_ucache_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return wincache_ucache_clear(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = wincache_ucache_info(); + $meminfo= wincache_ucache_meminfo(); + return array( + Cache::STATS_HITS => $info['total_hit_count'], + Cache::STATS_MISSES => $info['total_miss_count'], + Cache::STATS_UPTIME => $info['total_cache_uptime'], + Cache::STATS_MEMORY_USAGE => $meminfo['memory_total'], + Cache::STATS_MEMORY_AVAILIABLE => $meminfo['memory_free'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php new file mode 100644 index 00000000..6e22d265 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php @@ -0,0 +1,110 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Xcache cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class XcacheCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->doContains($id) ? unserialize(xcache_get($id)) : false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return xcache_isset($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return xcache_set($id, serialize($data), (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return xcache_unset($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->checkAuthorization(); + + xcache_clear_cache(XC_TYPE_VAR, 0); + + return true; + } + + /** + * Checks that xcache.admin.enable_auth is Off + * + * @throws \BadMethodCallException When xcache.admin.enable_auth is On + * @return void + */ + protected function checkAuthorization() + { + if (ini_get('xcache.admin.enable_auth')) { + throw new \BadMethodCallException('To use all features of \Doctrine\Common\Cache\XcacheCache, you must set "xcache.admin.enable_auth" to "Off" in your php.ini.'); + } + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $this->checkAuthorization(); + + $info = xcache_info(XC_TYPE_VAR, 0); + return array( + Cache::STATS_HITS => $info['hits'], + Cache::STATS_MISSES => $info['misses'], + Cache::STATS_UPTIME => null, + Cache::STATS_MEMORY_USAGE => $info['size'], + Cache::STATS_MEMORY_AVAILIABLE => $info['avail'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php new file mode 100644 index 00000000..4e4dabe7 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php @@ -0,0 +1,84 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Zend Data Cache cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Ralph Schindler + * @author Guilherme Blanco + */ +class ZendDataCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return zend_shm_cache_fetch($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (false !== zend_shm_cache_fetch($id)); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return zend_shm_cache_store($id, $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return zend_shm_cache_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $namespace = $this->getNamespace(); + if (empty($namespace)) { + return zend_shm_cache_clear(); + } + return zend_shm_cache_clear($namespace); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php new file mode 100644 index 00000000..375b0d6b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php @@ -0,0 +1,262 @@ +. + */ + +namespace Doctrine\Common; + +/** + * A ClassLoader is an autoloader for class files that can be + * installed on the SPL autoload stack. It is a class loader that either loads only classes + * of a specific namespace or all namespaces and it is suitable for working together + * with other autoloaders in the SPL autoload stack. + * + * If no include path is configured through the constructor or {@link setIncludePath}, a ClassLoader + * relies on the PHP include_path. + * + * @author Roman Borschel + * @since 2.0 + */ +class ClassLoader +{ + /** + * @var string PHP file extension + */ + protected $fileExtension = '.php'; + + /** + * @var string Current namespace + */ + protected $namespace; + + /** + * @var string Current include path + */ + protected $includePath; + + /** + * @var string PHP namespace separator + */ + protected $namespaceSeparator = '\\'; + + /** + * Creates a new ClassLoader that loads classes of the + * specified namespace from the specified include path. + * + * If no include path is given, the ClassLoader relies on the PHP include_path. + * If neither a namespace nor an include path is given, the ClassLoader will + * be responsible for loading all classes, thereby relying on the PHP include_path. + * + * @param string $ns The namespace of the classes to load. + * @param string $includePath The base include path to use. + */ + public function __construct($ns = null, $includePath = null) + { + $this->namespace = $ns; + $this->includePath = $includePath; + } + + /** + * Sets the namespace separator used by classes in the namespace of this ClassLoader. + * + * @param string $sep The separator to use. + */ + public function setNamespaceSeparator($sep) + { + $this->namespaceSeparator = $sep; + } + + /** + * Gets the namespace separator used by classes in the namespace of this ClassLoader. + * + * @return string + */ + public function getNamespaceSeparator() + { + return $this->namespaceSeparator; + } + + /** + * Sets the base include path for all class files in the namespace of this ClassLoader. + * + * @param string $includePath + */ + public function setIncludePath($includePath) + { + $this->includePath = $includePath; + } + + /** + * Gets the base include path for all class files in the namespace of this ClassLoader. + * + * @return string + */ + public function getIncludePath() + { + return $this->includePath; + } + + /** + * Sets the file extension of class files in the namespace of this ClassLoader. + * + * @param string $fileExtension + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * Gets the file extension of class files in the namespace of this ClassLoader. + * + * @return string + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Registers this ClassLoader on the SPL autoload stack. + */ + public function register() + { + spl_autoload_register(array($this, 'loadClass')); + } + + /** + * Removes this ClassLoader from the SPL autoload stack. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $classname The name of the class to load. + * @return boolean TRUE if the class has been successfully loaded, FALSE otherwise. + */ + public function loadClass($className) + { + if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) { + return false; + } + + require ($this->includePath !== null ? $this->includePath . DIRECTORY_SEPARATOR : '') + . str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) + . $this->fileExtension; + + return true; + } + + /** + * Asks this ClassLoader whether it can potentially load the class (file) with + * the given name. + * + * @param string $className The fully-qualified name of the class. + * @return boolean TRUE if this ClassLoader can load the class, FALSE otherwise. + */ + public function canLoadClass($className) + { + if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) { + return false; + } + + $file = str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) . $this->fileExtension; + + if ($this->includePath !== null) { + return file_exists($this->includePath . DIRECTORY_SEPARATOR . $file); + } + + return (false !== stream_resolve_include_path($file)); + } + + /** + * Checks whether a class with a given name exists. A class "exists" if it is either + * already defined in the current request or if there is an autoloader on the SPL + * autoload stack that is a) responsible for the class in question and b) is able to + * load a class file in which the class definition resides. + * + * If the class is not already defined, each autoloader in the SPL autoload stack + * is asked whether it is able to tell if the class exists. If the autoloader is + * a ClassLoader, {@link canLoadClass} is used, otherwise the autoload + * function of the autoloader is invoked and expected to return a value that + * evaluates to TRUE if the class (file) exists. As soon as one autoloader reports + * that the class exists, TRUE is returned. + * + * Note that, depending on what kinds of autoloaders are installed on the SPL + * autoload stack, the class (file) might already be loaded as a result of checking + * for its existence. This is not the case with a ClassLoader, who separates + * these responsibilities. + * + * @param string $className The fully-qualified name of the class. + * @return boolean TRUE if the class exists as per the definition given above, FALSE otherwise. + */ + public static function classExists($className) + { + if (class_exists($className, false) || interface_exists($className, false)) { + return true; + } + + foreach (spl_autoload_functions() as $loader) { + if (is_array($loader)) { // array(???, ???) + if (is_object($loader[0])) { + if ($loader[0] instanceof ClassLoader) { // array($obj, 'methodName') + if ($loader[0]->canLoadClass($className)) { + return true; + } + } else if ($loader[0]->{$loader[1]}($className)) { + return true; + } + } else if ($loader[0]::$loader[1]($className)) { // array('ClassName', 'methodName') + return true; + } + } else if ($loader instanceof \Closure) { // function($className) {..} + if ($loader($className)) { + return true; + } + } else if (is_string($loader) && $loader($className)) { // "MyClass::loadClass" + return true; + } + } + + return class_exists($className, false) || interface_exists($className, false); + } + + /** + * Gets the ClassLoader from the SPL autoload stack that is responsible + * for (and is able to load) the class with the given name. + * + * @param string $className The name of the class. + * @return The ClassLoader for the class or NULL if no such ClassLoader exists. + */ + public static function getClassLoader($className) + { + foreach (spl_autoload_functions() as $loader) { + if (is_array($loader) + && $loader[0] instanceof ClassLoader + && $loader[0]->canLoadClass($className) + ) { + return $loader[0]; + } + } + + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php new file mode 100644 index 00000000..2a7d4eaf --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php @@ -0,0 +1,447 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Closure, ArrayIterator; + +/** + * An ArrayCollection is a Collection implementation that wraps a regular PHP array. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class ArrayCollection implements Collection +{ + /** + * An array containing the entries of this collection. + * + * @var array + */ + private $_elements; + + /** + * Initializes a new ArrayCollection. + * + * @param array $elements + */ + public function __construct(array $elements = array()) + { + $this->_elements = $elements; + } + + /** + * Gets the PHP array representation of this collection. + * + * @return array The PHP array representation of this collection. + */ + public function toArray() + { + return $this->_elements; + } + + /** + * Sets the internal iterator to the first element in the collection and + * returns this element. + * + * @return mixed + */ + public function first() + { + return reset($this->_elements); + } + + /** + * Sets the internal iterator to the last element in the collection and + * returns this element. + * + * @return mixed + */ + public function last() + { + return end($this->_elements); + } + + /** + * Gets the current key/index at the current internal iterator position. + * + * @return mixed + */ + public function key() + { + return key($this->_elements); + } + + /** + * Moves the internal iterator position to the next element. + * + * @return mixed + */ + public function next() + { + return next($this->_elements); + } + + /** + * Gets the element of the collection at the current internal iterator position. + * + * @return mixed + */ + public function current() + { + return current($this->_elements); + } + + /** + * Removes an element with a specific key/index from the collection. + * + * @param mixed $key + * @return mixed The removed element or NULL, if no element exists for the given key. + */ + public function remove($key) + { + if (isset($this->_elements[$key])) { + $removed = $this->_elements[$key]; + unset($this->_elements[$key]); + + return $removed; + } + + return null; + } + + /** + * Removes the specified element from the collection, if it is found. + * + * @param mixed $element The element to remove. + * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. + */ + public function removeElement($element) + { + $key = array_search($element, $this->_elements, true); + + if ($key !== false) { + unset($this->_elements[$key]); + + return true; + } + + return false; + } + + /** + * ArrayAccess implementation of offsetExists() + * + * @see containsKey() + */ + public function offsetExists($offset) + { + return $this->containsKey($offset); + } + + /** + * ArrayAccess implementation of offsetGet() + * + * @see get() + */ + public function offsetGet($offset) + { + return $this->get($offset); + } + + /** + * ArrayAccess implementation of offsetGet() + * + * @see add() + * @see set() + */ + public function offsetSet($offset, $value) + { + if ( ! isset($offset)) { + return $this->add($value); + } + return $this->set($offset, $value); + } + + /** + * ArrayAccess implementation of offsetUnset() + * + * @see remove() + */ + public function offsetUnset($offset) + { + return $this->remove($offset); + } + + /** + * Checks whether the collection contains a specific key/index. + * + * @param mixed $key The key to check for. + * @return boolean TRUE if the given key/index exists, FALSE otherwise. + */ + public function containsKey($key) + { + return isset($this->_elements[$key]); + } + + /** + * Checks whether the given element is contained in the collection. + * Only element values are compared, not keys. The comparison of two elements + * is strict, that means not only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element + * @return boolean TRUE if the given element is contained in the collection, + * FALSE otherwise. + */ + public function contains($element) + { + foreach ($this->_elements as $collectionElement) { + if ($element === $collectionElement) { + return true; + } + } + + return false; + } + + /** + * Tests for the existance of an element that satisfies the given predicate. + * + * @param Closure $p The predicate. + * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. + */ + public function exists(Closure $p) + { + foreach ($this->_elements as $key => $element) { + if ($p($key, $element)) { + return true; + } + } + return false; + } + + /** + * Searches for a given element and, if found, returns the corresponding key/index + * of that element. The comparison of two elements is strict, that means not + * only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element The element to search for. + * @return mixed The key/index of the element or FALSE if the element was not found. + */ + public function indexOf($element) + { + return array_search($element, $this->_elements, true); + } + + /** + * Gets the element with the given key/index. + * + * @param mixed $key The key. + * @return mixed The element or NULL, if no element exists for the given key. + */ + public function get($key) + { + if (isset($this->_elements[$key])) { + return $this->_elements[$key]; + } + return null; + } + + /** + * Gets all keys/indexes of the collection elements. + * + * @return array + */ + public function getKeys() + { + return array_keys($this->_elements); + } + + /** + * Gets all elements. + * + * @return array + */ + public function getValues() + { + return array_values($this->_elements); + } + + /** + * Returns the number of elements in the collection. + * + * Implementation of the Countable interface. + * + * @return integer The number of elements in the collection. + */ + public function count() + { + return count($this->_elements); + } + + /** + * Adds/sets an element in the collection at the index / with the specified key. + * + * When the collection is a Map this is like put(key,value)/add(key,value). + * When the collection is a List this is like add(position,value). + * + * @param mixed $key + * @param mixed $value + */ + public function set($key, $value) + { + $this->_elements[$key] = $value; + } + + /** + * Adds an element to the collection. + * + * @param mixed $value + * @return boolean Always TRUE. + */ + public function add($value) + { + $this->_elements[] = $value; + return true; + } + + /** + * Checks whether the collection is empty. + * + * Note: This is preferrable over count() == 0. + * + * @return boolean TRUE if the collection is empty, FALSE otherwise. + */ + public function isEmpty() + { + return ! $this->_elements; + } + + /** + * Gets an iterator for iterating over the elements in the collection. + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_elements); + } + + /** + * Applies the given function to each element in the collection and returns + * a new collection with the elements returned by the function. + * + * @param Closure $func + * @return Collection + */ + public function map(Closure $func) + { + return new static(array_map($func, $this->_elements)); + } + + /** + * Returns all the elements of this collection that satisfy the predicate p. + * The order of the elements is preserved. + * + * @param Closure $p The predicate used for filtering. + * @return Collection A collection with the results of the filter operation. + */ + public function filter(Closure $p) + { + return new static(array_filter($this->_elements, $p)); + } + + /** + * Applies the given predicate p to all elements of this collection, + * returning true, if the predicate yields true for all elements. + * + * @param Closure $p The predicate. + * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. + */ + public function forAll(Closure $p) + { + foreach ($this->_elements as $key => $element) { + if ( ! $p($key, $element)) { + return false; + } + } + + return true; + } + + /** + * Partitions this collection in two collections according to a predicate. + * Keys are preserved in the resulting collections. + * + * @param Closure $p The predicate on which to partition. + * @return array An array with two elements. The first element contains the collection + * of elements where the predicate returned TRUE, the second element + * contains the collection of elements where the predicate returned FALSE. + */ + public function partition(Closure $p) + { + $coll1 = $coll2 = array(); + foreach ($this->_elements as $key => $element) { + if ($p($key, $element)) { + $coll1[$key] = $element; + } else { + $coll2[$key] = $element; + } + } + return array(new static($coll1), new static($coll2)); + } + + /** + * Returns a string representation of this object. + * + * @return string + */ + public function __toString() + { + return __CLASS__ . '@' . spl_object_hash($this); + } + + /** + * Clears the collection. + */ + public function clear() + { + $this->_elements = array(); + } + + /** + * Extract a slice of $length elements starting at position $offset from the Collection. + * + * If $length is null it returns all elements from $offset to the end of the Collection. + * Keys have to be preserved by this method. Calling this method will only return the + * selected slice and NOT change the elements contained in the collection slice is called on. + * + * @param int $offset + * @param int $length + * @return array + */ + public function slice($offset, $length = null) + { + return array_slice($this->_elements, $offset, $length, true); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php new file mode 100644 index 00000000..9fca659c --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php @@ -0,0 +1,243 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Closure, Countable, IteratorAggregate, ArrayAccess; + +/** + * The missing (SPL) Collection/Array/OrderedMap interface. + * + * A Collection resembles the nature of a regular PHP array. That is, + * it is essentially an ordered map that can also be used + * like a list. + * + * A Collection has an internal iterator just like a PHP array. In addition, + * a Collection can be iterated with external iterators, which is preferrable. + * To use an external iterator simply use the foreach language construct to + * iterate over the collection (which calls {@link getIterator()} internally) or + * explicitly retrieve an iterator though {@link getIterator()} which can then be + * used to iterate over the collection. + * You can not rely on the internal iterator of the collection being at a certain + * position unless you explicitly positioned it before. Prefer iteration with + * external iterators. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface Collection extends Countable, IteratorAggregate, ArrayAccess +{ + /** + * Adds an element at the end of the collection. + * + * @param mixed $element The element to add. + * @return boolean Always TRUE. + */ + function add($element); + + /** + * Clears the collection, removing all elements. + */ + function clear(); + + /** + * Checks whether an element is contained in the collection. + * This is an O(n) operation, where n is the size of the collection. + * + * @param mixed $element The element to search for. + * @return boolean TRUE if the collection contains the element, FALSE otherwise. + */ + function contains($element); + + /** + * Checks whether the collection is empty (contains no elements). + * + * @return boolean TRUE if the collection is empty, FALSE otherwise. + */ + function isEmpty(); + + /** + * Removes the element at the specified index from the collection. + * + * @param string|integer $key The kex/index of the element to remove. + * @return mixed The removed element or NULL, if the collection did not contain the element. + */ + function remove($key); + + /** + * Removes the specified element from the collection, if it is found. + * + * @param mixed $element The element to remove. + * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. + */ + function removeElement($element); + + /** + * Checks whether the collection contains an element with the specified key/index. + * + * @param string|integer $key The key/index to check for. + * @return boolean TRUE if the collection contains an element with the specified key/index, + * FALSE otherwise. + */ + function containsKey($key); + + /** + * Gets the element at the specified key/index. + * + * @param string|integer $key The key/index of the element to retrieve. + * @return mixed + */ + function get($key); + + /** + * Gets all keys/indices of the collection. + * + * @return array The keys/indices of the collection, in the order of the corresponding + * elements in the collection. + */ + function getKeys(); + + /** + * Gets all values of the collection. + * + * @return array The values of all elements in the collection, in the order they + * appear in the collection. + */ + function getValues(); + + /** + * Sets an element in the collection at the specified key/index. + * + * @param string|integer $key The key/index of the element to set. + * @param mixed $value The element to set. + */ + function set($key, $value); + + /** + * Gets a native PHP array representation of the collection. + * + * @return array + */ + function toArray(); + + /** + * Sets the internal iterator to the first element in the collection and + * returns this element. + * + * @return mixed + */ + function first(); + + /** + * Sets the internal iterator to the last element in the collection and + * returns this element. + * + * @return mixed + */ + function last(); + + /** + * Gets the key/index of the element at the current iterator position. + * + */ + function key(); + + /** + * Gets the element of the collection at the current iterator position. + * + */ + function current(); + + /** + * Moves the internal iterator position to the next element. + * + */ + function next(); + + /** + * Tests for the existence of an element that satisfies the given predicate. + * + * @param Closure $p The predicate. + * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. + */ + function exists(Closure $p); + + /** + * Returns all the elements of this collection that satisfy the predicate p. + * The order of the elements is preserved. + * + * @param Closure $p The predicate used for filtering. + * @return Collection A collection with the results of the filter operation. + */ + function filter(Closure $p); + + /** + * Applies the given predicate p to all elements of this collection, + * returning true, if the predicate yields true for all elements. + * + * @param Closure $p The predicate. + * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. + */ + function forAll(Closure $p); + + /** + * Applies the given function to each element in the collection and returns + * a new collection with the elements returned by the function. + * + * @param Closure $func + * @return Collection + */ + function map(Closure $func); + + /** + * Partitions this collection in two collections according to a predicate. + * Keys are preserved in the resulting collections. + * + * @param Closure $p The predicate on which to partition. + * @return array An array with two elements. The first element contains the collection + * of elements where the predicate returned TRUE, the second element + * contains the collection of elements where the predicate returned FALSE. + */ + function partition(Closure $p); + + /** + * Gets the index/key of a given element. The comparison of two elements is strict, + * that means not only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element The element to search for. + * @return mixed The key/index of the element or FALSE if the element was not found. + */ + function indexOf($element); + + /** + * Extract a slice of $length elements starting at position $offset from the Collection. + * + * If $length is null it returns all elements from $offset to the end of the Collection. + * Keys have to be preserved by this method. Calling this method will only return the + * selected slice and NOT change the elements contained in the collection slice is called on. + * + * @param int $offset + * @param int $length + * @return array + */ + function slice($offset, $length = null); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php new file mode 100644 index 00000000..8c5669be --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php @@ -0,0 +1,28 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Base exception class for package Doctrine\Common + * @author heinrich + * + */ +class CommonException extends \Exception { +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php new file mode 100644 index 00000000..bc95d303 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php @@ -0,0 +1,47 @@ +. + */ + + +namespace Doctrine\Common; + +/** + * Comparable interface that allows to compare two value objects to each other for similarity. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.com + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + */ +interface Comparable +{ + /** + * Compare the current object to the passed $other. + * + * Returns 0 if they are semantically equal, 1 if the other object + * is less than the current one, or -1 if its more than the current one. + * + * This method should not check for identity using ===, only for semantical equality for example + * when two different DateTime instances point to the exact same Date + TZ. + * + * @return int + */ + public function compareTo($other); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php new file mode 100644 index 00000000..6a3c0699 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php @@ -0,0 +1,69 @@ +. + */ + +namespace Doctrine\Common; + +/** + * EventArgs is the base class for classes containing event data. + * + * This class contains no event data. It is used by events that do not pass state + * information to an event handler when an event is raised. The single empty EventArgs + * instance can be obtained through {@link getEmptyInstance}. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class EventArgs +{ + /** + * @var EventArgs Single instance of EventArgs + * @static + */ + private static $_emptyEventArgsInstance; + + /** + * Gets the single, empty and immutable EventArgs instance. + * + * This instance will be used when events are dispatched without any parameter, + * like this: EventManager::dispatchEvent('eventname'); + * + * The benefit from this is that only one empty instance is instantiated and shared + * (otherwise there would be instances for every dispatched in the abovementioned form) + * + * @see EventManager::dispatchEvent + * @link http://msdn.microsoft.com/en-us/library/system.eventargs.aspx + * @static + * @return EventArgs + */ + public static function getEmptyInstance() + { + if ( ! self::$_emptyEventArgsInstance) { + self::$_emptyEventArgsInstance = new EventArgs; + } + + return self::$_emptyEventArgsInstance; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php new file mode 100644 index 00000000..a1f11ed2 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php @@ -0,0 +1,136 @@ +. + */ + +namespace Doctrine\Common; + +/** + * The EventManager is the central point of Doctrine's event listener system. + * Listeners are registered on the manager and events are dispatched through the + * manager. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class EventManager +{ + /** + * Map of registered listeners. + * => + * + * @var array + */ + private $_listeners = array(); + + /** + * Dispatches an event to all registered listeners. + * + * @param string $eventName The name of the event to dispatch. The name of the event is + * the name of the method that is invoked on listeners. + * @param EventArgs $eventArgs The event arguments to pass to the event handlers/listeners. + * If not supplied, the single empty EventArgs instance is used. + * @return boolean + */ + public function dispatchEvent($eventName, EventArgs $eventArgs = null) + { + if (isset($this->_listeners[$eventName])) { + $eventArgs = $eventArgs === null ? EventArgs::getEmptyInstance() : $eventArgs; + + foreach ($this->_listeners[$eventName] as $listener) { + $listener->$eventName($eventArgs); + } + } + } + + /** + * Gets the listeners of a specific event or all listeners. + * + * @param string $event The name of the event. + * @return array The event listeners for the specified event, or all event listeners. + */ + public function getListeners($event = null) + { + return $event ? $this->_listeners[$event] : $this->_listeners; + } + + /** + * Checks whether an event has any registered listeners. + * + * @param string $event + * @return boolean TRUE if the specified event has any listeners, FALSE otherwise. + */ + public function hasListeners($event) + { + return isset($this->_listeners[$event]) && $this->_listeners[$event]; + } + + /** + * Adds an event listener that listens on the specified events. + * + * @param string|array $events The event(s) to listen on. + * @param object $listener The listener object. + */ + public function addEventListener($events, $listener) + { + // Picks the hash code related to that listener + $hash = spl_object_hash($listener); + + foreach ((array) $events as $event) { + // Overrides listener if a previous one was associated already + // Prevents duplicate listeners on same event (same instance only) + $this->_listeners[$event][$hash] = $listener; + } + } + + /** + * Removes an event listener from the specified events. + * + * @param string|array $events + * @param object $listener + */ + public function removeEventListener($events, $listener) + { + // Picks the hash code related to that listener + $hash = spl_object_hash($listener); + + foreach ((array) $events as $event) { + // Check if actually have this listener associated + if (isset($this->_listeners[$event][$hash])) { + unset($this->_listeners[$event][$hash]); + } + } + } + + /** + * Adds an EventSubscriber. The subscriber is asked for all the events he is + * interested in and added as a listener for these events. + * + * @param Doctrine\Common\EventSubscriber $subscriber The subscriber. + */ + public function addEventSubscriber(EventSubscriber $subscriber) + { + $this->addEventListener($subscriber->getSubscribedEvents(), $subscriber); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php new file mode 100644 index 00000000..ed3383fa --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php @@ -0,0 +1,45 @@ +. + */ + +namespace Doctrine\Common; + +/** + * An EventSubscriber knows himself what events he is interested in. + * If an EventSubscriber is added to an EventManager, the manager invokes + * {@link getSubscribedEvents} and registers the subscriber as a listener for all + * returned events. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface EventSubscriber +{ + /** + * Returns an array of events this subscriber wants to listen to. + * + * @return array + */ + function getSubscribedEvents(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php new file mode 100644 index 00000000..8df3b843 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php @@ -0,0 +1,266 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Base class for writing simple lexers, i.e. for creating small DSLs. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @todo Rename: AbstractLexer + */ +abstract class Lexer +{ + /** + * @var array Array of scanned tokens + */ + private $tokens = array(); + + /** + * @var integer Current lexer position in input string + */ + private $position = 0; + + /** + * @var integer Current peek of current lexer position + */ + private $peek = 0; + + /** + * @var array The next token in the input. + */ + public $lookahead; + + /** + * @var array The last matched/seen token. + */ + public $token; + + /** + * Sets the input data to be tokenized. + * + * The Lexer is immediately reset and the new input tokenized. + * Any unprocessed tokens from any previous input are lost. + * + * @param string $input The input to be tokenized. + */ + public function setInput($input) + { + $this->tokens = array(); + $this->reset(); + $this->scan($input); + } + + /** + * Resets the lexer. + */ + public function reset() + { + $this->lookahead = null; + $this->token = null; + $this->peek = 0; + $this->position = 0; + } + + /** + * Resets the peek pointer to 0. + */ + public function resetPeek() + { + $this->peek = 0; + } + + /** + * Resets the lexer position on the input to the given position. + * + * @param integer $position Position to place the lexical scanner + */ + public function resetPosition($position = 0) + { + $this->position = $position; + } + + /** + * Checks whether a given token matches the current lookahead. + * + * @param integer|string $token + * @return boolean + */ + public function isNextToken($token) + { + return null !== $this->lookahead && $this->lookahead['type'] === $token; + } + + /** + * Checks whether any of the given tokens matches the current lookahead + * + * @param array $tokens + * @return boolean + */ + public function isNextTokenAny(array $tokens) + { + return null !== $this->lookahead && in_array($this->lookahead['type'], $tokens, true); + } + + /** + * Moves to the next token in the input string. + * + * A token is an associative array containing three items: + * - 'value' : the string value of the token in the input string + * - 'type' : the type of the token (identifier, numeric, string, input + * parameter, none) + * - 'position' : the position of the token in the input string + * + * @return array|null the next token; null if there is no more tokens left + */ + public function moveNext() + { + $this->peek = 0; + $this->token = $this->lookahead; + $this->lookahead = (isset($this->tokens[$this->position])) + ? $this->tokens[$this->position++] : null; + + return $this->lookahead !== null; + } + + /** + * Tells the lexer to skip input tokens until it sees a token with the given value. + * + * @param $type The token type to skip until. + */ + public function skipUntil($type) + { + while ($this->lookahead !== null && $this->lookahead['type'] !== $type) { + $this->moveNext(); + } + } + + /** + * Checks if given value is identical to the given token + * + * @param mixed $value + * @param integer $token + * @return boolean + */ + public function isA($value, $token) + { + return $this->getType($value) === $token; + } + + /** + * Moves the lookahead token forward. + * + * @return array | null The next token or NULL if there are no more tokens ahead. + */ + public function peek() + { + if (isset($this->tokens[$this->position + $this->peek])) { + return $this->tokens[$this->position + $this->peek++]; + } else { + return null; + } + } + + /** + * Peeks at the next token, returns it and immediately resets the peek. + * + * @return array|null The next token or NULL if there are no more tokens ahead. + */ + public function glimpse() + { + $peek = $this->peek(); + $this->peek = 0; + return $peek; + } + + /** + * Scans the input string for tokens. + * + * @param string $input a query string + */ + protected function scan($input) + { + static $regex; + + if ( ! isset($regex)) { + $regex = '/(' . implode(')|(', $this->getCatchablePatterns()) . ')|' + . implode('|', $this->getNonCatchablePatterns()) . '/i'; + } + + $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE; + $matches = preg_split($regex, $input, -1, $flags); + + foreach ($matches as $match) { + // Must remain before 'value' assignment since it can change content + $type = $this->getType($match[0]); + + $this->tokens[] = array( + 'value' => $match[0], + 'type' => $type, + 'position' => $match[1], + ); + } + } + + /** + * Gets the literal for a given token. + * + * @param integer $token + * @return string + */ + public function getLiteral($token) + { + $className = get_class($this); + $reflClass = new \ReflectionClass($className); + $constants = $reflClass->getConstants(); + + foreach ($constants as $name => $value) { + if ($value === $token) { + return $className . '::' . $name; + } + } + + return $token; + } + + /** + * Lexical catchable patterns. + * + * @return array + */ + abstract protected function getCatchablePatterns(); + + /** + * Lexical non-catchable patterns. + * + * @return array + */ + abstract protected function getNonCatchablePatterns(); + + /** + * Retrieve token type. Also processes the token value if necessary. + * + * @param string $value + * @return integer + */ + abstract protected function getType(&$value); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php new file mode 100644 index 00000000..93e504ae --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php @@ -0,0 +1,45 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Contract for classes that provide the service of notifying listeners of + * changes to their properties. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface NotifyPropertyChanged +{ + /** + * Adds a listener that wants to be notified about property changes. + * + * @param PropertyChangedListener $listener + */ + function addPropertyChangedListener(PropertyChangedListener $listener); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php new file mode 100644 index 00000000..9fff343c --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php @@ -0,0 +1,224 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\ManagerRegistry; + +/** + * Abstract implementation of the ManagerRegistry contract. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +abstract class AbstractManagerRegistry implements ManagerRegistry +{ + private $name; + private $connections; + private $managers; + private $defaultConnection; + private $defaultManager; + private $proxyInterfaceName; + + public function __construct($name, array $connections, array $managers, $defaultConnection, $defaultManager, $proxyInterfaceName) + { + $this->name = $name; + $this->connections = $connections; + $this->managers = $managers; + $this->defaultConnection = $defaultConnection; + $this->defaultManager = $defaultManager; + $this->proxyInterfaceName = $proxyInterfaceName; + } + + /** + * Fetches/creates the given services + * + * A service in this context is connection or a manager instance + * + * @param string $name name of the service + * @return object instance of the given service + */ + abstract protected function getService($name); + + /** + * Resets the given services + * + * A service in this context is connection or a manager instance + * + * @param string $name name of the service + * @return void + */ + abstract protected function resetService($name); + + /** + * Get the name of the registry + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @inheritdoc + */ + public function getConnection($name = null) + { + if (null === $name) { + $name = $this->defaultConnection; + } + + if (!isset($this->connections[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Connection named "%s" does not exist.', $this->name, $name)); + } + + return $this->getService($this->connections[$name]); + } + + /** + * @inheritdoc + */ + public function getConnectionNames() + { + return $this->connections; + } + + /** + * @inheritdoc + */ + public function getConnections() + { + $connections = array(); + foreach ($this->connections as $name => $id) { + $connections[$name] = $this->getService($id); + } + + return $connections; + } + + /** + * @inheritdoc + */ + public function getDefaultConnectionName() + { + return $this->defaultConnection; + } + + /** + * @inheritdoc + */ + public function getDefaultManagerName() + { + return $this->defaultManager; + } + + /** + * @inheritdoc + */ + public function getManager($name = null) + { + if (null === $name) { + $name = $this->defaultManager; + } + + if (!isset($this->managers[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); + } + + return $this->getService($this->managers[$name]); + } + + /** + * @inheritdoc + */ + public function getManagerForClass($class) + { + // Check for namespace alias + if (strpos($class, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $class); + $class = $this->getAliasNamespace($namespaceAlias) . '\\' . $simpleClassName; + } + + $proxyClass = new \ReflectionClass($class); + if ($proxyClass->implementsInterface($this->proxyInterfaceName)) { + $class = $proxyClass->getParentClass()->getName(); + } + + foreach ($this->managers as $id) { + $manager = $this->getService($id); + + if (!$manager->getMetadataFactory()->isTransient($class)) { + return $manager; + } + } + } + + /** + * @inheritdoc + */ + public function getManagerNames() + { + return $this->managers; + } + + /** + * @inheritdoc + */ + public function getManagers() + { + $dms = array(); + foreach ($this->managers as $name => $id) { + $dms[$name] = $this->getService($id); + } + + return $dms; + } + + /** + * @inheritdoc + */ + public function getRepository($persistentObjectName, $persistentManagerName = null) + { + return $this->getManager($persistentManagerName)->getRepository($persistentObjectName); + } + + /** + * @inheritdoc + */ + public function resetManager($name = null) + { + if (null === $name) { + $name = $this->defaultManager; + } + + if (!isset($this->managers[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); + } + + // force the creation of a new document manager + // if the current one is closed + $this->resetService($this->managers[$name]); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php new file mode 100644 index 00000000..a47727fa --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php @@ -0,0 +1,63 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract covering connection for a Doctrine persistence layer ManagerRegistry class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +interface ConnectionRegistry +{ + /** + * Gets the default connection name. + * + * @return string The default connection name + */ + function getDefaultConnectionName(); + + /** + * Gets the named connection. + * + * @param string $name The connection name (null for the default one) + * + * @return Connection + */ + function getConnection($name = null); + + /** + * Gets an array of all registered connections + * + * @return array An array of Connection instances + */ + function getConnections(); + + /** + * Gets all connection names. + * + * @return array An array of connection names + */ + function getConnectionNames(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php new file mode 100644 index 00000000..8055b66d --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php @@ -0,0 +1,77 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs; +use Doctrine\Common\Persistence\ObjectManager; + +/** + * Lifecycle Events are triggered by the UnitOfWork during lifecycle transitions + * of entities. + * + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class LifecycleEventArgs extends EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var object + */ + private $entity; + + /** + * Constructor + * + * @param object $entity + * @param ObjectManager $objectManager + */ + public function __construct($entity, ObjectManager $objectManager) + { + $this->entity = $entity; + $this->objectManager = $objectManager; + } + + /** + * Retireve associated Entity. + * + * @return object + */ + public function getEntity() + { + return $this->entity; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php new file mode 100644 index 00000000..4a18d167 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php @@ -0,0 +1,76 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs; +use Doctrine\Common\Persistence\ObjectManager; +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Class that holds event arguments for a loadMetadata event. + * + * @author Jonathan H. Wage + * @since 2.2 + */ +class LoadClassMetadataEventArgs extends EventArgs +{ + /** + * @var ClassMetadata + */ + private $classMetadata; + + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * Constructor. + * + * @param ClasseMetadata $classMetadata + * @param ObjectManager $objectManager + */ + public function __construct(ClassMetadata $classMetadata, ObjectManager $objectManager) + { + $this->classMetadata = $classMetadata; + $this->objectManager = $objectManager; + } + + /** + * Retrieve associated ClassMetadata. + * + * @return ClassMetadata + */ + public function getClassMetadata() + { + return $this->classMetadata; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php new file mode 100644 index 00000000..33c4d796 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php @@ -0,0 +1,59 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\Persistence\ObjectManager; + +/** + * Provides event arguments for the preFlush event. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class ManagerEventArgs extends \Doctrine\Common\EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * Constructor. + * + * @param ObjectManager $objectManager + */ + public function __construct(ObjectManager $objectManager) + { + $this->objectManager = $objectManager; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php new file mode 100644 index 00000000..f67ab50e --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php @@ -0,0 +1,84 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +/** + * Provides event arguments for the onClear event. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class OnClearEventArgs extends \Doctrine\Common\EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var string + */ + private $entityClass; + + /** + * Constructor. + * + * @param ObjectManager $objectManager + * @param string $entityClass Optional entity class + */ + public function __construct($objectManager, $entityClass = null) + { + $this->objectManager = $objectManager; + $this->entityClass = $entityClass; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } + + /** + * Name of the entity class that is cleared, or empty if all are cleared. + * + * @return string + */ + public function getEntityClass() + { + return $this->entityClass; + } + + /** + * Check if event clears all entities. + * + * @return bool + */ + public function clearsAllEntities() + { + return ($this->entityClass === null); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php new file mode 100644 index 00000000..191d053a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php @@ -0,0 +1,129 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs, + Doctrine\Common\Persistence\ObjectManager; + +/** + * Class that holds event arguments for a preUpdate event. + * + * @author Guilherme Blanco + * @author Roman Borschel + * @author Benjamin Eberlei + * @since 2.2 + */ +class PreUpdateEventArgs extends LifecycleEventArgs +{ + /** + * @var array + */ + private $entityChangeSet; + + /** + * Constructor. + * + * @param object $entity + * @param ObjectManager $objectManager + * @param array $changeSet + */ + public function __construct($entity, ObjectManager $objectManager, array &$changeSet) + { + parent::__construct($entity, $objectManager); + + $this->entityChangeSet = &$changeSet; + } + + /** + * Retrieve entity changeset. + * + * @return array + */ + public function getEntityChangeSet() + { + return $this->entityChangeSet; + } + + /** + * Check if field has a changeset. + * + * @return boolean + */ + public function hasChangedField($field) + { + return isset($this->entityChangeSet[$field]); + } + + /** + * Get the old value of the changeset of the changed field. + * + * @param string $field + * @return mixed + */ + public function getOldValue($field) + { + $this->assertValidField($field); + + return $this->entityChangeSet[$field][0]; + } + + /** + * Get the new value of the changeset of the changed field. + * + * @param string $field + * @return mixed + */ + public function getNewValue($field) + { + $this->assertValidField($field); + + return $this->entityChangeSet[$field][1]; + } + + /** + * Set the new value of this field. + * + * @param string $field + * @param mixed $value + */ + public function setNewValue($field, $value) + { + $this->assertValidField($field); + + $this->entityChangeSet[$field][1] = $value; + } + + /** + * Assert the field exists in changeset. + * + * @param string $field + */ + private function assertValidField($field) + { + if ( ! isset($this->entityChangeSet[$field])) { + throw new \InvalidArgumentException(sprintf( + 'Field "%s" is not a valid field of the entity "%s" in PreUpdateEventArgs.', + $field, + get_class($this->getEntity()) + )); + } + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php new file mode 100644 index 00000000..4d92426b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php @@ -0,0 +1,112 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract covering object managers for a Doctrine persistence layer ManagerRegistry class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +interface ManagerRegistry extends ConnectionRegistry +{ + /** + * Gets the default object manager name. + * + * @return string The default object manager name + */ + function getDefaultManagerName(); + + /** + * Gets a named object manager. + * + * @param string $name The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectManager + */ + function getManager($name = null); + + /** + * Gets an array of all registered object managers + * + * @return array An array of ObjectManager instances + */ + function getManagers(); + + /** + * Resets a named object manager. + * + * This method is useful when an object manager has been closed + * because of a rollbacked transaction AND when you think that + * it makes sense to get a new one to replace the closed one. + * + * Be warned that you will get a brand new object manager as + * the existing one is not useable anymore. This means that any + * other object with a dependency on this object manager will + * hold an obsolete reference. You can inject the registry instead + * to avoid this problem. + * + * @param string $name The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectManager + */ + function resetManager($name = null); + + /** + * Resolves a registered namespace alias to the full namespace. + * + * This method looks for the alias in all registered object managers. + * + * @param string $alias The alias + * + * @return string The full namespace + */ + function getAliasNamespace($alias); + + /** + * Gets all connection names. + * + * @return array An array of connection names + */ + function getManagerNames(); + + /** + * Gets the ObjectRepository for an persistent object. + * + * @param string $persistentObject The name of the persistent object. + * @param string $persistentManagerName The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectRepository + */ + function getRepository($persistentObject, $persistentManagerName = null); + + /** + * Gets the object manager associated with a given class. + * + * @param string $class A persistent object class name + * + * @return \Doctrine\Common\Persistence\ObjectManager|null + */ + function getManagerForClass($class); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php new file mode 100644 index 00000000..a2a61850 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php @@ -0,0 +1,359 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use Doctrine\Common\Cache\Cache; + +/** + * The ClassMetadataFactory is used to create ClassMetadata objects that contain all the + * metadata mapping informations of a class which describes how a class should be mapped + * to a relational database. + * + * This class was abstracted from the ORM ClassMetadataFactory + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +abstract class AbstractClassMetadataFactory implements ClassMetadataFactory +{ + /** + * Salt used by specific Object Manager implementation. + * + * @var string + */ + protected $cacheSalt = "\$CLASSMETADATA"; + + /** + * @var \Doctrine\Common\Cache\Cache + */ + private $cacheDriver; + + /** + * @var array + */ + private $loadedMetadata = array(); + + /** + * @var bool + */ + protected $initialized = false; + + /** + * @var ReflectionService + */ + private $reflectionService; + + /** + * Sets the cache driver used by the factory to cache ClassMetadata instances. + * + * @param Doctrine\Common\Cache\Cache $cacheDriver + */ + public function setCacheDriver(Cache $cacheDriver = null) + { + $this->cacheDriver = $cacheDriver; + } + + /** + * Gets the cache driver used by the factory to cache ClassMetadata instances. + * + * @return Doctrine\Common\Cache\Cache + */ + public function getCacheDriver() + { + return $this->cacheDriver; + } + + /** + * Return an array of all the loaded metadata currently in memory. + * + * @return array + */ + public function getLoadedMetadata() + { + return $this->loadedMetadata; + } + + /** + * Forces the factory to load the metadata of all classes known to the underlying + * mapping driver. + * + * @return array The ClassMetadata instances of all mapped classes. + */ + public function getAllMetadata() + { + if ( ! $this->initialized) { + $this->initialize(); + } + + $driver = $this->getDriver(); + $metadata = array(); + foreach ($driver->getAllClassNames() as $className) { + $metadata[] = $this->getMetadataFor($className); + } + + return $metadata; + } + + /** + * Lazy initialization of this stuff, especially the metadata driver, + * since these are not needed at all when a metadata cache is active. + * + * @return void + */ + abstract protected function initialize(); + + /** + * Get the fully qualified class-name from the namespace alias. + * + * @param string $namespaceAlias + * @param string $simpleClassName + * @return string + */ + abstract protected function getFqcnFromAlias($namespaceAlias, $simpleClassName); + + /** + * Return the mapping driver implementation. + * + * @return MappingDriver + */ + abstract protected function getDriver(); + + /** + * Wakeup reflection after ClassMetadata gets unserialized from cache. + * + * @param ClassMetadata $class + * @param ReflectionService $reflService + * @return void + */ + abstract protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService); + + /** + * Initialize Reflection after ClassMetadata was constructed. + * + * @param ClassMetadata $class + * @param ReflectionSErvice $reflService + * @return void + */ + abstract protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService); + + /** + * Gets the class metadata descriptor for a class. + * + * @param string $className The name of the class. + * @return Doctrine\Common\Persistence\Mapping\ClassMetadata + */ + public function getMetadataFor($className) + { + if ( ! isset($this->loadedMetadata[$className])) { + $realClassName = $className; + + // Check for namespace alias + if (strpos($className, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $className); + $realClassName = $this->getFqcnFromAlias($namespaceAlias, $simpleClassName); + + if (isset($this->loadedMetadata[$realClassName])) { + // We do not have the alias name in the map, include it + $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; + + return $this->loadedMetadata[$realClassName]; + } + } + + if ($this->cacheDriver) { + if (($cached = $this->cacheDriver->fetch($realClassName . $this->cacheSalt)) !== false) { + $this->loadedMetadata[$realClassName] = $cached; + $this->wakeupReflection($cached, $this->getReflectionService()); + } else { + foreach ($this->loadMetadata($realClassName) as $loadedClassName) { + $this->cacheDriver->save( + $loadedClassName . $this->cacheSalt, $this->loadedMetadata[$loadedClassName], null + ); + } + } + } else { + $this->loadMetadata($realClassName); + } + + if ($className != $realClassName) { + // We do not have the alias name in the map, include it + $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; + } + } + + return $this->loadedMetadata[$className]; + } + + /** + * Checks whether the factory has the metadata for a class loaded already. + * + * @param string $className + * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. + */ + public function hasMetadataFor($className) + { + return isset($this->loadedMetadata[$className]); + } + + /** + * Sets the metadata descriptor for a specific class. + * + * NOTE: This is only useful in very special cases, like when generating proxy classes. + * + * @param string $className + * @param ClassMetadata $class + */ + public function setMetadataFor($className, $class) + { + $this->loadedMetadata[$className] = $class; + } + + /** + * Get array of parent classes for the given entity class + * + * @param string $name + * @return array $parentClasses + */ + protected function getParentClasses($name) + { + // Collect parent classes, ignoring transient (not-mapped) classes. + $parentClasses = array(); + foreach (array_reverse($this->getReflectionService()->getParentClasses($name)) as $parentClass) { + if ( ! $this->getDriver()->isTransient($parentClass)) { + $parentClasses[] = $parentClass; + } + } + return $parentClasses; + } + + /** + * Loads the metadata of the class in question and all it's ancestors whose metadata + * is still not loaded. + * + * @param string $name The name of the class for which the metadata should get loaded. + * @param array $tables The metadata collection to which the loaded metadata is added. + */ + protected function loadMetadata($name) + { + if ( ! $this->initialized) { + $this->initialize(); + } + + $loaded = array(); + + $parentClasses = $this->getParentClasses($name); + $parentClasses[] = $name; + + // Move down the hierarchy of parent classes, starting from the topmost class + $parent = null; + $rootEntityFound = false; + $visited = array(); + $reflService = $this->getReflectionService(); + foreach ($parentClasses as $className) { + if (isset($this->loadedMetadata[$className])) { + $parent = $this->loadedMetadata[$className]; + if (isset($parent->isMappedSuperclass) && $parent->isMappedSuperclass === false) { + $rootEntityFound = true; + array_unshift($visited, $className); + } + continue; + } + + $class = $this->newClassMetadataInstance($className); + $this->initializeReflection($class, $reflService); + + $this->doLoadMetadata($class, $parent, $rootEntityFound); + + $this->loadedMetadata[$className] = $class; + + $parent = $class; + + if (isset($parent->isMappedSuperclass) && $class->isMappedSuperclass === false) { + $rootEntityFound = true; + array_unshift($visited, $className); + } + + $this->wakeupReflection($class, $reflService); + + $loaded[] = $className; + } + + return $loaded; + } + + /** + * Actually load the metadata from the underlying metadata + * + * @param ClassMetadata $class + * @param ClassMetadata $parent + * @param bool $rootEntityFound + * @return void + */ + abstract protected function doLoadMetadata($class, $parent, $rootEntityFound); + + /** + * Creates a new ClassMetadata instance for the given class name. + * + * @param string $className + * @return ClassMetadata + */ + abstract protected function newClassMetadataInstance($className); + + /** + * Check if this class is mapped by this Object Manager + ClassMetadata configuration + * + * @param $class + * @return bool + */ + public function isTransient($class) + { + if ( ! $this->initialized) { + $this->initialize(); + } + + return $this->getDriver()->isTransient($class); + } + + /** + * Set reflectionService. + * + * @param ReflectionService $reflectionService + */ + public function setReflectionService(ReflectionService $reflectionService) + { + $this->reflectionService = $reflectionService; + } + + /** + * Get the reflection service associated with this metadata factory. + * + * @return ReflectionService + */ + public function getReflectionService() + { + if ($this->reflectionService === null) { + $this->reflectionService = new RuntimeReflectionService(); + } + return $this->reflectionService; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php new file mode 100644 index 00000000..705d59ac --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php @@ -0,0 +1,165 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ClassMetadata +{ + /** + * Get fully-qualified class name of this persistent class. + * + * @return string + */ + function getName(); + + /** + * Gets the mapped identifier field name. + * + * The returned structure is an array of the identifier field names. + * + * @return array + */ + function getIdentifier(); + + /** + * Gets the ReflectionClass instance for this mapped class. + * + * @return ReflectionClass + */ + function getReflectionClass(); + + /** + * Checks if the given field name is a mapped identifier for this class. + * + * @param string $fieldName + * @return boolean + */ + function isIdentifier($fieldName); + + /** + * Checks if the given field is a mapped property for this class. + * + * @param string $fieldName + * @return boolean + */ + function hasField($fieldName); + + /** + * Checks if the given field is a mapped association for this class. + * + * @param string $fieldName + * @return boolean + */ + function hasAssociation($fieldName); + + /** + * Checks if the given field is a mapped single valued association for this class. + * + * @param string $fieldName + * @return boolean + */ + function isSingleValuedAssociation($fieldName); + + /** + * Checks if the given field is a mapped collection valued association for this class. + * + * @param string $fieldName + * @return boolean + */ + function isCollectionValuedAssociation($fieldName); + + /** + * A numerically indexed list of field names of this persistent class. + * + * This array includes identifier fields if present on this class. + * + * @return array + */ + function getFieldNames(); + + /** + * Returns an array of identifier field names numerically indexed. + * + * @return array + */ + function getIdentifierFieldNames(); + + /** + * A numerically indexed list of association names of this persistent class. + * + * This array includes identifier associations if present on this class. + * + * @return array + */ + function getAssociationNames(); + + /** + * Returns a type name of this field. + * + * This type names can be implementation specific but should at least include the php types: + * integer, string, boolean, float/double, datetime. + * + * @param string $fieldName + * @return string + */ + function getTypeOfField($fieldName); + + /** + * Returns the target class name of the given association. + * + * @param string $assocName + * @return string + */ + function getAssociationTargetClass($assocName); + + /** + * Checks if the association is the inverse side of a bidirectional association + * + * @param string $assocName + * @return boolean + */ + function isAssociationInverseSide($assocName); + + /** + * Returns the target field of the owning side of the association + * + * @param string $assocName + * @return string + */ + function getAssociationMappedByTargetField($assocName); + + /** + * Return the identifier of this object as an array with field name as key. + * + * Has to return an empty array if no identifier isset. + * + * @param object $object + * @return array + */ + function getIdentifierValues($object); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php new file mode 100644 index 00000000..bf27ba9a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php @@ -0,0 +1,74 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ClassMetadataFactory +{ + /** + * Forces the factory to load the metadata of all classes known to the underlying + * mapping driver. + * + * @return array The ClassMetadata instances of all mapped classes. + */ + function getAllMetadata(); + + /** + * Gets the class metadata descriptor for a class. + * + * @param string $className The name of the class. + * @return ClassMetadata + */ + function getMetadataFor($className); + + /** + * Checks whether the factory has the metadata for a class loaded already. + * + * @param string $className + * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. + */ + function hasMetadataFor($className); + + /** + * Sets the metadata descriptor for a specific class. + * + * @param string $className + * @param ClassMetadata $class + */ + function setMetadataFor($className, $class); + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped directly or as a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + function isTransient($className); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php new file mode 100644 index 00000000..f52d37ee --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php @@ -0,0 +1,214 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Cache\ArrayCache, + Doctrine\Common\Annotations\AnnotationReader, + Doctrine\Common\Annotations\AnnotationRegistry, + Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The AnnotationDriver reads the mapping metadata from docblock annotations. + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +abstract class AnnotationDriver implements MappingDriver +{ + /** + * The AnnotationReader. + * + * @var AnnotationReader + */ + protected $reader; + + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * The file extension of mapping documents. + * + * @var string + */ + protected $fileExtension = '.php'; + + /** + * Cache for AnnotationDriver#getAllClassNames() + * + * @var array + */ + protected $classNames; + + /** + * Name of the entity annotations as keys + * + * @var array + */ + protected $entityAnnotationClasses = array(); + + /** + * Initializes a new AnnotationDriver that uses the given AnnotationReader for reading + * docblock annotations. + * + * @param AnnotationReader $reader The AnnotationReader to use, duck-typed. + * @param string|array $paths One or multiple paths where mapping classes can be found. + */ + public function __construct($reader, $paths = null) + { + $this->reader = $reader; + if ($paths) { + $this->addPaths((array) $paths); + } + } + + /** + * Append lookup paths to metadata driver. + * + * @param array $paths + */ + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * Retrieve the defined metadata lookup paths. + * + * @return array + */ + public function getPaths() + { + return $this->paths; + } + + /** + * Retrieve the current annotation reader + * + * @return AnnotationReader + */ + public function getReader() + { + return $this->reader; + } + + /** + * Get the file extension used to look for mapping files under + * + * @return void + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * Whether the class with the specified name is transient. Only non-transient + * classes, that is entities and mapped superclasses, should have their metadata loaded. + * + * A class is non-transient if it is annotated with an annotation + * from the {@see AnnotationDriver::entityAnnotationClasses}. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + $classAnnotations = $this->reader->getClassAnnotations(new \ReflectionClass($className)); + + foreach ($classAnnotations as $annot) { + if (isset($this->entityAnnotationClasses[get_class($annot)])) { + return false; + } + } + return true; + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames() + { + if ($this->classNames !== null) { + return $this->classNames; + } + + if (!$this->paths) { + throw MappingException::pathRequired(); + } + + $classes = array(); + $includedFiles = array(); + + foreach ($this->paths as $path) { + if ( ! is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RegexIterator( + new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS), + \RecursiveIteratorIterator::LEAVES_ONLY + ), + '/^.+' . str_replace('.', '\.', $this->fileExtension) . '$/i', + \RecursiveRegexIterator::GET_MATCH + ); + + foreach ($iterator as $file) { + $sourceFile = realpath($file[0]); + + require_once $sourceFile; + + $includedFiles[] = $sourceFile; + } + } + + $declared = get_declared_classes(); + + foreach ($declared as $className) { + $rc = new \ReflectionClass($className); + $sourceFile = $rc->getFileName(); + if (in_array($sourceFile, $includedFiles) && ! $this->isTransient($className)) { + $classes[] = $className; + } + } + + $this->classNames = $classes; + + return $classes; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php new file mode 100644 index 00000000..efaf545e --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php @@ -0,0 +1,169 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * Locate the file that contains the metadata information for a given class name. + * + * This behavior is inpependent of the actual content of the file. It just detects + * the file which is responsible for the given class name. + * + * @author Benjamin Eberlei + * @author Johannes M. Schmitt + */ +class DefaultFileLocator implements FileLocator +{ + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * The file extension of mapping documents. + * + * @var string + */ + protected $fileExtension; + + /** + * Initializes a new FileDriver that looks in the given path(s) for mapping + * documents and operates in the specified operating mode. + * + * @param string|array $paths One or multiple paths where mapping documents can be found. + */ + public function __construct($paths, $fileExtension = null) + { + $this->addPaths((array) $paths); + $this->fileExtension = $fileExtension; + } + + /** + * Append lookup paths to metadata driver. + * + * @param array $paths + */ + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * Retrieve the defined metadata lookup paths. + * + * @return array + */ + public function getPaths() + { + return $this->paths; + } + + /** + * Get the file extension used to look for mapping files under + * + * @return void + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * {@inheritDoc} + */ + public function findMappingFile($className) + { + $fileName = str_replace('\\', '.', $className) . $this->fileExtension; + + // Check whether file exists + foreach ($this->paths as $path) { + if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { + return $path . DIRECTORY_SEPARATOR . $fileName; + } + } + + throw MappingException::mappingFileNotFound($className, $fileName); + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames($globalBasename) + { + $classes = array(); + + if ($this->paths) { + foreach ($this->paths as $path) { + if ( ! is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + $fileName = $file->getBasename($this->fileExtension); + + if ($fileName == $file->getBasename() || $fileName == $globalBasename) { + continue; + } + + // NOTE: All files found here means classes are not transient! + $classes[] = str_replace('.', '\\', $fileName); + } + } + } + + return $classes; + } + + /** + * {@inheritDoc} + */ + public function fileExists($className) + { + $fileName = str_replace('\\', '.', $className) . $this->fileExtension; + + // Check whether file exists + foreach ((array) $this->paths as $path) { + if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php new file mode 100644 index 00000000..22cf117d --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php @@ -0,0 +1,178 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * Base driver for file-based metadata drivers. + * + * A file driver operates in a mode where it loads the mapping files of individual + * classes on demand. This requires the user to adhere to the convention of 1 mapping + * file per class and the file names of the mapping files must correspond to the full + * class name, including namespace, with the namespace delimiters '\', replaced by dots '.'. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.com + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +abstract class FileDriver implements MappingDriver +{ + /** + * @var FileLocator + */ + protected $locator; + + /** + * @var array + */ + protected $classCache; + + /** + * @var string + */ + protected $globalBasename; + + /** + * Initializes a new FileDriver that looks in the given path(s) for mapping + * documents and operates in the specified operating mode. + * + * @param string|array|FileLocator $paths A FileLocator or one/multiple paths where mapping documents can be found. + * @param string $fileExtension + */ + public function __construct($locator, $fileExtension = null) + { + if ($locator instanceof FileLocator) { + $this->locator = $locator; + } else { + $this->locator = new DefaultFileLocator((array)$locator, $fileExtension); + } + } + + public function setGlobalBasename($file) + { + $this->globalBasename = $file; + } + + public function getGlobalBasename() + { + return $this->globalBasename; + } + + /** + * Get the element of schema meta data for the class from the mapping file. + * This will lazily load the mapping file if it is not loaded yet + * + * @return array $element The element of schema meta data + */ + public function getElement($className) + { + if ($this->classCache === null) { + $this->initialize(); + } + + if (isset($this->classCache[$className])) { + return $this->classCache[$className]; + } + + $result = $this->loadMappingFile($this->locator->findMappingFile($className)); + + return $result[$className]; + } + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped as an Entity or a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + if ($this->classCache === null) { + $this->initialize(); + } + + if (isset($this->classCache[$className])) { + return false; + } + + return !$this->locator->fileExists($className); + } + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + public function getAllClassNames() + { + if ($this->classCache === null) { + $this->initialize(); + } + + $classNames = (array)$this->locator->getAllClassNames($this->globalBasename); + if ($this->classCache) { + $classNames = array_merge(array_keys($this->classCache), $classNames); + } + return $classNames; + } + + /** + * Loads a mapping file with the given name and returns a map + * from class/entity names to their corresponding file driver elements. + * + * @param string $file The mapping file to load. + * @return array + */ + abstract protected function loadMappingFile($file); + + /** + * Initialize the class cache from all the global files. + * + * Using this feature adds a substantial performance hit to file drivers as + * more metadata has to be loaded into memory than might actually be + * necessary. This may not be relevant to scenarios where caching of + * metadata is in place, however hits very hard in scenarios where no + * caching is used. + * + * @return void + */ + protected function initialize() + { + $this->classCache = array(); + if (null !== $this->globalBasename) { + foreach ($this->locator->getPaths() as $path) { + $file = $path.'/'.$this->globalBasename.$this->locator->getFileExtension(); + if (is_file($file)) { + $this->classCache = array_merge( + $this->classCache, + $this->loadMappingFile($file) + ); + } + } + } + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php new file mode 100644 index 00000000..a1019d71 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php @@ -0,0 +1,69 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +/** + * Locate the file that contains the metadata information for a given class name. + * + * This behavior is inpependent of the actual content of the file. It just detects + * the file which is responsible for the given class name. + * + * @author Benjamin Eberlei + * @author Johannes M. Schmitt + */ +interface FileLocator +{ + /** + * Locate mapping file for the given class name. + * + * @param string $className + * @return string + */ + function findMappingFile($className); + + /** + * Get all class names that are found with this file locator. + * + * @param string $globalBasename Passed to allow excluding the basename + * @return array + */ + function getAllClassNames($globalBasename); + + /** + * Check if a file can be found for this class name. + * + * @return bool + */ + function fileExists($className); + + /** + * Get all the paths that this file locator looks for mapping files. + * + * @return array + */ + function getPaths(); + + /** + * Get the file extension that mapping files are suffixed with. + * + * @return string + */ + function getFileExtension(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php new file mode 100644 index 00000000..c050d323 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php @@ -0,0 +1,56 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Contract for metadata drivers. + * + * @since 2.2 + * @author Jonathan H. Wage + */ +interface MappingDriver +{ + /** + * Loads the metadata for the specified class into the provided container. + * + * @param string $className + * @param ClassMetadata $metadata + */ + function loadMetadataForClass($className, ClassMetadata $metadata); + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + function getAllClassNames(); + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped as an Entity or a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + function isTransient($className); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php new file mode 100644 index 00000000..c7c14527 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php @@ -0,0 +1,125 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\Driver\MappingDriver, + Doctrine\Common\Persistence\Mapping\ClassMetadata, + Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The DriverChain allows you to add multiple other mapping drivers for + * certain namespaces + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class MappingDriverChain implements MappingDriver +{ + /** + * @var array + */ + private $drivers = array(); + + /** + * Add a nested driver. + * + * @param Driver $nestedDriver + * @param string $namespace + */ + public function addDriver(MappingDriver $nestedDriver, $namespace) + { + $this->drivers[$namespace] = $nestedDriver; + } + + /** + * Get the array of nested drivers. + * + * @return array $drivers + */ + public function getDrivers() + { + return $this->drivers; + } + + /** + * Loads the metadata for the specified class into the provided container. + * + * @param string $className + * @param ClassMetadataInfo $metadata + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + foreach ($this->drivers as $namespace => $driver) { + if (strpos($className, $namespace) === 0) { + $driver->loadMetadataForClass($className, $metadata); + return; + } + } + + throw MappingException::classNotFoundInNamespaces($className, array_keys($this->drivers)); + } + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + public function getAllClassNames() + { + $classNames = array(); + $driverClasses = array(); + foreach ($this->drivers AS $namespace => $driver) { + $oid = spl_object_hash($driver); + if (!isset($driverClasses[$oid])) { + $driverClasses[$oid] = $driver->getAllClassNames(); + } + + foreach ($driverClasses[$oid] AS $className) { + if (strpos($className, $namespace) === 0) { + $classNames[$className] = true; + } + } + } + return array_keys($classNames); + } + + /** + * Whether the class with the specified name should have its metadata loaded. + * + * This is only the case for non-transient classes either mapped as an Entity or MappedSuperclass. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + foreach ($this->drivers AS $namespace => $driver) { + if (strpos($className, $namespace) === 0) { + return $driver->isTransient($className); + } + } + + // class isTransient, i.e. not an entity or mapped superclass + return true; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php new file mode 100644 index 00000000..7751dae3 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * The PHPDriver includes php files which just populate ClassMetadataInfo + * instances with plain php code + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class PHPDriver extends FileDriver +{ + /** + * {@inheritdoc} + */ + protected $metadata; + + /** + * {@inheritDoc} + */ + public function __construct($locator, $fileExtension = null) + { + $fileExtension = ".php"; + parent::__construct($locator, $fileExtension); + } + + /** + * {@inheritdoc} + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + $this->metadata = $metadata; + $this->loadMappingFile($this->locator->findMappingFile($className)); + } + + /** + * {@inheritdoc} + */ + protected function loadMappingFile($file) + { + $metadata = $this->metadata; + include $file; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php new file mode 100644 index 00000000..9103ed86 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php @@ -0,0 +1,131 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The StaticPHPDriver calls a static loadMetadata() method on your entity + * classes where you can manually populate the ClassMetadata instance. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class StaticPHPDriver implements MappingDriver +{ + /** + * Paths of entity directories. + * + * @var array + */ + private $paths = array(); + + /** + * Map of all class names. + * + * @var array + */ + private $classNames; + + public function __construct($paths) + { + $this->addPaths((array) $paths); + } + + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * {@inheritdoc} + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + $className::loadMetadata($metadata); + } + + /** + * {@inheritDoc} + * @todo Same code exists in AnnotationDriver, should we re-use it somehow or not worry about it? + */ + public function getAllClassNames() + { + if ($this->classNames !== null) { + return $this->classNames; + } + + if (!$this->paths) { + throw MappingException::pathRequired(); + } + + $classes = array(); + $includedFiles = array(); + + foreach ($this->paths as $path) { + if (!is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + if ($file->getBasename('.php') == $file->getBasename()) { + continue; + } + + $sourceFile = realpath($file->getPathName()); + require_once $sourceFile; + $includedFiles[] = $sourceFile; + } + } + + $declared = get_declared_classes(); + + foreach ($declared as $className) { + $rc = new \ReflectionClass($className); + $sourceFile = $rc->getFileName(); + if (in_array($sourceFile, $includedFiles) && !$this->isTransient($className)) { + $classes[] = $className; + } + } + + $this->classNames = $classes; + + return $classes; + } + + /** + * {@inheritdoc} + */ + public function isTransient($className) + { + return ! method_exists($className, 'loadMetadata'); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php new file mode 100644 index 00000000..d338cf60 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php @@ -0,0 +1,198 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The Symfony File Locator makes a simplifying assumptions compared + * to the DefaultFileLocator. By assuming paths only contain entities of a certain + * namespace the mapping files consists of the short classname only. + * + * @author Fabien Potencier + * @author Benjamin Eberlei + * @license MIT + */ +class SymfonyFileLocator implements FileLocator +{ + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * A map of mapping directory path to namespace prefix used to expand class shortnames. + * + * @var array + */ + protected $prefixes = array(); + + /** + * File extension that is searched for. + * + * @var string + */ + protected $fileExtension; + + public function __construct(array $prefixes, $fileExtension = null) + { + $this->addNamespacePrefixes($prefixes); + $this->fileExtension = $fileExtension; + } + + public function addNamespacePrefixes(array $prefixes) + { + $this->prefixes = array_merge($this->prefixes, $prefixes); + $this->paths = array_merge($this->paths, array_keys($prefixes)); + } + + public function getNamespacePrefixes() + { + return $this->prefixes; + } + + /** + * {@inheritDoc} + */ + public function getPaths() + { + return $this->paths; + } + + /** + * {@inheritDoc} + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * {@inheritDoc} + */ + public function fileExists($className) + { + $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; + foreach ($this->paths as $path) { + if (!isset($this->prefixes[$path])) { + // global namespace class + if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { + return true; + } + + continue; + } + + $prefix = $this->prefixes[$path]; + + if (0 !== strpos($className, $prefix.'\\')) { + continue; + } + + $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; + return is_file($filename); + } + + return false; + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames($globalBasename = null) + { + $classes = array(); + + if ($this->paths) { + foreach ((array) $this->paths as $path) { + if (!is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + $fileName = $file->getBasename($this->fileExtension); + + if ($fileName == $file->getBasename() || $fileName == $globalBasename) { + continue; + } + + // NOTE: All files found here means classes are not transient! + if (isset($this->prefixes[$path])) { + $classes[] = $this->prefixes[$path].'\\'.str_replace('.', '\\', $fileName); + } else { + $classes[] = str_replace('.', '\\', $fileName); + } + } + } + } + + return $classes; + } + + /** + * {@inheritDoc} + */ + public function findMappingFile($className) + { + $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; + foreach ($this->paths as $path) { + if (!isset($this->prefixes[$path])) { + if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { + return $path.DIRECTORY_SEPARATOR.$defaultFileName; + } + + continue; + } + + $prefix = $this->prefixes[$path]; + + if (0 !== strpos($className, $prefix.'\\')) { + continue; + } + + $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; + if (is_file($filename)) { + return $filename; + } + + throw MappingException::mappingFileNotFound($className, $filename); + } + + throw MappingException::mappingFileNotFound($className, substr($className, strrpos($className, '\\') + 1).$this->fileExtension); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php new file mode 100644 index 00000000..4ecd2ad5 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php @@ -0,0 +1,57 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * A MappingException indicates that something is wrong with the mapping setup. + * + * @since 2.2 + */ +class MappingException extends \Exception +{ + public static function classNotFoundInNamespaces($className, $namespaces) + { + return new self("The class '" . $className . "' was not found in the ". + "chain configured namespaces " . implode(", ", $namespaces)); + } + + public static function pathRequired() + { + return new self("Specifying the paths to your entities is required ". + "in the AnnotationDriver to retrieve all class names."); + } + + public static function fileMappingDriversRequireConfiguredDirectoryPath($path = null) + { + if ( ! empty($path)) { + $path = '[' . $path . ']'; + } + + return new self( + 'File mapping drivers must have a valid directory path, ' . + 'however the given path ' . $path . ' seems to be incorrect!' + ); + } + + public static function mappingFileNotFound($entityName, $fileName) + { + return new self("No mapping file found named '$fileName' for class '$entityName'."); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php new file mode 100644 index 00000000..4e0e312f --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php @@ -0,0 +1,80 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Very simple reflection service abstraction. + * + * This is required inside metadata layers that may require either + * static or runtime reflection. + * + * @author Benjamin Eberlei + */ +interface ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + function getParentClasses($class); + + /** + * Return the shortname of a class. + * + * @param string $class + * @return string + */ + function getClassShortName($class); + + /** + * @param string $class + * @return string + */ + function getClassNamespace($class); + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + function getClass($class); + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + function getAccessibleProperty($class, $property); + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + function hasPublicMethod($class, $method); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php new file mode 100644 index 00000000..abcff581 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php @@ -0,0 +1,102 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use ReflectionClass; +use ReflectionProperty; + +/** + * PHP Runtime Reflection Service + * + * @author Benjamin Eberlei + */ +class RuntimeReflectionService implements ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + public function getParentClasses($class) + { + return class_parents($class); + } + + /** + * Return the shortname of a class. + * + * @param string $class + * @return string + */ + public function getClassShortName($class) + { + $r = new ReflectionClass($class); + return $r->getShortName(); + } + + /** + * @param string $class + * @return string + */ + public function getClassNamespace($class) + { + $r = new ReflectionClass($class); + return $r->getNamespaceName(); + } + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + public function getClass($class) + { + return new ReflectionClass($class); + } + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + public function getAccessibleProperty($class, $property) + { + $property = new ReflectionProperty($class, $property); + $property->setAccessible(true); + return $property; + } + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + public function hasPublicMethod($class, $method) + { + return method_exists($class, $method) && is_callable(array($class, $method)); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php new file mode 100644 index 00000000..2de6e761 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php @@ -0,0 +1,107 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use ReflectionClass; +use ReflectionProperty; + +/** + * PHP Runtime Reflection Service + * + * @author Benjamin Eberlei + */ +class StaticReflectionService implements ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + public function getParentClasses($class) + { + return array(); + } + + /** + * Return the shortname of a class. + * + * @param string $className + * @return string + */ + public function getClassShortName($className) + { + if (strpos($className, '\\') !== false) { + $className = substr($className, strrpos($className, "\\")+1); + } + return $className; + } + + /** + * Return the namespace of a class. + * + * @param string $className + * @return string + */ + public function getClassNamespace($className) + { + $namespace = ''; + if (strpos($className, '\\') !== false) { + $namespace = strrev(substr( strrev($className), strpos(strrev($className), '\\')+1 )); + } + return $namespace; + } + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + public function getClass($class) + { + return null; + } + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + public function getAccessibleProperty($class, $property) + { + return null; + } + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + public function hasPublicMethod($class, $method) + { + return method_exists($class, $method) && is_callable(array($class, $method)); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php new file mode 100644 index 00000000..6d70fc12 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php @@ -0,0 +1,143 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract for a Doctrine persistence layer ObjectManager class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ObjectManager +{ + /** + * Finds a object by its identifier. + * + * This is just a convenient shortcut for getRepository($className)->find($id). + * + * @param string + * @param mixed + * @return object + */ + function find($className, $id); + + /** + * Tells the ObjectManager to make an instance managed and persistent. + * + * The object will be entered into the database as a result of the flush operation. + * + * NOTE: The persist operation always considers objects that are not yet known to + * this ObjectManager as NEW. Do not pass detached objects to the persist operation. + * + * @param object $object The instance to make managed and persistent. + */ + function persist($object); + + /** + * Removes an object instance. + * + * A removed object will be removed from the database as a result of the flush operation. + * + * @param object $object The object instance to remove. + */ + function remove($object); + + /** + * Merges the state of a detached object into the persistence context + * of this ObjectManager and returns the managed copy of the object. + * The object passed to merge will not become associated/managed with this ObjectManager. + * + * @param object $object + */ + function merge($object); + + /** + * Detaches an object from the ObjectManager, causing a managed object to + * become detached. Unflushed changes made to the object if any + * (including removal of the object), will not be synchronized to the database. + * Objects which previously referenced the detached object will continue to + * reference it. + * + * @param object $object The object to detach. + */ + function detach($object); + + /** + * Refreshes the persistent state of an object from the database, + * overriding any local changes that have not yet been persisted. + * + * @param object $object The object to refresh. + */ + function refresh($object); + + /** + * Flushes all changes to objects that have been queued up to now to the database. + * This effectively synchronizes the in-memory state of managed objects with the + * database. + */ + function flush(); + + /** + * Gets the repository for a class. + * + * @param string $className + * @return \Doctrine\Common\Persistence\ObjectRepository + */ + function getRepository($className); + + /** + * Returns the ClassMetadata descriptor for a class. + * + * The class name must be the fully-qualified class name without a leading backslash + * (as it is returned by get_class($obj)). + * + * @param string $className + * @return \Doctrine\Common\Persistence\Mapping\ClassMetadata + */ + function getClassMetadata($className); + + /** + * Gets the metadata factory used to gather the metadata of classes. + * + * @return Doctrine\Common\Persistence\Mapping\ClassMetadataFactory + */ + function getMetadataFactory(); + + /** + * Helper method to initialize a lazy loading proxy or persistent collection. + * + * This method is a no-op for other objects. + * + * @param object $obj + */ + function initializeObject($obj); + + /** + * Check if the object is part of the current UnitOfWork and therefore + * managed. + * + * @param object $object + * @return bool + */ + function contains($object); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php new file mode 100644 index 00000000..015dd3dd --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php @@ -0,0 +1,49 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Makes a Persistent Objects aware of its own object-manager. + * + * Using this interface the managing object manager and class metadata instances + * are injected into the persistent object after construction. This allows + * you to implement ActiveRecord functionality on top of the persistance-ignorance + * that Doctrine propagates. + * + * Word of Warning: This is a very powerful hook to change how you can work with your domain models. + * Using this hook will break the Single Responsibility Principle inside your Domain Objects + * and increase the coupling of database and objects. + * + * Every ObjectManager has to implement this functionality itself. + * + * @author Benjamin Eberlei + */ +interface ObjectManagerAware +{ + /** + * Injects responsible ObjectManager and the ClassMetadata into this persistent object. + * + * @param ObjectManager $objectManager + * @param ClassMetadata $classMetadata + */ + public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php new file mode 100644 index 00000000..22633288 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php @@ -0,0 +1,78 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract for a Doctrine persistence layer ObjectRepository class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ObjectRepository +{ + /** + * Finds an object by its primary key / identifier. + * + * @param $id The identifier. + * @return object The object. + */ + function find($id); + + /** + * Finds all objects in the repository. + * + * @return mixed The objects. + */ + function findAll(); + + /** + * Finds objects by a set of criteria. + * + * Optionally sorting and limiting details can be passed. An implementation may throw + * an UnexpectedValueException if certain values of the sorting or limiting details are + * not supported. + * + * @throws UnexpectedValueException + * @param array $criteria + * @param array|null $orderBy + * @param int|null $limit + * @param int|null $offset + * @return mixed The objects. + */ + function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null); + + /** + * Finds a single object by a set of criteria. + * + * @param array $criteria + * @return object The object. + */ + function findOneBy(array $criteria); + + /** + * Returns the class name of the object managed by the repository + * + * @return string + */ + function getClassName(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php new file mode 100644 index 00000000..4274af62 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php @@ -0,0 +1,233 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; + +/** + * PersistentObject base class that implements getter/setter methods for all mapped fields and associations + * by overriding __call. + * + * This class is a forward compatible implementation of the PersistentObject trait. + * + * + * Limitations: + * + * 1. All persistent objects have to be associated with a single ObjectManager, multiple + * ObjectManagers are not supported. You can set the ObjectManager with `PersistentObject#setObjectManager()`. + * 2. Setters and getters only work if a ClassMetadata instance was injected into the PersistentObject. + * This is either done on `postLoad` of an object or by accessing the global object manager. + * 3. There are no hooks for setters/getters. Just implement the method yourself instead of relying on __call(). + * 4. Slower than handcoded implementations: An average of 7 method calls per access to a field and 11 for an association. + * 5. Only the inverse side associations get autoset on the owning side aswell. Setting objects on the owning side + * will not set the inverse side associations. + * + * @example + * + * PersistentObject::setObjectManager($em); + * + * class Foo extends PersistentObject + * { + * private $id; + * } + * + * $foo = new Foo(); + * $foo->getId(); // method exists through __call + * + * @author Benjamin Eberlei + */ +abstract class PersistentObject implements ObjectManagerAware +{ + /** + * @var ObjectManager + */ + private static $objectManager; + + /** + * @var ClassMetadata + */ + private $cm; + + /** + * Set the object manager responsible for all persistent object base classes. + * + * @param ObjectManager $objectManager + */ + static public function setObjectManager(ObjectManager $objectManager = null) + { + self::$objectManager = $objectManager; + } + + /** + * @return ObjectManager + */ + static public function getObjectManager() + { + return self::$objectManager; + } + + /** + * Inject Doctrine Object Manager + * + * @param ObjectManager $objectManager + * @param ClassMetadata $classMetadata + */ + public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata) + { + if ($objectManager !== self::$objectManager) { + throw new \RuntimeException("Trying to use PersistentObject with different ObjectManager instances. " . + "Was PersistentObject::setObjectManager() called?"); + } + + $this->cm = $classMetadata; + } + + /** + * Sets a persistent fields value. + * + * @throws InvalidArgumentException - When the wrong target object type is passed to an association + * @throws BadMethodCallException - When no persistent field exists by that name. + * @param string $field + * @param array $args + * @return void + */ + private function set($field, $args) + { + $this->initializeDoctrine(); + + if ($this->cm->hasField($field) && !$this->cm->isIdentifier($field)) { + $this->$field = $args[0]; + } else if ($this->cm->hasAssociation($field) && $this->cm->isSingleValuedAssociation($field)) { + $targetClass = $this->cm->getAssociationTargetClass($field); + if (!($args[0] instanceof $targetClass) && $args[0] !== null) { + throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); + } + $this->$field = $args[0]; + $this->completeOwningSide($field, $targetClass, $args[0]); + } else { + throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); + } + } + + /** + * Get persistent field value. + * + * @throws BadMethodCallException - When no persistent field exists by that name. + * @param string $field + * @return mixed + */ + private function get($field) + { + $this->initializeDoctrine(); + + if ( $this->cm->hasField($field) || $this->cm->hasAssociation($field) ) { + return $this->$field; + } else { + throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); + } + } + + /** + * If this is an inverse side association complete the owning side. + * + * @param string $field + * @param ClassMetadata $targetClass + * @param object $targetObject + */ + private function completeOwningSide($field, $targetClass, $targetObject) + { + // add this object on the owning side aswell, for obvious infinite recursion + // reasons this is only done when called on the inverse side. + if ($this->cm->isAssociationInverseSide($field)) { + $mappedByField = $this->cm->getAssociationMappedByTargetField($field); + $targetMetadata = self::$objectManager->getClassMetadata($targetClass); + + $setter = ($targetMetadata->isCollectionValuedAssociation($mappedByField) ? "add" : "set").$mappedByField; + $targetObject->$setter($this); + } + } + + /** + * Add an object to a collection + * + * @param type $field + * @param assoc $args + */ + private function add($field, $args) + { + $this->initializeDoctrine(); + + if ($this->cm->hasAssociation($field) && $this->cm->isCollectionValuedAssociation($field)) { + $targetClass = $this->cm->getAssociationTargetClass($field); + if (!($args[0] instanceof $targetClass)) { + throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); + } + if (!($this->$field instanceof Collection)) { + $this->$field = new ArrayCollection($this->$field ?: array()); + } + $this->$field->add($args[0]); + $this->completeOwningSide($field, $targetClass, $args[0]); + } else { + throw new \BadMethodCallException("There is no method add".$field."() on ".$this->cm->getName()); + } + } + + /** + * Initialize Doctrine Metadata for this class. + * + * @return void + */ + private function initializeDoctrine() + { + if ($this->cm !== null) { + return; + } + + if (!self::$objectManager) { + throw new \RuntimeException("No runtime object manager set. Call PersistentObject#setObjectManager()."); + } + + $this->cm = self::$objectManager->getClassMetadata(get_class($this)); + } + + /** + * Magic method that implements + * + * @param string $method + * @param array $args + * @return mixed + */ + public function __call($method, $args) + { + $command = substr($method, 0, 3); + $field = lcfirst(substr($method, 3)); + if ($command == "set") { + $this->set($field, $args); + } else if ($command == "get") { + return $this->get($field); + } else if ($command == "add") { + $this->add($field, $args); + } else { + throw new \BadMethodCallException("There is no method ".$method." on ".$this->cm->getName()); + } + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php new file mode 100644 index 00000000..726979fc --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php @@ -0,0 +1,60 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Interface for proxy classes. + * + * @author Roman Borschel + * @since 2.2 + */ +interface Proxy +{ + /** + * Marker for Proxy class names. + * + * @var string + */ + const MARKER = '__CG__'; + + /** + * Length of the proxy marker + * + * @var int + */ + const MARKER_LENGTH = 6; + + /** + * Initialize this proxy if its not yet initialized. + * + * Acts as a no-op if already initialized. + * + * @return void + */ + public function __load(); + + /** + * Is this proxy initialized or not. + * + * @return bool + */ + public function __isInitialized(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php b/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php new file mode 100644 index 00000000..87c5b413 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php @@ -0,0 +1,48 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Contract for classes that are potential listeners of a NotifyPropertyChanged + * implementor. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface PropertyChangedListener +{ + /** + * Notifies the listener of a property change. + * + * @param object $sender The object on which the property changed. + * @param string $propertyName The name of the property that changed. + * @param mixed $oldValue The old value of the property that changed. + * @param mixed $newValue The new value of the property that changed. + */ + function propertyChanged($sender, $propertyName, $oldValue, $newValue); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php new file mode 100644 index 00000000..c3462782 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php @@ -0,0 +1,103 @@ +. + */ + +namespace Doctrine\Common\Util; + +use Doctrine\Common\Persistence\Proxy; + +/** + * Class and reflection related functionality for objects that + * might or not be proxy objects at the moment. + * + * @author Benjamin Eberlei + * @author Johannes Schmitt + */ +class ClassUtils +{ + /** + * Get the real class name of a class name that could be a proxy. + * + * @param string + * @return string + */ + public static function getRealClass($class) + { + if (false === $pos = strrpos($class, '\\'.Proxy::MARKER.'\\')) { + return $class; + } + + return substr($class, $pos + Proxy::MARKER_LENGTH + 2); + } + + /** + * Get the real class name of an object (even if its a proxy) + * + * @param object + * @return string + */ + public static function getClass($object) + { + return self::getRealClass(get_class($object)); + } + + /** + * Get the real parent class name of a class or object + * + * @param string + * @return string + */ + public static function getParentClass($className) + { + return get_parent_class( self::getRealClass( $className ) ); + } + + /** + * Create a new reflection class + * + * @param string + * @return ReflectionClass + */ + public static function newReflectionClass($class) + { + return new \ReflectionClass( self::getRealClass( $class ) ); + } + + /** + * Create a new reflection object + * + * @param object + * @return ReflectionObject + */ + public static function newReflectionObject($object) + { + return self::newReflectionClass( self::getClass( $object ) ); + } + + /** + * Given a class name and a proxy namespace return the proxy name. + * + * @param string $className + * @param string $proxyNamespace + * @return string + */ + public static function generateProxyClassName($className, $proxyNamespace) + { + return rtrim($proxyNamespace, '\\') . '\\'.Proxy::MARKER.'\\' . ltrim($className, '\\'); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php new file mode 100644 index 00000000..57ae3120 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php @@ -0,0 +1,123 @@ +. + */ + +namespace Doctrine\Common\Util; + +/** + * Static class containing most used debug methods. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Giorgio Sironi + */ +final class Debug +{ + /** + * Private constructor (prevents from instantiation) + * + */ + private function __construct() {} + + /** + * Prints a dump of the public, protected and private properties of $var. + * + * @static + * @link http://xdebug.org/ + * @param mixed $var + * @param integer $maxDepth Maximum nesting level for object properties + * @param boolean $stripTags Flag that indicate if output should strip HTML tags + */ + public static function dump($var, $maxDepth = 2, $stripTags = true) + { + ini_set('html_errors', 'On'); + + if (extension_loaded('xdebug')) { + ini_set('xdebug.var_display_max_depth', $maxDepth); + } + + $var = self::export($var, $maxDepth++); + + ob_start(); + var_dump($var); + $dump = ob_get_contents(); + ob_end_clean(); + + echo ($stripTags ? strip_tags(html_entity_decode($dump)) : $dump); + + ini_set('html_errors', 'Off'); + } + + public static function export($var, $maxDepth) + { + $return = null; + $isObj = is_object($var); + + if ($isObj && in_array('Doctrine\Common\Collections\Collection', class_implements($var))) { + $var = $var->toArray(); + } + + if ($maxDepth) { + if (is_array($var)) { + $return = array(); + + foreach ($var as $k => $v) { + $return[$k] = self::export($v, $maxDepth - 1); + } + } else if ($isObj) { + $return = new \stdclass(); + if ($var instanceof \DateTime) { + $return->__CLASS__ = "DateTime"; + $return->date = $var->format('c'); + $return->timezone = $var->getTimeZone()->getName(); + } else { + $reflClass = ClassUtils::newReflectionObject($var); + $return->__CLASS__ = ClassUtils::getClass($var); + + if ($var instanceof \Doctrine\Common\Persistence\Proxy) { + $return->__IS_PROXY__ = true; + $return->__PROXY_INITIALIZED__ = $var->__isInitialized(); + } + + foreach ($reflClass->getProperties() as $reflProperty) { + $name = $reflProperty->getName(); + + $reflProperty->setAccessible(true); + $return->$name = self::export($reflProperty->getValue($var), $maxDepth - 1); + } + } + } else { + $return = $var; + } + } else { + $return = is_object($var) ? get_class($var) + : (is_array($var) ? 'Array(' . count($var) . ')' : $var); + } + + return $return; + } + + public static function toString($obj) + { + return method_exists('__toString', $obj) ? (string) $obj : get_class($obj) . '@' . spl_object_hash($obj); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php new file mode 100644 index 00000000..ba1eb17b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php @@ -0,0 +1,72 @@ +. + */ + +namespace Doctrine\Common\Util; + +/** + * Doctrine inflector has static methods for inflecting text + * + * The methods in these classes are from several different sources collected + * across several different php projects and several different authors. The + * original author names and emails are not known + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 1.0 + * @version $Revision: 3189 $ + * @author Konsta Vesterinen + * @author Jonathan H. Wage + */ +class Inflector +{ + /** + * Convert word in to the format for a Doctrine table name. Converts 'ModelName' to 'model_name' + * + * @param string $word Word to tableize + * @return string $word Tableized word + */ + public static function tableize($word) + { + return strtolower(preg_replace('~(?<=\\w)([A-Z])~', '_$1', $word)); + } + + /** + * Convert a word in to the format for a Doctrine class name. Converts 'table_name' to 'TableName' + * + * @param string $word Word to classify + * @return string $word Classified word + */ + public static function classify($word) + { + return str_replace(" ", "", ucwords(strtr($word, "_-", " "))); + } + + /** + * Camelize a word. This uses the classify() method and turns the first character to lowercase + * + * @param string $word + * @return string $word + */ + public static function camelize($word) + { + return lcfirst(self::classify($word)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Version.php b/vendor/doctrine/common/lib/Doctrine/Common/Version.php new file mode 100644 index 00000000..7a87311f --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Version.php @@ -0,0 +1,55 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Class to store and retrieve the version of Doctrine + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class Version +{ + /** + * Current Doctrine Version + */ + const VERSION = '2.2.3'; + + /** + * Compares a Doctrine version with the current one. + * + * @param string $version Doctrine version to compare. + * @return int Returns -1 if older, 0 if it is the same, 1 if version + * passed as argument is newer. + */ + public static function compare($version) + { + $currentVersion = str_replace(' ', '', strtolower(self::VERSION)); + $version = str_replace(' ', '', $version); + + return version_compare($version, $currentVersion); + } +} diff --git a/vendor/doctrine/common/phpunit.xml.dist b/vendor/doctrine/common/phpunit.xml.dist new file mode 100644 index 00000000..b9d3b340 --- /dev/null +++ b/vendor/doctrine/common/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + ./tests/Doctrine/ + + + + + + ./lib/Doctrine/ + + + + + + performance + + + diff --git a/vendor/doctrine/common/tests/.gitignore b/vendor/doctrine/common/tests/.gitignore new file mode 100644 index 00000000..72104052 --- /dev/null +++ b/vendor/doctrine/common/tests/.gitignore @@ -0,0 +1,3 @@ +Doctrine/Tests/Proxies/ +Doctrine/Tests/ORM/Proxy/generated/ +Doctrine/Tests/ORM/Tools/Export/export diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php new file mode 100644 index 00000000..0a329a3c --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php @@ -0,0 +1,538 @@ +getReader(); + + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\DummyClass'); + $this->assertEquals(1, count($reader->getClassAnnotations($class))); + $this->assertInstanceOf($annotName = 'Doctrine\Tests\Common\Annotations\DummyAnnotation', $annot = $reader->getClassAnnotation($class, $annotName)); + $this->assertEquals("hello", $annot->dummyValue); + + $field1Prop = $class->getProperty('field1'); + $propAnnots = $reader->getPropertyAnnotations($field1Prop); + $this->assertEquals(1, count($propAnnots)); + $this->assertInstanceOf($annotName, $annot = $reader->getPropertyAnnotation($field1Prop, $annotName)); + $this->assertEquals("fieldHello", $annot->dummyValue); + + $getField1Method = $class->getMethod('getField1'); + $methodAnnots = $reader->getMethodAnnotations($getField1Method); + $this->assertEquals(1, count($methodAnnots)); + $this->assertInstanceOf($annotName, $annot = $reader->getMethodAnnotation($getField1Method, $annotName)); + $this->assertEquals(array(1, 2, "three"), $annot->value); + + $field2Prop = $class->getProperty('field2'); + $propAnnots = $reader->getPropertyAnnotations($field2Prop); + $this->assertEquals(1, count($propAnnots)); + $this->assertInstanceOf($annotName = 'Doctrine\Tests\Common\Annotations\DummyJoinTable', $joinTableAnnot = $reader->getPropertyAnnotation($field2Prop, $annotName)); + $this->assertEquals(1, count($joinTableAnnot->joinColumns)); + $this->assertEquals(1, count($joinTableAnnot->inverseJoinColumns)); + $this->assertTrue($joinTableAnnot->joinColumns[0] instanceof DummyJoinColumn); + $this->assertTrue($joinTableAnnot->inverseJoinColumns[0] instanceof DummyJoinColumn); + $this->assertEquals('col1', $joinTableAnnot->joinColumns[0]->name); + $this->assertEquals('col2', $joinTableAnnot->joinColumns[0]->referencedColumnName); + $this->assertEquals('col3', $joinTableAnnot->inverseJoinColumns[0]->name); + $this->assertEquals('col4', $joinTableAnnot->inverseJoinColumns[0]->referencedColumnName); + + $dummyAnnot = $reader->getMethodAnnotation($class->getMethod('getField1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('', $dummyAnnot->dummyValue); + $this->assertEquals(array(1, 2, 'three'), $dummyAnnot->value); + + $dummyAnnot = $reader->getPropertyAnnotation($class->getProperty('field1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('fieldHello', $dummyAnnot->dummyValue); + + $classAnnot = $reader->getClassAnnotation($class, 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('hello', $classAnnot->dummyValue); + } + + public function testAnnotationsWithValidTargets() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithValidAnnotationTarget'); + + $this->assertEquals(1,count($reader->getClassAnnotations($class))); + $this->assertEquals(1,count($reader->getPropertyAnnotations($class->getProperty('foo')))); + $this->assertEquals(1,count($reader->getMethodAnnotations($class->getMethod('someFunction')))); + $this->assertEquals(1,count($reader->getPropertyAnnotations($class->getProperty('nested')))); + } + + public function testAnnotationsWithVarType() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $this->assertEquals(1,count($fooAnnot = $reader->getPropertyAnnotations($class->getProperty('foo')))); + $this->assertEquals(1,count($barAnnot = $reader->getMethodAnnotations($class->getMethod('bar')))); + + $this->assertInternalType('string', $fooAnnot[0]->string); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', $barAnnot[0]->annotation); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetPropertyMethod is not allowed to be declared on class Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass. You may only use this annotation on these code elements: METHOD, PROPERTY + */ + public function testClassWithInvalidAnnotationTargetAtClassDocBlock() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetClass is not allowed to be declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty::$foo. You may only use this annotation on these code elements: CLASS + */ + public function testClassWithInvalidAnnotationTargetAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty', 'foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetAnnotation is not allowed to be declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty::$bar. You may only use this annotation on these code elements: ANNOTATION + */ + public function testClassWithInvalidNestedAnnotationTargetAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty', 'bar')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetClass is not allowed to be declared on method Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod::functionName(). You may only use this annotation on these code elements: CLASS + */ + public function testClassWithInvalidAnnotationTargetAtMethodDocBlock() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod', 'functionName')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtClassDocBlock() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError','foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtMethodDocBlock() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError','bar')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Type Error] Attribute "string" of @AnnotationWithVarType declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType::$invalidProperty expects a(n) string, but got integer. + */ + public function testClassWithPropertyInvalidVarTypeError() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $reader->getPropertyAnnotations($class->getProperty('invalidProperty')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Type Error] Attribute "annotation" of @AnnotationWithVarType declared on method Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType::invalidMethod() expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll, but got an instance of Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. + */ + public function testClassWithMethodInvalidVarTypeError() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $reader->getMethodAnnotations($class->getMethod('invalidMethod')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in class Doctrine\Tests\Common\Annotations\DummyClassSyntaxError. + */ + public function testClassSyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\DummyClassSyntaxError')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in method Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError::foo(). + */ + public function testMethodSyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError', 'foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in property Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError::$foo. + */ + public function testPropertySyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError', 'foo')); + } + + /** + * @group regression + */ + public function testMultipleAnnotationsOnSameLine() + { + $reader = $this->getReader(); + $annots = $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClass2', 'id')); + $this->assertEquals(3, count($annots)); + } + + public function testNonAnnotationProblem() + { + $reader = $this->getReader(); + + $this->assertNotNull($annot = $reader->getPropertyAnnotation(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClassNonAnnotationProblem', 'foo'), $name = 'Doctrine\Tests\Common\Annotations\DummyAnnotation')); + $this->assertInstanceOf($name, $annot); + } + + public function testImportWithConcreteAnnotation() + { + $reader = $this->getReader(); + $property = new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestImportWithConcreteAnnotation', 'field'); + $annotations = $reader->getPropertyAnnotations($property); + $this->assertEquals(1, count($annotations)); + $this->assertNotNull($reader->getPropertyAnnotation($property, 'Doctrine\Tests\Common\Annotations\DummyAnnotation')); + } + + public function testImportWithInheritance() + { + $reader = $this->getReader(); + + $class = new TestParentClass(); + $ref = new \ReflectionClass($class); + + $childAnnotations = $reader->getPropertyAnnotations($ref->getProperty('child')); + $this->assertEquals(1, count($childAnnotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Foo\Name', reset($childAnnotations)); + + $parentAnnotations = $reader->getPropertyAnnotations($ref->getProperty('parent')); + $this->assertEquals(1, count($parentAnnotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Bar\Name', reset($parentAnnotations)); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation "@NameFoo" in property Doctrine\Tests\Common\Annotations\TestAnnotationNotImportedClass::$field was never imported. + */ + public function testImportDetectsNotImportedAnnotation() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestAnnotationNotImportedClass', 'field')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation "@Foo\Bar\Name" in property Doctrine\Tests\Common\Annotations\TestNonExistentAnnotationClass::$field was never imported. + */ + public function testImportDetectsNonExistentAnnotation() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestNonExistentAnnotationClass', 'field')); + } + + public function testTopLevelAnnotation() + { + $reader = $this->getReader(); + $annotations = $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestTopLevelAnnotationClass', 'field')); + + $this->assertEquals(1, count($annotations)); + $this->assertInstanceOf('\TopLevelAnnotation', reset($annotations)); + } + + public function testIgnoresAnnotationsNotPrefixedWithWhitespace() + { + $reader = $this->getReader(); + + $annotation = $reader->getClassAnnotation(new \ReflectionClass(new TestIgnoresNonAnnotationsClass()), 'Doctrine\Tests\Common\Annotations\Name'); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Name', $annotation); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The class "Doctrine\Tests\Common\Annotations\Fixtures\NoAnnotation" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "Doctrine\Tests\Common\Annotations\Fixtures\NoAnnotation". If it is indeed no annotation, then you need to add @IgnoreAnnotation("NoAnnotation") to the _class_ doc comment of class Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageClass. + */ + public function testErrorWhenInvalidAnnotationIsUsed() + { + $reader = $this->getReader(); + $ref = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageClass'); + $reader->getClassAnnotations($ref); + } + + public function testInvalidAnnotationUsageButIgnoredClass() + { + $reader = $this->getReader(); + $ref = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageButIgnoredClass'); + $annots = $reader->getClassAnnotations($ref); + + $this->assertEquals(2, count($annots)); + } + + /** + * @group DDC-1660 + * @group regression + */ + public function testInvalidAnnotationButIgnored() + { + $reader = $this->getReader(); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassDDC1660'); + + $this->assertTrue(class_exists('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Version')); + $this->assertCount(0, $reader->getClassAnnotations($class)); + $this->assertCount(0, $reader->getMethodAnnotations($class->getMethod('bar'))); + $this->assertCount(0, $reader->getPropertyAnnotations($class->getProperty('foo'))); + } + + abstract protected function getReader(); +} + +/** + * @parseAnnotation("var") + * @author Johannes M. Schmitt + * + */ +class TestParseAnnotationClass +{ + /** + * @var + */ + private $field; +} + +/** + * @Name + * @author Johannes M. Schmitt + */ +class TestIgnoresNonAnnotationsClass +{ +} + +class TestTopLevelAnnotationClass +{ + /** + * @\TopLevelAnnotation + */ + private $field; +} + +class TestNonExistentAnnotationClass +{ + /** + * @Foo\Bar\Name + */ + private $field; +} + +class TestAnnotationNotImportedClass +{ + /** + * @NameFoo + */ + private $field; +} + +class TestChildClass +{ + /** + * @\Doctrine\Tests\Common\Annotations\Foo\Name(name = "foo") + */ + protected $child; +} + +class TestParentClass extends TestChildClass +{ + /** + * @\Doctrine\Tests\Common\Annotations\Bar\Name(name = "bar") + */ + private $parent; +} + +class TestImportWithConcreteAnnotation +{ + /** + * @DummyAnnotation(dummyValue = "bar") + */ + private $field; +} + +/** + * A description of this class. + * + * Let's see if the parser recognizes that this @ is not really referring to an + * annotation. Also make sure that @var \ is not concated to "@var\is". + * + * @author robo + * @since 2.0 + * @DummyAnnotation(dummyValue="hello") + */ +class DummyClass { + /** + * A nice property. + * + * @var mixed + * @DummyAnnotation(dummyValue="fieldHello") + */ + private $field1; + + /** + * @DummyJoinTable(name="join_table", + * joinColumns={@DummyJoinColumn(name="col1", referencedColumnName="col2")}, + * inverseJoinColumns={ + * @DummyJoinColumn(name="col3", referencedColumnName="col4") + * }) + */ + private $field2; + + /** + * Gets the value of field1. + * + * @return mixed + * @DummyAnnotation({1,2,"three"}) + */ + public function getField1() { + } +} + +/** + * @ignoreAnnotation("var") + */ +class DummyClass2 { + /** + * @DummyId @DummyColumn(type="integer") @DummyGeneratedValue + * @var integer + */ + private $id; +} + +/** @Annotation */ +class DummyId extends \Doctrine\Common\Annotations\Annotation {} +/** @Annotation */ +class DummyColumn extends \Doctrine\Common\Annotations\Annotation { + public $type; +} +/** @Annotation */ +class DummyGeneratedValue extends \Doctrine\Common\Annotations\Annotation {} +/** @Annotation */ +class DummyAnnotation extends \Doctrine\Common\Annotations\Annotation { + public $dummyValue; +} +/** @Annotation */ +class DummyJoinColumn extends \Doctrine\Common\Annotations\Annotation { + public $name; + public $referencedColumnName; +} +/** @Annotation */ +class DummyJoinTable extends \Doctrine\Common\Annotations\Annotation { + public $name; + public $joinColumns; + public $inverseJoinColumns; +} + +/** + * @DummyAnnotation(@) + */ +class DummyClassSyntaxError +{ + +} + +class DummyClassMethodSyntaxError +{ + /** + * @DummyAnnotation(@) + */ + public function foo() + { + + } +} + +class DummyClassPropertySyntaxError +{ + /** + * @DummyAnnotation(@) + */ + public $foo; +} + +/** + * @ignoreAnnotation({"since", "var"}) + */ +class DummyClassNonAnnotationProblem +{ + /** + * @DummyAnnotation + * + * @var \Test + * @since 0.1 + */ + public $foo; +} + + +/** +* @DummyAnnotation Foo bar +*/ +class DummyClassWithEmail +{ + +} + +namespace Doctrine\Tests\Common\Annotations\Foo; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation +{ + public $name; +} + +namespace Doctrine\Tests\Common\Annotations\Bar; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation +{ + public $name; +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php new file mode 100644 index 00000000..d2cc6678 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php @@ -0,0 +1,13 @@ +getMock('Doctrine\Common\Cache\Cache'); + $cache + ->expects($this->at(0)) + ->method('fetch') + ->with($this->equalTo($cacheKey)) + ->will($this->returnValue(array())) + ; + $cache + ->expects($this->at(1)) + ->method('fetch') + ->with($this->equalTo('[C]'.$cacheKey)) + ->will($this->returnValue(time() - 10)) + ; + $cache + ->expects($this->at(2)) + ->method('save') + ->with($this->equalTo($cacheKey)) + ; + $cache + ->expects($this->at(3)) + ->method('save') + ->with($this->equalTo('[C]'.$cacheKey)) + ; + + $reader = new CachedReader(new AnnotationReader(), $cache, true); + $route = new Route(); + $route->pattern = '/someprefix'; + $this->assertEquals(array($route), $reader->getClassAnnotations(new \ReflectionClass($name))); + } + + protected function getReader() + { + $this->cache = new ArrayCache(); + return new CachedReader(new AnnotationReader(), $this->cache); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php new file mode 100644 index 00000000..cb080f08 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php @@ -0,0 +1,27 @@ +setInput("@Name"); + $this->assertNull($lexer->token); + $this->assertNull($lexer->lookahead); + + $this->assertTrue($lexer->moveNext()); + $this->assertNull($lexer->token); + $this->assertEquals('@', $lexer->lookahead['value']); + + $this->assertTrue($lexer->moveNext()); + $this->assertEquals('@', $lexer->token['value']); + $this->assertEquals('Name', $lexer->lookahead['value']); + + $this->assertFalse($lexer->moveNext()); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php new file mode 100644 index 00000000..56cae7fd --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php @@ -0,0 +1,1118 @@ +createTestParser(); + + // Nested arrays with nested annotations + $result = $parser->parse('@Name(foo={1,2, {"key"=@Name}})'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertNull($annot->value); + $this->assertEquals(3, count($annot->foo)); + $this->assertEquals(1, $annot->foo[0]); + $this->assertEquals(2, $annot->foo[1]); + $this->assertTrue(is_array($annot->foo[2])); + + $nestedArray = $annot->foo[2]; + $this->assertTrue(isset($nestedArray['key'])); + $this->assertTrue($nestedArray['key'] instanceof Name); + } + + public function testBasicAnnotations() + { + $parser = $this->createTestParser(); + + // Marker annotation + $result = $parser->parse("@Name"); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertNull($annot->value); + $this->assertNull($annot->foo); + + // Associative arrays + $result = $parser->parse('@Name(foo={"key1" = "value1"})'); + $annot = $result[0]; + $this->assertNull($annot->value); + $this->assertTrue(is_array($annot->foo)); + $this->assertTrue(isset($annot->foo['key1'])); + + // Numerical arrays + $result = $parser->parse('@Name({2="foo", 4="bar"})'); + $annot = $result[0]; + $this->assertTrue(is_array($annot->value)); + $this->assertEquals('foo', $annot->value[2]); + $this->assertEquals('bar', $annot->value[4]); + $this->assertFalse(isset($annot->value[0])); + $this->assertFalse(isset($annot->value[1])); + $this->assertFalse(isset($annot->value[3])); + + // Multiple values + $result = $parser->parse('@Name(@Name, @Name)'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertTrue(is_array($annot->value)); + $this->assertTrue($annot->value[0] instanceof Name); + $this->assertTrue($annot->value[1] instanceof Name); + + // Multiple types as values + $result = $parser->parse('@Name(foo="Bar", @Name, {"key1"="value1", "key2"="value2"})'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertTrue(is_array($annot->value)); + $this->assertTrue($annot->value[0] instanceof Name); + $this->assertTrue(is_array($annot->value[1])); + $this->assertEquals('value1', $annot->value[1]['key1']); + $this->assertEquals('value2', $annot->value[1]['key2']); + + // Complete docblock + $docblock = <<parse($docblock); + $this->assertEquals(1, count($result)); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + $this->assertNull($annot->value); + } + + public function testNamespacedAnnotations() + { + $parser = new DocParser; + $parser->setIgnoreNotImportedAnnotations(true); + + $docblock = << + * @Doctrine\Tests\Common\Annotations\Name(foo="bar") + * @ignore + */ +DOCBLOCK; + + $result = $parser->parse($docblock); + $this->assertEquals(1, count($result)); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + } + + /** + * @group debug + */ + public function testTypicalMethodDocBlock() + { + $parser = $this->createTestParser(); + + $docblock = <<parse($docblock); + $this->assertEquals(2, count($result)); + $this->assertTrue(isset($result[0])); + $this->assertTrue(isset($result[1])); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + $marker = $result[1]; + $this->assertTrue($marker instanceof Marker); + } + + + public function testAnnotationWithoutConstructor() + { + $parser = $this->createTestParser(); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertNotNull($annot); + $this->assertTrue($annot instanceof SomeAnnotationClassNameWithoutConstructor); + + $this->assertNull($annot->name); + $this->assertNotNull($annot->data); + $this->assertEquals($annot->data, "Some data"); + + + + +$docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertNotNull($annot); + $this->assertTrue($annot instanceof SomeAnnotationClassNameWithoutConstructor); + + $this->assertEquals($annot->name, "Some Name"); + $this->assertEquals($annot->data, "Some data"); + + + + +$docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->data, "Some data"); + $this->assertNull($annot->name); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertNull($annot->data); + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->data, "Some data"); + $this->assertNull($annot->name); + + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertEquals($annot->data, "Some data"); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertEquals($annot->data, "Some data"); + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $this->assertTrue($result[0] instanceof SomeAnnotationClassNameWithoutConstructorAndProperties); + } + + public function testAnnotationTarget() + { + + $parser = new DocParser; + $parser->setImports(array( + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations\Fixtures', + )); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithValidAnnotationTarget'); + + + $context = 'class ' . $class->getName(); + $docComment = $class->getDocComment(); + + $parser->setTarget(Target::TARGET_CLASS); + $this->assertNotNull($parser->parse($docComment,$context)); + + + $property = $class->getProperty('foo'); + $docComment = $property->getDocComment(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + + $parser->setTarget(Target::TARGET_PROPERTY); + $this->assertNotNull($parser->parse($docComment,$context)); + + + + $method = $class->getMethod('someFunction'); + $docComment = $property->getDocComment(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + + $parser->setTarget(Target::TARGET_METHOD); + $this->assertNotNull($parser->parse($docComment,$context)); + + + try { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass'); + $context = 'class ' . $class->getName(); + $docComment = $class->getDocComment(); + + $parser->setTarget(Target::TARGET_CLASS); + $parser->parse($class->getDocComment(),$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + + try { + + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod'); + $method = $class->getMethod('functionName'); + $docComment = $method->getDocComment(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + + $parser->setTarget(Target::TARGET_METHOD); + $parser->parse($docComment,$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + + try { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty'); + $property = $class->getProperty('foo'); + $docComment = $property->getDocComment(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + + $parser->setTarget(Target::TARGET_PROPERTY); + $parser->parse($docComment,$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + } + + public function getAnnotationVarTypeProviderValid() + { + //({attribute name}, {attribute value}) + return array( + // mixed type + array('mixed', '"String Value"'), + array('mixed', 'true'), + array('mixed', 'false'), + array('mixed', '1'), + array('mixed', '1.2'), + array('mixed', '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll'), + + // boolean type + array('boolean', 'true'), + array('boolean', 'false'), + + // alias for internal type boolean + array('bool', 'true'), + array('bool', 'false'), + + // integer type + array('integer', '0'), + array('integer', '1'), + array('integer', '123456789'), + array('integer', '9223372036854775807'), + + // alias for internal type double + array('float', '0.1'), + array('float', '1.2'), + array('float', '123.456'), + + // string type + array('string', '"String Value"'), + array('string', '"true"'), + array('string', '"123"'), + + // array type + array('array', '{@AnnotationExtendsAnnotationTargetAll}'), + array('array', '{@AnnotationExtendsAnnotationTargetAll,@AnnotationExtendsAnnotationTargetAll}'), + + array('arrayOfIntegers', '1'), + array('arrayOfIntegers', '{1}'), + array('arrayOfIntegers', '{1,2,3,4}'), + array('arrayOfAnnotations', '@AnnotationExtendsAnnotationTargetAll'), + array('arrayOfAnnotations', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll}'), + array('arrayOfAnnotations', '{@AnnotationExtendsAnnotationTargetAll, @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll}'), + + // annotation instance + array('annotation', '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll'), + array('annotation', '@AnnotationExtendsAnnotationTargetAll'), + ); + } + + public function getAnnotationVarTypeProviderInvalid() + { + //({attribute name}, {type declared type}, {attribute value} , {given type or class}) + return array( + // boolean type + array('boolean','boolean','1','integer'), + array('boolean','boolean','1.2','double'), + array('boolean','boolean','"str"','string'), + array('boolean','boolean','{1,2,3}','array'), + array('boolean','boolean','@Name', 'an instance of Doctrine\Tests\Common\Annotations\Name'), + + // alias for internal type boolean + array('bool','bool', '1','integer'), + array('bool','bool', '1.2','double'), + array('bool','bool', '"str"','string'), + array('bool','bool', '{"str"}','array'), + + // integer type + array('integer','integer', 'true','boolean'), + array('integer','integer', 'false','boolean'), + array('integer','integer', '1.2','double'), + array('integer','integer', '"str"','string'), + array('integer','integer', '{"str"}','array'), + array('integer','integer', '{1,2,3,4}','array'), + + // alias for internal type double + array('float','float', 'true','boolean'), + array('float','float', 'false','boolean'), + array('float','float', '123','integer'), + array('float','float', '"str"','string'), + array('float','float', '{"str"}','array'), + array('float','float', '{12.34}','array'), + array('float','float', '{1,2,3}','array'), + + // string type + array('string','string', 'true','boolean'), + array('string','string', 'false','boolean'), + array('string','string', '12','integer'), + array('string','string', '1.2','double'), + array('string','string', '{"str"}','array'), + array('string','string', '{1,2,3,4}','array'), + + // annotation instance + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'true','boolean'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'false','boolean'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '12','integer'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '1.2','double'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{"str"}','array'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{1,2,3,4}','array'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '@Name','an instance of Doctrine\Tests\Common\Annotations\Name'), + ); + } + + public function getAnnotationVarTypeArrayProviderInvalid() + { + //({attribute name}, {type declared type}, {attribute value} , {given type or class}) + return array( + array('arrayOfIntegers','integer', 'true','boolean'), + array('arrayOfIntegers','integer', 'false','boolean'), + array('arrayOfIntegers','integer', '{true,true}','boolean'), + array('arrayOfIntegers','integer', '{1,true}','boolean'), + array('arrayOfIntegers','integer', '{1,2,1.2}','double'), + array('arrayOfIntegers','integer', '{1,2,"str"}','string'), + + + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'true','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'false','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,true}','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,true}','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,1.2}','double'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,@AnnotationExtendsAnnotationTargetAll,"str"}','string'), + ); + } + + /** + * @dataProvider getAnnotationVarTypeProviderValid + */ + public function testAnnotationWithVarType($attribute, $value) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::$invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + $result = $parser->parse($docblock, $context); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType', $result[0]); + $this->assertNotNull($result[0]->$attribute); + } + + /** + * @dataProvider getAnnotationVarTypeProviderInvalid + */ + public function testAnnotationWithVarTypeError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType declared on property SomeClassName::invalidProperty. expects a(n) $type, but got $given.", $exc->getMessage()); + } + } + + + /** + * @dataProvider getAnnotationVarTypeArrayProviderInvalid + */ + public function testAnnotationWithVarTypeArrayError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType declared on property SomeClassName::invalidProperty. expects either a(n) $type, or an array of {$type}s, but got $given.", $exc->getMessage()); + } + } + + /** + * @dataProvider getAnnotationVarTypeProviderValid + */ + public function testAnnotationWithAttributes($attribute, $value) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::$invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + $result = $parser->parse($docblock, $context); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes', $result[0]); + $getter = "get".ucfirst($attribute); + $this->assertNotNull($result[0]->$getter()); + } + + /** + * @dataProvider getAnnotationVarTypeProviderInvalid + */ + public function testAnnotationWithAttributesError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes declared on property SomeClassName::invalidProperty. expects a(n) $type, but got $given.", $exc->getMessage()); + } + } + + + /** + * @dataProvider getAnnotationVarTypeArrayProviderInvalid + */ + public function testAnnotationWithAttributesWithVarTypeArrayError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes declared on property SomeClassName::invalidProperty. expects either a(n) $type, or an array of {$type}s, but got $given.", $exc->getMessage()); + } + } + + public function testAnnotationWithRequiredAttributes() + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $parser->setTarget(Target::TARGET_PROPERTY); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes("Some Value", annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + $result = $parser->parse($docblock); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes', $result[0]); + $this->assertEquals("Some Value",$result[0]->getValue()); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation', $result[0]->getAnnot()); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes("Some Value")'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "annot" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes declared on property SomeClassName::invalidProperty. expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. This value should not be null.', $exc->getMessage()); + } + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes(annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "value" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes declared on property SomeClassName::invalidProperty. expects a(n) string. This value should not be null.', $exc->getMessage()); + } + + } + + public function testAnnotationWithRequiredAttributesWithoutContructor() + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $parser->setTarget(Target::TARGET_PROPERTY); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor("Some Value", annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + $result = $parser->parse($docblock); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor', $result[0]); + $this->assertEquals("Some Value", $result[0]->value); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation', $result[0]->annot); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor("Some Value")'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "annot" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor declared on property SomeClassName::invalidProperty. expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. This value should not be null.', $exc->getMessage()); + } + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor(annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "value" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor declared on property SomeClassName::invalidProperty. expects a(n) string. This value should not be null.', $exc->getMessage()); + } + + } + + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation @SomeAnnotationClassNameWithoutConstructorAndProperties declared on does not accept any values, but got {"value":"Foo"}. + */ + public function testWithoutConstructorWhenIsNotDefaultValue() + { + $parser = $this->createTestParser(); + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation @SomeAnnotationClassNameWithoutConstructorAndProperties declared on does not accept any values, but got {"value":"Foo"}. + */ + public function testWithoutConstructorWhenHasNoProperties() + { + $parser = $this->createTestParser(); + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testAnnotationTargetSyntaxError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Invalid Target "Foo". Available targets: [ALL, CLASS, METHOD, PROPERTY, ANNOTATION] + */ + public function testAnnotationWithInvalidTargetDeclarationError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage @Target expects either a string value, or an array of strings, "NULL" given. + */ + public function testAnnotationWithTargetEmptyError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @group DDC-575 + */ + public function testRegressionDDC575() + { + $parser = $this->createTestParser(); + + $docblock = <<parse($docblock); + + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Name", $result[0]); + + $docblock = <<parse($docblock); + + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Name", $result[0]); + } + + /** + * @group DDC-77 + */ + public function testAnnotationWithoutClassIsIgnoredWithoutWarning() + { + $parser = new DocParser(); + $parser->setIgnoreNotImportedAnnotations(true); + $result = $parser->parse("@param"); + + $this->assertEquals(0, count($result)); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected PlainValue, got ''' at position 10. + */ + public function testAnnotationDontAcceptSingleQuotes() + { + $parser = $this->createTestParser(); + $parser->parse("@Name(foo='bar')"); + } + + /** + * @group DCOM-41 + */ + public function testAnnotationDoesntThrowExceptionWhenAtSignIsNotFollowedByIdentifier() + { + $parser = new DocParser(); + $result = $parser->parse("'@'"); + + $this->assertEquals(0, count($result)); + } + + /** + * @group DCOM-41 + * @expectedException Doctrine\Common\Annotations\AnnotationException + */ + public function testAnnotationThrowsExceptionWhenAtSignIsNotFollowedByIdentifierInNestedAnnotation() + { + $parser = new DocParser(); + $result = $parser->parse("@Doctrine\Tests\Common\Annotations\Name(@')"); + } + + /** + * @group DCOM-56 + */ + public function testAutoloadAnnotation() + { + $this->assertFalse(class_exists('Doctrine\Tests\Common\Annotations\Fixture\Annotation\Autoload', false), 'Pre-condition: Doctrine\Tests\Common\Annotations\Fixture\Annotation\Autoload not allowed to be loaded.'); + + $parser = new DocParser(); + + AnnotationRegistry::registerAutoloadNamespace('Doctrine\Tests\Common\Annotations\Fixtures\Annotation', __DIR__ . '/../../../../'); + + $parser->setImports(array( + 'autoload' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Autoload', + )); + $annotations = $parser->parse('@Autoload'); + + $this->assertEquals(1, count($annotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Autoload', $annotations[0]); + } + + public function createTestParser() + { + $parser = new DocParser(); + $parser->setIgnoreNotImportedAnnotations(true); + $parser->setImports(array( + 'name' => 'Doctrine\Tests\Common\Annotations\Name', + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations', + )); + + return $parser; + } + + /** + * @group DDC-78 + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected PlainValue, got ''' at position 10 in class \Doctrine\Tests\Common\Annotations\Name + */ + public function testSyntaxErrorWithContextDescription() + { + $parser = $this->createTestParser(); + $parser->parse("@Name(foo='bar')", "class \Doctrine\Tests\Common\Annotations\Name"); + } + + /** + * @group DDC-183 + */ + public function testSyntaxErrorWithUnknownCharacters() + { + $docblock = <<setInput(trim($docblock, '/ *')); + //var_dump($lexer); + + try { + $parser = $this->createTestParser(); + $result = $parser->parse($docblock); + } catch (Exception $e) { + $this->fail($e->getMessage()); + } + } + + /** + * @group DCOM-14 + */ + public function testIgnorePHPDocThrowTag() + { + $docblock = <<createTestParser(); + $result = $parser->parse($docblock); + } catch (Exception $e) { + $this->fail($e->getMessage()); + } + } + + /** + * @group DCOM-38 + */ + public function testCastInt() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=1234)"); + $annot = $result[0]; + $this->assertInternalType('int', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastNegativeInt() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=-1234)"); + $annot = $result[0]; + $this->assertInternalType('int', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastFloat() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastNegativeFloat() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=-1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->foo); + + $result = $parser->parse("@Marker(-1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->value); + } + + public function testReservedKeywordsInAnnotations() + { + $parser = $this->createTestParser(); + + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\True'); + $this->assertTrue($result[0] instanceof True); + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\False'); + $this->assertTrue($result[0] instanceof False); + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\Null'); + $this->assertTrue($result[0] instanceof Null); + + $result = $parser->parse('@True'); + $this->assertTrue($result[0] instanceof True); + $result = $parser->parse('@False'); + $this->assertTrue($result[0] instanceof False); + $result = $parser->parse('@Null'); + $this->assertTrue($result[0] instanceof Null); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Creation Error] The annotation @SomeAnnotationClassNameWithoutConstructor declared on some class does not have a property named "invalidaProperty". Available properties: data, name + */ + public function testSetValuesExeption() + { + $docblock = <<createTestParser()->parse($docblock, 'some class'); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Syntax Error] Expected Doctrine\Common\Annotations\DocLexer::T_IDENTIFIER or Doctrine\Common\Annotations\DocLexer::T_TRUE or Doctrine\Common\Annotations\DocLexer::T_FALSE or Doctrine\Common\Annotations\DocLexer::T_NULL, got '3.42' at position 5. + */ + public function testInvalidIdentifierInAnnotation() + { + $parser = $this->createTestParser(); + $parser->parse('@Foo\3.42'); + } + + public function testTrailingCommaIsAllowed() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Name({ + "Foo", + "Bar", + })'); + $this->assertEquals(1, count($annots)); + $this->assertEquals(array('Foo', 'Bar'), $annots[0]->value); + } + + public function testDefaultAnnotationValueIsNotOverwritten() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Doctrine\Tests\Common\Annotations\Fixtures\Annotation\AnnotWithDefaultValue'); + $this->assertEquals(1, count($annots)); + $this->assertEquals('bar', $annots[0]->foo); + } + + public function testArrayWithColon() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Name({"foo": "bar"})'); + $this->assertEquals(1, count($annots)); + $this->assertEquals(array('foo' => 'bar'), $annots[0]->value); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Syntax Error] Expected PlainValue, got 'foo:' at position 6. + */ + public function testColonNotAllowedOnTopLevel() + { + $parser = $this->createTestParser(); + $parser->parse('@Name(foo: "bar")'); + } +} + +/** @Annotation */ +class SomeAnnotationClassNameWithoutConstructor +{ + public $data; + public $name; +} + +/** @Annotation */ +class SomeAnnotationWithConstructorWithoutParams +{ + function __construct() + { + $this->data = "Some data"; + } + public $data; + public $name; +} + +/** @Annotation */ +class SomeAnnotationClassNameWithoutConstructorAndProperties{} + +/** + * @Annotation + * @Target("Foo") + */ +class AnnotationWithInvalidTargetDeclaration{} + +/** + * @Annotation + * @Target + */ +class AnnotationWithTargetEmpty{} + +/** @Annotation */ +class AnnotationExtendsAnnotationTargetAll extends \Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll +{ +} + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation { + public $foo; +} + +/** @Annotation */ +class Marker { + public $value; +} + +/** @Annotation */ +class True {} + +/** @Annotation */ +class False {} + +/** @Annotation */ +class Null {} + +namespace Doctrine\Tests\Common\Annotations\FooBar; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation { +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php new file mode 100644 index 00000000..c84344d8 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php @@ -0,0 +1,40 @@ +cacheDir = sys_get_temp_dir() . "/annotations_". uniqid(); + @mkdir($this->cacheDir); + return new FileCacheReader(new AnnotationReader(), $this->cacheDir); + } + + public function tearDown() + { + foreach (glob($this->cacheDir.'/*.php') AS $file) { + unlink($file); + } + rmdir($this->cacheDir); + } + + /** + * @group DCOM-81 + */ + public function testAttemptToCreateAnnotationCacheDir() + { + $this->cacheDir = sys_get_temp_dir() . "/not_existed_dir_". uniqid(); + + $this->assertFalse(is_dir($this->cacheDir)); + + $cache = new FileCacheReader(new AnnotationReader(), $this->cacheDir); + + $this->assertTrue(is_dir($this->cacheDir)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php new file mode 100644 index 00000000..44108e19 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php @@ -0,0 +1,10 @@ +roles = $values['value']; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php new file mode 100644 index 00000000..b507e602 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php @@ -0,0 +1,14 @@ +name = isset($values['value']) ? $values['value'] : null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php new file mode 100644 index 00000000..09ef0317 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php @@ -0,0 +1,11 @@ +"), + @Attribute("annotation", type = "Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll"), + @Attribute("arrayOfAnnotations", type = "array"), + }) + */ +final class AnnotationWithAttributes +{ + + public final function __construct(array $data) + { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + private $mixed; + private $boolean; + private $bool; + private $float; + private $string; + private $integer; + private $array; + private $annotation; + private $arrayOfIntegers; + private $arrayOfAnnotations; + + /** + * @return mixed + */ + public function getMixed() + { + return $this->mixed; + } + + /** + * @return boolean + */ + public function getBoolean() + { + return $this->boolean; + } + + /** + * @return bool + */ + public function getBool() + { + return $this->bool; + } + + /** + * @return float + */ + public function getFloat() + { + return $this->float; + } + + /** + * @return string + */ + public function getString() + { + return $this->string; + } + + public function getInteger() + { + return $this->integer; + } + + /** + * @return array + */ + public function getArray() + { + return $this->array; + } + + /** + * @return Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll + */ + public function getAnnotation() + { + return $this->annotation; + } + + /** + * @return array + */ + public function getArrayOfIntegers() + { + return $this->arrayOfIntegers; + } + + /** + * @return array + */ + public function getArrayOfAnnotations() + { + return $this->arrayOfAnnotations; + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php new file mode 100644 index 00000000..6eb1bc5a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php @@ -0,0 +1,50 @@ + $value) { + $this->$key = $value; + } + } + + /** + * @var string + */ + private $value; + + /** + * + * @var Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation + */ + private $annot; + + /** + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * @return Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation + */ + public function getAnnot() + { + return $this->annot; + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php new file mode 100644 index 00000000..bf458ee7 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php @@ -0,0 +1,24 @@ + + */ + public $arrayOfIntegers; + + /** + * @var array + */ + public $arrayOfAnnotations; + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php new file mode 100644 index 00000000..4e652e13 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php @@ -0,0 +1,30 @@ + + */ +class Controller +{ + /** + * @Route("/", name="_demo") + * @Template() + */ + public function indexAction() + { + return array(); + } + + /** + * @Route("/hello/{name}", name="_demo_hello") + * @Template() + */ + public function helloAction($name) + { + return array('name' => $name); + } + + /** + * @Route("/contact", name="_demo_contact") + * @Template() + */ + public function contactAction() + { + $form = ContactForm::create($this->get('form.context'), 'contact'); + + $form->bind($this->container->get('request'), $form); + if ($form->isValid()) { + $form->send($this->get('mailer')); + + $this->get('session')->setFlash('notice', 'Message sent!'); + + return new RedirectResponse($this->generateUrl('_demo')); + } + + return array('form' => $form); + } + + /** + * Creates the ACL for the passed object identity + * + * @param ObjectIdentityInterface $oid + * @return void + */ + private function createObjectIdentity(ObjectIdentityInterface $oid) + { + $classId = $this->createOrRetrieveClassId($oid->getType()); + + $this->connection->executeQuery($this->getInsertObjectIdentitySql($oid->getIdentifier(), $classId, true)); + } + + /** + * Returns the primary key for the passed class type. + * + * If the type does not yet exist in the database, it will be created. + * + * @param string $classType + * @return integer + */ + private function createOrRetrieveClassId($classType) + { + if (false !== $id = $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn()) { + return $id; + } + + $this->connection->executeQuery($this->getInsertClassSql($classType)); + + return $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn(); + } + + /** + * Returns the primary key for the passed security identity. + * + * If the security identity does not yet exist in the database, it will be + * created. + * + * @param SecurityIdentityInterface $sid + * @return integer + */ + private function createOrRetrieveSecurityIdentityId(SecurityIdentityInterface $sid) + { + if (false !== $id = $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn()) { + return $id; + } + + $this->connection->executeQuery($this->getInsertSecurityIdentitySql($sid)); + + return $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn(); + } + + /** + * Deletes all ACEs for the given object identity primary key. + * + * @param integer $oidPK + * @return void + */ + private function deleteAccessControlEntries($oidPK) + { + $this->connection->executeQuery($this->getDeleteAccessControlEntriesSql($oidPK)); + } + + /** + * Deletes the object identity from the database. + * + * @param integer $pk + * @return void + */ + private function deleteObjectIdentity($pk) + { + $this->connection->executeQuery($this->getDeleteObjectIdentitySql($pk)); + } + + /** + * Deletes all entries from the relations table from the database. + * + * @param integer $pk + * @return void + */ + private function deleteObjectIdentityRelations($pk) + { + $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk)); + } + + /** + * This regenerates the ancestor table which is used for fast read access. + * + * @param AclInterface $acl + * @return void + */ + private function regenerateAncestorRelations(AclInterface $acl) + { + $pk = $acl->getId(); + $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk)); + $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $pk)); + + $parentAcl = $acl->getParentAcl(); + while (null !== $parentAcl) { + $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $parentAcl->getId())); + + $parentAcl = $parentAcl->getParentAcl(); + } + } + + /** + * This processes changes on an ACE related property (classFieldAces, or objectFieldAces). + * + * @param string $name + * @param array $changes + * @return void + */ + private function updateFieldAceProperty($name, array $changes) + { + $sids = new \SplObjectStorage(); + $classIds = new \SplObjectStorage(); + $currentIds = array(); + foreach ($changes[1] as $field => $new) { + for ($i=0,$c=count($new); $i<$c; $i++) { + $ace = $new[$i]; + + if (null === $ace->getId()) { + if ($sids->contains($ace->getSecurityIdentity())) { + $sid = $sids->offsetGet($ace->getSecurityIdentity()); + } else { + $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity()); + } + + $oid = $ace->getAcl()->getObjectIdentity(); + if ($classIds->contains($oid)) { + $classId = $classIds->offsetGet($oid); + } else { + $classId = $this->createOrRetrieveClassId($oid->getType()); + } + + $objectIdentityId = $name === 'classFieldAces' ? null : $ace->getAcl()->getId(); + + $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, $field, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure())); + $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, $field, $i))->fetchColumn(); + $this->loadedAces[$aceId] = $ace; + + $aceIdProperty = new \ReflectionProperty('Symfony\Component\Security\Acl\Domain\Entry', 'id'); + $aceIdProperty->setAccessible(true); + $aceIdProperty->setValue($ace, intval($aceId)); + } else { + $currentIds[$ace->getId()] = true; + } + } + } + + foreach ($changes[0] as $old) { + for ($i=0,$c=count($old); $i<$c; $i++) { + $ace = $old[$i]; + + if (!isset($currentIds[$ace->getId()])) { + $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId())); + unset($this->loadedAces[$ace->getId()]); + } + } + } + } + + /** + * This processes changes on an ACE related property (classAces, or objectAces). + * + * @param string $name + * @param array $changes + * @return void + */ + private function updateAceProperty($name, array $changes) + { + list($old, $new) = $changes; + + $sids = new \SplObjectStorage(); + $classIds = new \SplObjectStorage(); + $currentIds = array(); + for ($i=0,$c=count($new); $i<$c; $i++) { + $ace = $new[$i]; + + if (null === $ace->getId()) { + if ($sids->contains($ace->getSecurityIdentity())) { + $sid = $sids->offsetGet($ace->getSecurityIdentity()); + } else { + $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity()); + } + + $oid = $ace->getAcl()->getObjectIdentity(); + if ($classIds->contains($oid)) { + $classId = $classIds->offsetGet($oid); + } else { + $classId = $this->createOrRetrieveClassId($oid->getType()); + } + + $objectIdentityId = $name === 'classAces' ? null : $ace->getAcl()->getId(); + + $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, null, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure())); + $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, null, $i))->fetchColumn(); + $this->loadedAces[$aceId] = $ace; + + $aceIdProperty = new \ReflectionProperty($ace, 'id'); + $aceIdProperty->setAccessible(true); + $aceIdProperty->setValue($ace, intval($aceId)); + } else { + $currentIds[$ace->getId()] = true; + } + } + + for ($i=0,$c=count($old); $i<$c; $i++) { + $ace = $old[$i]; + + if (!isset($currentIds[$ace->getId()])) { + $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId())); + unset($this->loadedAces[$ace->getId()]); + } + } + } + + /** + * Persists the changes which were made to ACEs to the database. + * + * @param \SplObjectStorage $aces + * @return void + */ + private function updateAces(\SplObjectStorage $aces) + { + foreach ($aces as $ace) { + $propertyChanges = $aces->offsetGet($ace); + $sets = array(); + + if (isset($propertyChanges['mask'])) { + $sets[] = sprintf('mask = %d', $propertyChanges['mask'][1]); + } + if (isset($propertyChanges['strategy'])) { + $sets[] = sprintf('granting_strategy = %s', $this->connection->quote($propertyChanges['strategy'])); + } + if (isset($propertyChanges['aceOrder'])) { + $sets[] = sprintf('ace_order = %d', $propertyChanges['aceOrder'][1]); + } + if (isset($propertyChanges['auditSuccess'])) { + $sets[] = sprintf('audit_success = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditSuccess'][1])); + } + if (isset($propertyChanges['auditFailure'])) { + $sets[] = sprintf('audit_failure = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditFailure'][1])); + } + + $this->connection->executeQuery($this->getUpdateAccessControlEntrySql($ace->getId(), $sets)); + } + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php new file mode 100644 index 00000000..bda2cc21 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php @@ -0,0 +1,15 @@ +test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test2() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test3() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test4() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test5() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test6() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test7() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test8() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test9() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test10() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test11() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test12() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test13() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test14() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test15() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test16() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test17() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test18() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test19() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test20() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test21() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test22() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test23() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test24() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test25() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test26() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test27() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test28() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test29() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test30() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test31() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test32() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test33() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test34() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test35() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test36() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test37() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test38() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test39() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php new file mode 100644 index 00000000..1dae104a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php @@ -0,0 +1,5 @@ +test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test2() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test3() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test4() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test5() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test6() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test7() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test8() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test9() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test10() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test11() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test12() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test13() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test14() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test15() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test16() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test17() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test18() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test19() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test20() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test21() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test22() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test23() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test24() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test25() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test26() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test27() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test28() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test29() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test30() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test31() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test32() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test33() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test34() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test35() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test36() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test37() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test38() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test39() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php new file mode 100644 index 00000000..58c5e6af --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php @@ -0,0 +1,13 @@ +getMethod(); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $reader->getMethodAnnotations($method); + } + $time = microtime(true) - $time; + + $this->printResults('cached reader (in-memory)', $time, $c); + } + + /** + * @group performance + */ + public function testCachedReadPerformanceWithFileCache() + { + $method = $this->getMethod(); + + // prime cache + $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir()); + $reader->getMethodAnnotations($method); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir()); + $reader->getMethodAnnotations($method); + clearstatcache(); + } + $time = microtime(true) - $time; + + $this->printResults('cached reader (file)', $time, $c); + } + + /** + * @group performance + */ + public function testReadPerformance() + { + $method = $this->getMethod(); + + $time = microtime(true); + for ($i=0,$c=150; $i<$c; $i++) { + $reader = new AnnotationReader(); + $reader->getMethodAnnotations($method); + } + $time = microtime(true) - $time; + + $this->printResults('reader', $time, $c); + } + + /** + * @group performance + */ + public function testDocParsePerformance() + { + $imports = array( + 'ignorephpdoc' => 'Annotations\Annotation\IgnorePhpDoc', + 'ignoreannotation' => 'Annotations\Annotation\IgnoreAnnotation', + 'route' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Route', + 'template' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Template', + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations\Fixtures', + ); + $ignored = array( + 'access', 'author', 'copyright', 'deprecated', 'example', 'ignore', + 'internal', 'link', 'see', 'since', 'tutorial', 'version', 'package', + 'subpackage', 'name', 'global', 'param', 'return', 'staticvar', + 'static', 'var', 'throws', 'inheritdoc', + ); + + $method = $this->getMethod(); + $methodComment = $method->getDocComment(); + $classComment = $method->getDeclaringClass()->getDocComment(); + + $time = microtime(true); + for ($i=0,$c=200; $i<$c; $i++) { + $parser = new DocParser(); + $parser->setImports($imports); + $parser->setIgnoredAnnotationNames($ignored); + $parser->setIgnoreNotImportedAnnotations(true); + + $parser->parse($methodComment); + $parser->parse($classComment); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser', $time, $c); + } + + /** + * @group performance + */ + public function testDocLexerPerformance() + { + $method = $this->getMethod(); + $methodComment = $method->getDocComment(); + $classComment = $method->getDeclaringClass()->getDocComment(); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $lexer = new DocLexer(); + $lexer->setInput($methodComment); + $lexer->setInput($classComment); + } + $time = microtime(true) - $time; + + $this->printResults('doc-lexer', $time, $c); + } + + /** + * @group performance + */ + public function testPhpParserPerformanceWithShortCut() + { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\NamespacedSingleClassLOC1000'); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $parser = new PhpParser(); + $parser->parseClass($class); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser-with-short-cut', $time, $c); + } + + /** + * @group performance + */ + public function testPhpParserPerformanceWithoutShortCut() + { + $class = new \ReflectionClass('SingleClassLOC1000'); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $parser = new PhpParser(); + $parser->parseClass($class); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser-without-short-cut', $time, $c); + } + + private function getMethod() + { + return new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\Controller', 'helloAction'); + } + + private function printResults($test, $time, $iterations) + { + if (0 == $iterations) { + throw new \InvalidArgumentException('$iterations cannot be zero.'); + } + + $title = $test." results:\n"; + $iterationsText = sprintf("Iterations: %d\n", $iterations); + $totalTime = sprintf("Total Time: %.3f s\n", $time); + $iterationTime = sprintf("Time per iteration: %.3f ms\n", $time/$iterations * 1000); + + $max = max(strlen($title), strlen($iterationTime)) - 1; + + echo "\n".str_repeat('-', $max)."\n"; + echo $title; + echo str_repeat('=', $max)."\n"; + echo $iterationsText; + echo $totalTime; + echo $iterationTime; + echo str_repeat('-', $max)."\n"; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php new file mode 100644 index 00000000..8de4aabf --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php @@ -0,0 +1,179 @@ +assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testParseClassWithMultipleImportsInUseStatement() + { + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\MultipleImportsInUseStatement'); + $parser = new PhpParser(); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testParseClassWhenNotUserDefined() + { + $parser = new PhpParser(); + $this->assertEquals(array(), $parser->parseClass(new \ReflectionClass('\stdClass'))); + } + + public function testParseClassWhenClassIsNotNamespaced() + { + $parser = new PhpParser(); + $class = new ReflectionClass('\AnnotationsTestsFixturesNonNamespacedClass'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testParseClassWhenClassIsInterface() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\TestInterface'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testClassWithFullyQualifiedUseStatements() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\ClassWithFullyQualifiedUseStatements'); + + $this->assertEquals(array( + 'secure' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testNamespaceAndClassCommentedOut() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceAndClassCommentedOut'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testEqualNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\EqualNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + ), $parser->parseClass($class)); + } + + public function testEqualNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\EqualNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testDifferentNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\DifferentNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testDifferentNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\DifferentNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testGlobalNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new \ReflectionClass('\GlobalNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + ), $parser->parseClass($class)); + } + + public function testGlobalNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass('\GlobalNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testNamespaceWithClosureDeclaration() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceWithClosureDeclaration'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testIfPointerResetsOnMultipleParsingTries() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceWithClosureDeclaration'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php new file mode 100644 index 00000000..376539ff --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php @@ -0,0 +1,97 @@ +getReader(); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassDDC1660'); + + $this->assertTrue(class_exists('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Version')); + $this->assertCount(1, $reader->getClassAnnotations($class)); + $this->assertCount(1, $reader->getMethodAnnotations($class->getMethod('bar'))); + $this->assertCount(1, $reader->getPropertyAnnotations($class->getProperty('foo'))); + } + + protected function getReader() + { + $reader = new SimpleAnnotationReader(); + $reader->addNamespace(__NAMESPACE__); + $reader->addNamespace(__NAMESPACE__ . '\Fixtures'); + $reader->addNamespace(__NAMESPACE__ . '\Fixtures\Annotation'); + + return $reader; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php new file mode 100644 index 00000000..a7b9e2f2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php @@ -0,0 +1,65 @@ +getClassAnnotations($class); + } + + public function testAnnotation() + { + $class = new \ReflectionClass(__NAMESPACE__ . '\\DCOM55Consumer'); + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $annots = $reader->getClassAnnotations($class); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf(__NAMESPACE__.'\\DCOM55Annotation', $annots[0]); + } + + public function testParseAnnotationDocblocks() + { + $class = new \ReflectionClass(__NAMESPACE__ . '\\DCOM55Annotation'); + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $annots = $reader->getClassAnnotations($class); + + $this->assertEquals(0, count($annots)); + } +} + +/** + * @Controller + */ +class Dummy +{ + +} + +/** + * @Annotation + */ +class DCOM55Annotation +{ + +} + +/** + * @DCOM55Annotation + */ +class DCOM55Consumer +{ + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php new file mode 100644 index 00000000..708bcc99 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php @@ -0,0 +1,8 @@ +getClassAnnotations(new \ReflectionClass(__NAMESPACE__."\MappedClass")); + + foreach ($result as $annot) { + $classAnnotations[get_class($annot)] = $annot; + } + + $this->assertTrue(!isset($classAnnotations['']), 'Class "xxx" is not a valid entity or mapped super class.'); + } + + public function testIssueGlobalNamespace() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->setImports(array( + "__NAMESPACE__" =>"Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping" + )); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + + public function testIssueNamespaces() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM"); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Entity", $annots[0]); + } + + public function testIssueMultipleNamespaces() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping"); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM"); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + + public function testIssueWithNamespacesOrImports() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Entity", $annots[0]); + $this->assertEquals(1, count($annots)); + } + + + public function testIssueSimpleAnnotationReader() + { + $reader = new \Doctrine\Common\Annotations\SimpleAnnotationReader(); + $reader->addNamespace('Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping'); + $annots = $reader->getClassAnnotations(new \ReflectionClass(__NAMESPACE__."\MappedClass")); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + +} + +/** + * @Entity + */ +class MappedClass +{ + +} + + +namespace Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping; +/** +* @Annotation +*/ +class Entity +{ + +} + +namespace Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM; +/** +* @Annotation +*/ +class Entity +{ + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php new file mode 100644 index 00000000..ff3ca376 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php @@ -0,0 +1,8 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of APC'); + } + } + + protected function _getCacheDriver() + { + return new ApcCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php new file mode 100644 index 00000000..71927174 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php @@ -0,0 +1,13 @@ +_getCacheDriver(); + + // Test save + $cache->save('test_key', 'testing this out'); + + // Test contains to test that save() worked + $this->assertTrue($cache->contains('test_key')); + + // Test fetch + $this->assertEquals('testing this out', $cache->fetch('test_key')); + + // Test delete + $cache->save('test_key2', 'test2'); + $cache->delete('test_key2'); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testDeleteAll() + { + $cache = $this->_getCacheDriver(); + $cache->save('test_key1', '1'); + $cache->save('test_key2', '2'); + $cache->deleteAll(); + + $this->assertFalse($cache->contains('test_key1')); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testFlushAll() + { + $cache = $this->_getCacheDriver(); + $cache->save('test_key1', '1'); + $cache->save('test_key2', '2'); + $cache->flushAll(); + + $this->assertFalse($cache->contains('test_key1')); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testNamespace() + { + $cache = $this->_getCacheDriver(); + $cache->setNamespace('test_'); + $cache->save('key1', 'test'); + + $this->assertTrue($cache->contains('key1')); + + $cache->setNamespace('test2_'); + + $this->assertFalse($cache->contains('key1')); + } + + /** + * @group DCOM-43 + */ + public function testGetStats() + { + if ($this instanceof ArrayCacheTest || $this instanceof ZendDataCacheTest ) { + $this->markTestSkipped("Statistics are not available for this driver"); + } + + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + + $this->assertArrayHasKey(Cache::STATS_HITS, $stats); + $this->assertArrayHasKey(Cache::STATS_MISSES, $stats); + $this->assertArrayHasKey(Cache::STATS_UPTIME, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_USAGE, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_AVAILIABLE, $stats); + } + + /** + * @return \Doctrine\Common\Cache\CacheProvider + */ + abstract protected function _getCacheDriver(); +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php new file mode 100644 index 00000000..362ff69a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php @@ -0,0 +1,38 @@ +_memcache = new \Memcache; + $ok = @$this->_memcache->connect('localhost', 11211); + if (!$ok) { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } else { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } + + public function testNoExpire() { + $cache = $this->_getCacheDriver(); + $cache->save('noexpire', 'value', 0); + sleep(1); + $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire'); + } + + protected function _getCacheDriver() + { + $driver = new MemcacheCache(); + $driver->setMemcache($this->_memcache); + return $driver; + } + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php new file mode 100644 index 00000000..947ba752 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php @@ -0,0 +1,40 @@ +memcached = new \Memcached(); + $this->memcached->setOption(\Memcached::OPT_COMPRESSION, false); + $this->memcached->addServer('127.0.0.1', 11211); + + $fh = @fsockopen('127.0.0.1', 11211); + if (!$fh) { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } else { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } + + public function testNoExpire() { + $cache = $this->_getCacheDriver(); + $cache->save('noexpire', 'value', 0); + sleep(1); + $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire'); + } + + protected function _getCacheDriver() + { + $driver = new MemcachedCache(); + $driver->setMemcached($this->memcached); + return $driver; + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php new file mode 100644 index 00000000..cb363df9 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of Wincache'); + } + } + + protected function _getCacheDriver() + { + return new WincacheCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php new file mode 100644 index 00000000..62598487 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of xcache'); + } + } + + protected function _getCacheDriver() + { + return new XcacheCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php new file mode 100644 index 00000000..27dcf359 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of Zend Data Cache which only works in apache2handler SAPI'); + } + } + + protected function _getCacheDriver() + { + return new ZendDataCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php new file mode 100644 index 00000000..567cf918 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php @@ -0,0 +1,45 @@ +setIncludePath(__DIR__); + $classLoader->setFileExtension('.class.php'); + $classLoader->setNamespaceSeparator('_'); + + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassA')); + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassB')); + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassC')); + $this->assertFalse($classLoader->canLoadClass('OtherClass')); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassA'), true); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassB'), true); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassC'), true); + } + + public function testClassExists() + { + $this->assertFalse(ClassLoader::classExists('ClassLoaderTest\ClassD')); + $badLoader = function($className) { + require __DIR__ . '/ClassLoaderTest/ClassD.php'; + return true; + }; + spl_autoload_register($badLoader); + $this->assertTrue(ClassLoader::classExists('ClassLoaderTest\ClassD')); + spl_autoload_unregister($badLoader); + } + + public function testGetClassLoader() + { + $cl = new ClassLoader('ClassLoaderTest', __DIR__); + $cl->register(); + $this->assertTrue(ClassLoader::getClassLoader('ClassLoaderTest\ClassD') instanceof \Doctrine\Common\ClassLoader); + $this->assertNull(ClassLoader::getClassLoader('This\Class\Does\Not\Exist')); + $cl->unregister(); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php new file mode 100644 index 00000000..85546547 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php @@ -0,0 +1,6 @@ +_coll = new \Doctrine\Common\Collections\ArrayCollection; + } + + public function testIssetAndUnset() + { + $this->assertFalse(isset($this->_coll[0])); + $this->_coll->add('testing'); + $this->assertTrue(isset($this->_coll[0])); + unset($this->_coll[0]); + $this->assertFalse(isset($this->_coll[0])); + } + + public function testToString() + { + $this->_coll->add('testing'); + $this->assertTrue(is_string((string) $this->_coll)); + } + + public function testRemovingNonExistentEntryReturnsNull() + { + $this->assertEquals(null, $this->_coll->remove('testing_does_not_exist')); + } + + public function testExists() + { + $this->_coll->add("one"); + $this->_coll->add("two"); + $exists = $this->_coll->exists(function($k, $e) { return $e == "one"; }); + $this->assertTrue($exists); + $exists = $this->_coll->exists(function($k, $e) { return $e == "other"; }); + $this->assertFalse($exists); + } + + public function testMap() + { + $this->_coll->add(1); + $this->_coll->add(2); + $res = $this->_coll->map(function($e) { return $e * 2; }); + $this->assertEquals(array(2, 4), $res->toArray()); + } + + public function testFilter() + { + $this->_coll->add(1); + $this->_coll->add("foo"); + $this->_coll->add(3); + $res = $this->_coll->filter(function($e) { return is_numeric($e); }); + $this->assertEquals(array(0 => 1, 2 => 3), $res->toArray()); + } + + public function testFirstAndLast() + { + $this->_coll->add('one'); + $this->_coll->add('two'); + + $this->assertEquals($this->_coll->first(), 'one'); + $this->assertEquals($this->_coll->last(), 'two'); + } + + public function testArrayAccess() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + + $this->assertEquals($this->_coll[0], 'one'); + $this->assertEquals($this->_coll[1], 'two'); + + unset($this->_coll[0]); + $this->assertEquals($this->_coll->count(), 1); + } + + public function testContainsKey() + { + $this->_coll[5] = 'five'; + $this->assertTrue($this->_coll->containsKey(5)); + } + + public function testContains() + { + $this->_coll[0] = 'test'; + $this->assertTrue($this->_coll->contains('test')); + } + + public function testSearch() + { + $this->_coll[0] = 'test'; + $this->assertEquals(0, $this->_coll->indexOf('test')); + } + + public function testGet() + { + $this->_coll[0] = 'test'; + $this->assertEquals('test', $this->_coll->get(0)); + } + + public function testGetKeys() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals(array(0, 1), $this->_coll->getKeys()); + } + + public function testGetValues() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals(array('one', 'two'), $this->_coll->getValues()); + } + + public function testCount() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals($this->_coll->count(), 2); + $this->assertEquals(count($this->_coll), 2); + } + + public function testForAll() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_string($e); }), true); + $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_array($e); }), false); + } + + public function testPartition() + { + $this->_coll[] = true; + $this->_coll[] = false; + $partition = $this->_coll->partition(function($k, $e) { return $e == true; }); + $this->assertEquals($partition[0][0], true); + $this->assertEquals($partition[1][0], false); + } + + public function testClear() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->_coll->clear(); + $this->assertEquals($this->_coll->isEmpty(), true); + } + + public function testRemove() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $el = $this->_coll->remove(0); + + $this->assertEquals('one', $el); + $this->assertEquals($this->_coll->contains('one'), false); + $this->assertNull($this->_coll->remove(0)); + } + + public function testRemoveElement() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + + $this->assertTrue($this->_coll->removeElement('two')); + $this->assertFalse($this->_coll->contains('two')); + $this->assertFalse($this->_coll->removeElement('two')); + } + + public function testSlice() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->_coll[] = 'three'; + + $slice = $this->_coll->slice(0, 1); + $this->assertInternalType('array', $slice); + $this->assertEquals(array('one'), $slice); + + $slice = $this->_coll->slice(1); + $this->assertEquals(array(1 => 'two', 2 => 'three'), $slice); + + $slice = $this->_coll->slice(1, 1); + $this->assertEquals(array(1 => 'two'), $slice); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php new file mode 100644 index 00000000..e69de29b diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php new file mode 100644 index 00000000..2b11b20e --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php @@ -0,0 +1,88 @@ +_eventManager = new EventManager; + $this->_preFooInvoked = false; + $this->_postFooInvoked = false; + } + + public function testInitialState() + { + $this->assertEquals(array(), $this->_eventManager->getListeners()); + $this->assertFalse($this->_eventManager->hasListeners(self::preFoo)); + $this->assertFalse($this->_eventManager->hasListeners(self::postFoo)); + } + + public function testAddEventListener() + { + $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); + $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); + $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); + $this->assertEquals(1, count($this->_eventManager->getListeners(self::preFoo))); + $this->assertEquals(1, count($this->_eventManager->getListeners(self::postFoo))); + $this->assertEquals(2, count($this->_eventManager->getListeners())); + } + + public function testDispatchEvent() + { + $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); + $this->_eventManager->dispatchEvent(self::preFoo); + $this->assertTrue($this->_preFooInvoked); + $this->assertFalse($this->_postFooInvoked); + } + + public function testRemoveEventListener() + { + $this->_eventManager->addEventListener(array('preBar'), $this); + $this->assertTrue($this->_eventManager->hasListeners(self::preBar)); + $this->_eventManager->removeEventListener(array('preBar'), $this); + $this->assertFalse($this->_eventManager->hasListeners(self::preBar)); + } + + public function testAddEventSubscriber() + { + $eventSubscriber = new TestEventSubscriber(); + $this->_eventManager->addEventSubscriber($eventSubscriber); + $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); + $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); + } + + /* Listener methods */ + + public function preFoo(EventArgs $e) + { + $this->_preFooInvoked = true; + } + + public function postFoo(EventArgs $e) + { + $this->_postFooInvoked = true; + } +} + +class TestEventSubscriber implements \Doctrine\Common\EventSubscriber +{ + public function getSubscribedEvents() + { + return array('preFoo', 'postFoo'); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php new file mode 100644 index 00000000..e1825ae2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php @@ -0,0 +1,94 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver1->expects($this->never()) + ->method('loadMetadataForClass'); + $driver1->expectS($this->never()) + ->method('isTransient'); + + $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver2->expects($this->at(0)) + ->method('loadMetadataForClass') + ->with($this->equalTo($className), $this->equalTo($classMetadata)); + $driver2->expects($this->at(1)) + ->method('isTransient') + ->with($this->equalTo($className)) + ->will($this->returnValue( true )); + + $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); + $chain->addDriver($driver2, 'Doctrine\Tests\Common\Persistence\Mapping'); + + $chain->loadMetadataForClass($className, $classMetadata); + + $this->assertTrue( $chain->isTransient($className) ); + } + + public function testLoadMetadata_NoDelegatorFound_ThrowsMappingException() + { + $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; + $classMetadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $this->setExpectedException('Doctrine\Common\Persistence\Mapping\MappingException'); + $chain->loadMetadataForClass($className, $classMetadata); + } + + public function testGatherAllClassNames() + { + $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; + $classMetadata = $this->getMock('Doctrine\Common\Peristence\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver1->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Doctrine\Tests\Models\Company\Foo'))); + + $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver2->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Doctrine\Tests\ORM\Mapping\Bar', 'Doctrine\Tests\ORM\Mapping\Baz', 'FooBarBaz'))); + + $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); + $chain->addDriver($driver2, 'Doctrine\Tests\ORM\Mapping'); + + $this->assertEquals(array( + 'Doctrine\Tests\Models\Company\Foo', + 'Doctrine\Tests\ORM\Mapping\Bar', + 'Doctrine\Tests\ORM\Mapping\Baz' + ), $chain->getAllClassNames()); + } + + /** + * @group DDC-706 + */ + public function testIsTransient() + { + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $chain = new MappingDriverChain(); + $chain->addDriver($driver1, 'Doctrine\Tests\Models\CMS'); + + $this->assertTrue($chain->isTransient('stdClass'), "stdClass isTransient"); + } +} + +class DriverChainEntity +{ + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php new file mode 100644 index 00000000..9fe32994 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php @@ -0,0 +1,134 @@ +getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $this->cmf = new TestClassMetadataFactory($driver, $metadata); + } + + public function testGetCacheDriver() + { + $this->assertNull($this->cmf->getCacheDriver()); + $cache = new ArrayCache(); + $this->cmf->setCacheDriver($cache); + $this->assertSame($cache, $this->cmf->getCacheDriver()); + } + + public function testGetMetadataFor() + { + $metadata = $this->cmf->getMetadataFor('stdClass'); + + $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); + $this->assertTrue($this->cmf->hasMetadataFor('stdClass')); + } + + public function testGetParentMetadata() + { + $metadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + + $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\RootEntity')); + } + + public function testGetCachedMetadata() + { + $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $cache = new ArrayCache(); + $cache->save(__NAMESPACE__. '\ChildEntity$CLASSMETADATA', $metadata); + + $this->cmf->setCacheDriver($cache); + + $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + $this->assertSame($loadedMetadata, $metadata); + } + + public function testCacheGetMetadataFor() + { + $cache = new ArrayCache(); + $this->cmf->setCacheDriver($cache); + + $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + + $this->assertSame($loadedMetadata, $cache->fetch(__NAMESPACE__. '\ChildEntity$CLASSMETADATA')); + } + + public function testGetAliasedMetadata() + { + $loadedMetadata = $this->cmf->getMetadataFor('prefix:ChildEntity'); + + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); + $this->assertTrue($this->cmf->hasMetadataFor('prefix:ChildEntity')); + } +} + +class TestClassMetadataFactory extends AbstractClassMetadataFactory +{ + public $driver; + public $metadata; + + public function __construct($driver, $metadata) + { + $this->driver = $driver; + $this->metadata = $metadata; + } + + protected function doLoadMetadata($class, $parent, $rootEntityFound) + { + + } + + protected function getFqcnFromAlias($namespaceAlias, $simpleClassName) + { + return __NAMESPACE__ . '\\' . $simpleClassName; + } + + protected function initialize() + { + + } + + protected function newClassMetadataInstance($className) + { + return $this->metadata; + } + + protected function getDriver() + { + return $this->driver; + } + protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService) + { + } + + protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService) + { + } +} + +class RootEntity +{ + +} + +class ChildEntity extends RootEntity +{ + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php new file mode 100644 index 00000000..3c600c40 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php @@ -0,0 +1,90 @@ +assertEquals(array($path), $locator->getPaths()); + + $locator = new DefaultFileLocator($path); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testGetFileExtension() + { + $locator = new DefaultFileLocator(array(), ".yml"); + $this->assertEquals(".yml", $locator->getFileExtension()); + $locator->setFileExtension(".xml"); + $this->assertEquals(".xml", $locator->getFileExtension()); + } + + public function testUniquePaths() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path, $path)); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testFindMappingFile() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->assertEquals(__DIR__ . '/_files/stdClass.yml', $locator->findMappingFile('stdClass')); + } + + public function testFindMappingFileNotFound() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->setExpectedException( + 'Doctrine\Common\Persistence\Mapping\MappingException', + "No mapping file found named 'stdClass2.yml' for class 'stdClass2'" + ); + $locator->findMappingFile('stdClass2'); + } + + public function testGetAllClassNames() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + $classes = $locator->getAllClassNames(null); + sort($classes); + + $this->assertEquals(array('global', 'stdClass'), $classes); + $this->assertEquals(array('stdClass'), $locator->getAllClassNames("global")); + } + + public function testGetAllClassNamesNonMatchingFileExtension() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".xml"); + $this->assertEquals(array(), $locator->getAllClassNames("global")); + } + + public function testFileExists() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->assertTrue($locator->fileExists("stdClass")); + $this->assertFalse($locator->fileExists("stdClass2")); + $this->assertTrue($locator->fileExists("global")); + $this->assertFalse($locator->fileExists("global2")); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php new file mode 100644 index 00000000..020c2424 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php @@ -0,0 +1,142 @@ +assertNull($driver->getGlobalBasename()); + + $driver->setGlobalBasename("global"); + $this->assertEquals("global", $driver->getGlobalBasename()); + } + + public function testGetElementFromGlobalFile() + { + $driver = new TestFileDriver($this->newLocator()); + $driver->setGlobalBasename("global"); + + $element = $driver->getElement('stdGlobal'); + + $this->assertEquals('stdGlobal', $element); + } + + public function testGetElementFromFile() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('findMappingFile') + ->with($this->equalTo('stdClass')) + ->will($this->returnValue(__DIR__ . '/_files/stdClass.yml')); + + $driver = new TestFileDriver($locator); + + $this->assertEquals('stdClass', $driver->getElement('stdClass')); + } + + public function testGetAllClassNamesGlobalBasename() + { + $driver = new TestFileDriver($this->newLocator()); + $driver->setGlobalBasename("global"); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdGlobal', 'stdGlobal2'), $classNames); + } + + public function testGetAllClassNamesFromMappingFile() + { + $locator = $this->newLocator(); + $locator->expects($this->any()) + ->method('getAllClassNames') + ->with($this->equalTo(null)) + ->will($this->returnValue(array('stdClass'))); + $driver = new TestFileDriver($locator); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdClass'), $classNames); + } + + public function testGetAllClassNamesBothSources() + { + $locator = $this->newLocator(); + $locator->expects($this->any()) + ->method('getAllClassNames') + ->with($this->equalTo('global')) + ->will($this->returnValue(array('stdClass'))); + $driver = new TestFileDriver($locator); + $driver->setGlobalBasename("global"); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdGlobal', 'stdGlobal2', 'stdClass'), $classNames); + } + + public function testIsNotTransient() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('fileExists') + ->with($this->equalTo('stdClass')) + ->will($this->returnValue( true )); + + $driver = new TestFileDriver($locator); + $driver->setGlobalBasename("global"); + + $this->assertFalse($driver->isTransient('stdClass')); + $this->assertFalse($driver->isTransient('stdGlobal')); + $this->assertFalse($driver->isTransient('stdGlobal2')); + } + + public function testIsTransient() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('fileExists') + ->with($this->equalTo('stdClass2')) + ->will($this->returnValue( false )); + + $driver = new TestFileDriver($locator); + + $this->assertTrue($driver->isTransient('stdClass2')); + } + + public function testNonLocatorFallback() + { + $driver = new TestFileDriver(__DIR__ . '/_files', '.yml'); + $this->assertTrue($driver->isTransient('stdClass2')); + $this->assertFalse($driver->isTransient('stdClass')); + } + + private function newLocator() + { + $locator = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\FileLocator'); + $locator->expects($this->any())->method('getFileExtension')->will($this->returnValue('.yml')); + $locator->expects($this->any())->method('getPaths')->will($this->returnValue(array(__DIR__ . "/_files"))); + return $locator; + } +} + +class TestFileDriver extends FileDriver +{ + protected function loadMappingFile($file) + { + if (strpos($file, "global.yml") !== false) { + return array('stdGlobal' => 'stdGlobal', 'stdGlobal2' => 'stdGlobal2'); + } + return array('stdClass' => 'stdClass'); + } + + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php new file mode 100644 index 00000000..8fc4d807 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php @@ -0,0 +1,18 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $metadata->expects($this->once())->method('getFieldNames'); + + $driver = new PHPDriver(array(__DIR__ . "/_files")); + $driver->loadMetadataForClass('TestEntity', $metadata); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php new file mode 100644 index 00000000..5f06cad9 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Tests\Common\Persistence\Mapping; + +use Doctrine\Common\Persistence\Mapping\RuntimeReflectionService; + +/** + * @group DCOM-93 + */ +class RuntimeReflectionServiceTest extends \PHPUnit_Framework_TestCase +{ + private $reflectionService; + + public function setUp() + { + $this->reflectionService = new RuntimeReflectionService(); + } + + public function testShortname() + { + $this->assertEquals("RuntimeReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); + } + + public function testClassNamespaceName() + { + $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); + } + + public function testGetParentClasses() + { + $classes = $this->reflectionService->getParentClasses(__CLASS__); + $this->assertTrue(count($classes) >= 1, "The test class ".__CLASS__." should have at least one parent."); + } + + public function testGetReflectionClass() + { + $class = $this->reflectionService->getClass(__CLASS__); + $this->assertInstanceOf("ReflectionClass", $class); + } + + public function testGetMethods() + { + $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); + $this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); + } + + public function testGetAccessibleProperty() + { + $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); + $this->assertInstanceOf("ReflectionProperty", $reflProp); + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php new file mode 100644 index 00000000..9f1c5684 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php @@ -0,0 +1,35 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $metadata->expects($this->once())->method('getFieldNames'); + + $driver = new StaticPHPDriver(array(__DIR__)); + $driver->loadMetadataForClass(__NAMESPACE__ . '\\TestEntity', $metadata); + } + + public function testGetAllClassNames() + { + $driver = new StaticPHPDriver(array(__DIR__)); + $classNames = $driver->getAllClassNames(); + + $this->assertContains( + 'Doctrine\Tests\Common\Persistence\Mapping\TestEntity', $classNames); + } +} + +class TestEntity +{ + static public function loadMetadata($metadata) + { + $metadata->getFieldNames(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php new file mode 100644 index 00000000..ffce6d40 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Tests\Common\Persistence\Mapping; + +use Doctrine\Common\Persistence\Mapping\StaticReflectionService; + +/** + * @group DCOM-93 + */ +class StaticReflectionServiceTest extends \PHPUnit_Framework_TestCase +{ + private $reflectionService; + + public function setUp() + { + $this->reflectionService = new StaticReflectionService(); + } + + public function testShortname() + { + $this->assertEquals("StaticReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); + } + + public function testClassNamespaceName() + { + $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); + } + + public function testGetParentClasses() + { + $classes = $this->reflectionService->getParentClasses(__CLASS__); + $this->assertTrue(count($classes) == 0, "The test class ".__CLASS__." should have no parents according to static reflection."); + } + + public function testGetReflectionClass() + { + $class = $this->reflectionService->getClass(__CLASS__); + $this->assertNull($class); + } + + public function testGetMethods() + { + $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); + $this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); + } + + public function testGetAccessibleProperty() + { + $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); + $this->assertNull($reflProp); + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php new file mode 100644 index 00000000..b51162e6 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php @@ -0,0 +1,88 @@ + $prefix)); + $this->assertEquals(array($path), $locator->getPaths()); + + $locator = new SymfonyFileLocator(array($path => $prefix)); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testGetPrefixes() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix)); + $this->assertEquals(array($path => $prefix), $locator->getNamespacePrefixes()); + } + + public function testGetFileExtension() + { + $locator = new SymfonyFileLocator(array(), ".yml"); + $this->assertEquals(".yml", $locator->getFileExtension()); + $locator->setFileExtension(".xml"); + $this->assertEquals(".xml", $locator->getFileExtension()); + } + + public function testFileExists() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->assertTrue($locator->fileExists("Foo\stdClass")); + $this->assertTrue($locator->fileExists("Foo\global")); + $this->assertFalse($locator->fileExists("Foo\stdClass2")); + $this->assertFalse($locator->fileExists("Foo\global2")); + } + + public function testGetAllClassNames() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + $classes = $locator->getAllClassNames(null); + sort($classes); + + $this->assertEquals(array("Foo\\global", "Foo\\stdClass"), $classes); + $this->assertEquals(array("Foo\\stdClass"), $locator->getAllClassNames("global")); + } + + public function testFindMappingFile() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->assertEquals(__DIR__ . "/_files/stdClass.yml", $locator->findMappingFile("Foo\\stdClass")); + } + + public function testFindMappingFileNotFound() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->setExpectedException( + "Doctrine\Common\Persistence\Mapping\MappingException", + "No mapping file found named '".__DIR__."/_files/stdClass2.yml' for class 'Foo\stdClass2'." + ); + $locator->findMappingFile("Foo\\stdClass2"); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php new file mode 100644 index 00000000..d0e9976a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php @@ -0,0 +1,3 @@ +getFieldNames(); \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php new file mode 100644 index 00000000..a0f77b50 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php @@ -0,0 +1,247 @@ +cm = new TestObjectMetadata; + $this->om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); + $this->om->expects($this->any())->method('getClassMetadata') + ->will($this->returnValue($this->cm)); + $this->object = new TestObject; + PersistentObject::setObjectManager($this->om); + $this->object->injectObjectManager($this->om, $this->cm); + } + + public function testGetObjectManager() + { + $this->assertSame($this->om, PersistentObject::getObjectManager()); + } + + public function testNonMatchingObjectManager() + { + $this->setExpectedException('RuntimeException'); + $om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); + $this->object->injectObjectManager($om, $this->cm); + } + + public function testGetField() + { + $this->assertEquals('beberlei', $this->object->getName()); + } + + public function testSetField() + { + $this->object->setName("test"); + $this->assertEquals("test", $this->object->getName()); + } + + public function testGetIdentifier() + { + $this->assertEquals(1, $this->object->getId()); + } + + public function testSetIdentifier() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->setId(2); + } + + public function testSetUnknownField() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->setUnknown("test"); + } + + public function testGetUnknownField() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->getUnknown(); + } + + public function testGetToOneAssociation() + { + $this->assertNull($this->object->getParent()); + } + + public function testSetToOneAssociation() + { + $parent = new TestObject(); + $this->object->setParent($parent); + $this->assertSame($parent, $this->object->getParent($parent)); + } + + public function testSetInvalidToOneAssocation() + { + $parent = new \stdClass(); + + $this->setExpectedException('InvalidArgumentException'); + $this->object->setParent($parent); + } + + public function testSetToOneAssociationNull() + { + $parent = new TestObject(); + $this->object->setParent($parent); + $this->object->setParent(null); + $this->assertNull($this->object->getParent()); + } + + public function testAddToManyAssocation() + { + $child = new TestObject(); + $this->object->addChildren($child); + + $this->assertSame($this->object, $child->getParent()); + $this->assertEquals(1, count($this->object->getChildren())); + + $child = new TestObject(); + $this->object->addChildren($child); + + $this->assertEquals(2, count($this->object->getChildren())); + } + + public function testAddInvalidToManyAssocation() + { + $this->setExpectedException('InvalidArgumentException'); + $this->object->addChildren(new \stdClass()); + } + + public function testNoObjectManagerSet() + { + PersistentObject::setObjectManager(null); + $child = new TestObject(); + + $this->setExpectedException('RuntimeException'); + $child->setName("test"); + } + + public function testInvalidMethod() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->asdf(); + } + + public function testAddInvalidCollection() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->addAsdf(new \stdClass()); + } +} + +class TestObject extends PersistentObject +{ + protected $id = 1; + protected $name = 'beberlei'; + protected $parent; + protected $children; +} + +class TestObjectMetadata implements ClassMetadata +{ + + public function getAssociationMappedByTargetField($assocName) + { + $assoc = array('children' => 'parent'); + return $assoc[$assocName]; + } + + public function getAssociationNames() + { + return array('parent', 'children'); + } + + public function getAssociationTargetClass($assocName) + { + return __NAMESPACE__ . '\TestObject'; + } + + public function getFieldNames() + { + return array('id', 'name'); + } + + public function getIdentifier() + { + return array('id'); + } + + public function getName() + { + return __NAMESPACE__ . '\TestObject'; + } + + public function getReflectionClass() + { + return new \ReflectionClass($this->getName()); + } + + public function getTypeOfField($fieldName) + { + $types = array('id' => 'integer', 'name' => 'string'); + return $types[$fieldName]; + } + + public function hasAssociation($fieldName) + { + return in_array($fieldName, array('parent', 'children')); + } + + public function hasField($fieldName) + { + return in_array($fieldName, array('id', 'name')); + } + + public function isAssociationInverseSide($assocName) + { + return ($assocName === 'children'); + } + + public function isCollectionValuedAssociation($fieldName) + { + return ($fieldName === 'children'); + } + + public function isIdentifier($fieldName) + { + return $fieldName === 'id'; + } + + public function isSingleValuedAssociation($fieldName) + { + return $fieldName === 'parent'; + } + + public function getIdentifierValues($entity) + { + + } + + public function getIdentifierFieldNames() + { + + } + + public function initializeReflection(ReflectionService $reflService) + { + + } + + public function wakeupReflection(ReflectionService $reflService) + { + + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php new file mode 100644 index 00000000..a2814500 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php @@ -0,0 +1,100 @@ +assertEquals($expectedClassName, ClassUtils::getRealClass($className)); + } + + /** + * @dataProvider dataGetClass + */ + public function testGetClass( $className, $expectedClassName ) + { + $object = new $className(); + $this->assertEquals($expectedClassName, ClassUtils::getClass($object)); + } + + public function testGetParentClass() + { + $parentClass = ClassUtils::getParentClass( 'MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject' ); + $this->assertEquals('stdClass', $parentClass); + } + + public function testGenerateProxyClassName() + { + $this->assertEquals( 'Proxies\__CG__\stdClass', ClassUtils::generateProxyClassName( 'stdClass', 'Proxies' ) ); + } + + /** + * @dataProvider dataGetClass + */ + public function testNewReflectionClass( $className, $expectedClassName ) + { + $reflClass = ClassUtils::newReflectionClass( $className ); + $this->assertEquals( $expectedClassName, $reflClass->getName() ); + } + + /** + * @dataProvider dataGetClass + */ + public function testNewReflectionObject( $className, $expectedClassName ) + { + $object = new $className; + $reflClass = ClassUtils::newReflectionObject( $object ); + $this->assertEquals( $expectedClassName, $reflClass->getName() ); + } + } + + class ChildObject extends \stdClass + { + } +} + +namespace MyProject\Proxies\__CG__ +{ + class stdClass extends \stdClass + { + } +} + +namespace MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util +{ + class ChildObject extends \Doctrine\Tests\Common\Util\ChildObject + { + } +} + +namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__ +{ + class stdClass extends \MyProject\Proxies\__CG__\stdClass + { + } +} + +namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util +{ + class ChildObject extends \MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject + { + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php new file mode 100644 index 00000000..b4e9eed2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php @@ -0,0 +1,27 @@ +foo = "bar"; + $obj->bar = 1234; + + $var = Debug::export($obj, 2); + $this->assertEquals( "stdClass", $var->__CLASS__ ); + } + + public function testExportDateTime() + { + $obj = new \DateTime( "2010-10-10 10:10:10" ); + + $var = Debug::export( $obj, 2 ); + $this->assertEquals( "DateTime", $var->__CLASS__ ); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php b/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php new file mode 100644 index 00000000..e8323d29 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php @@ -0,0 +1,10 @@ + + */ +class NativePhpunitTask extends Task +{ + private $test; + private $testfile; + private $testdirectory; + private $configuration = null; + private $coverageClover = null; + private $junitlogfile = null; + private $haltonfailure = true; + private $haltonerror = true; + + public function setTestdirectory($directory) { + $this->testdirectory = $directory; + } + + public function setTest($test) { + $this->test = $test; + } + + public function setTestfile($testfile) { + $this->testfile = $testfile; + } + + public function setJunitlogfile($junitlogfile) { + if (strlen($junitlogfile) == 0) { + $junitlogfile = NULL; + } + + $this->junitlogfile = $junitlogfile; + } + + public function setConfiguration($configuration) { + if (strlen($configuration) == 0) { + $configuration = NULL; + } + + $this->configuration = $configuration; + } + + public function setCoverageClover($coverageClover) { + if (strlen($coverageClover) == 0) { + $coverageClover = NULL; + } + + $this->coverageClover = $coverageClover; + } + + public function setHaltonfailure($haltonfailures) { + $this->haltonfailure = $haltonfailures; + } + + public function setHaltonerror($haltonerrors) { + $this->haltonerror = $haltonerrors; + } + + public function init() + { + require_once "PHPUnit/Runner/Version.php"; + $version = PHPUnit_Runner_Version::id(); + + if (version_compare($version, '3.4.0') < 0) { + throw new BuildException("NativePHPUnitTask requires PHPUnit version >= 3.2.0", $this->getLocation()); + } + + require_once 'PHPUnit/Util/Filter.php'; + + // point PHPUnit_MAIN_METHOD define to non-existing method + if (!defined('PHPUnit_MAIN_METHOD')) { + define('PHPUnit_MAIN_METHOD', 'PHPUnitTask::undefined'); + } + } + + public function main() + { + if (!is_dir(realpath($this->testdirectory))) { + throw new BuildException("NativePHPUnitTask requires a Test Directory path given, '".$this->testdirectory."' given."); + } + set_include_path(realpath($this->testdirectory) . PATH_SEPARATOR . get_include_path()); + + $printer = new NativePhpunitPrinter(); + + $arguments = array( + 'configuration' => $this->configuration, + 'coverageClover' => $this->coverageClover, + 'junitLogfile' => $this->junitlogfile, + 'printer' => $printer, + ); + + $runner = new PHPUnit_TextUI_TestRunner(); + $suite = $runner->getTest($this->test, $this->testfile, true); + + try { + $result = $runner->doRun($suite, $arguments); + /* @var $result PHPUnit_Framework_TestResult */ + + if ( ($this->haltonfailure && $result->failureCount() > 0) || ($this->haltonerror && $result->errorCount() > 0) ) { + throw new BuildException("PHPUnit: ".$result->failureCount()." Failures and ".$result->errorCount()." Errors, ". + "last failure message: ".$printer->getMessages()); + } + + $this->log("PHPUnit Success: ".count($result->passed())." tests passed, no ". + "failures (".$result->skippedCount()." skipped, ".$result->notImplementedCount()." not implemented)"); + + // Hudson for example doesn't like the backslash in class names + if (file_exists($this->coverageClover)) { + $this->log("Generated Clover Coverage XML to: ".$this->coverageClover); + $content = file_get_contents($this->coverageClover); + $content = str_replace("\\", ".", $content); + file_put_contents($this->coverageClover, $content); + unset($content); + } + + } catch(\Exception $e) { + throw new BuildException("NativePhpunitTask failed: ".$e->getMessage()); + } + } +} + +class NativePhpunitPrinter extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener +{ + private $_messages = array(); + + public function write($buffer) + { + // do nothing + } + + public function getMessages() + { + return $this->_messages; + } + + /** + * An error occurred. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + */ + public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) + { + $this->_messages[] = "Test ERROR: ".$test->getName().": ".$e->getMessage(); + } + + /** + * A failure occurred. + * + * @param PHPUnit_Framework_Test $test + * @param PHPUnit_Framework_AssertionFailedError $e + * @param float $time + */ + public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) + { + $this->_messages[] = "Test FAILED: ".$test->getName().": ".$e->getMessage(); + } + + /** + * Incomplete test. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + */ + public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) + { + + } + + /** + * Skipped test. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + * @since Method available since Release 3.0.0 + */ + public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) + { + + } + + /** + * A test suite started. + * + * @param PHPUnit_Framework_TestSuite $suite + * @since Method available since Release 2.2.0 + */ + public function startTestSuite(PHPUnit_Framework_TestSuite $suite) + { + + } + + /** + * A test suite ended. + * + * @param PHPUnit_Framework_TestSuite $suite + * @since Method available since Release 2.2.0 + */ + public function endTestSuite(PHPUnit_Framework_TestSuite $suite) + { + + } + + /** + * A test started. + * + * @param PHPUnit_Framework_Test $test + */ + public function startTest(PHPUnit_Framework_Test $test) + { + + } + + /** + * A test ended. + * + * @param PHPUnit_Framework_Test $test + * @param float $time + */ + public function endTest(PHPUnit_Framework_Test $test, $time) + { + + } +} diff --git a/vendor/doctrine/common/tests/README.markdown b/vendor/doctrine/common/tests/README.markdown new file mode 100644 index 00000000..e6f1703d --- /dev/null +++ b/vendor/doctrine/common/tests/README.markdown @@ -0,0 +1,27 @@ +# Running the Doctrine 2 Testsuite + +## Running tests + +Execute PHPUnit in the root folder of your doctrine-common clone. + + phpunit + +## Testing Lock-Support + +The Lock support in Doctrine 2 is tested using Gearman, which allows to run concurrent tasks in parallel. +Install Gearman with PHP as follows: + +1. Go to http://www.gearman.org and download the latest Gearman Server +2. Compile it and then call ldconfig +3. Start it up "gearmand -vvvv" +4. Install pecl/gearman by calling "gearman-beta" + +You can then go into tests/ and start up two workers: + + php Doctrine/Tests/ORM/Functional/Locking/LockAgentWorker.php + +Then run the locking test-suite: + + phpunit --configuration Doctrine/Tests/ORM/Functional/Locking/GearmanLockTest.php + +This can run considerable time, because it is using sleep() to test for the timing ranges of locks. \ No newline at end of file From 4da5b7f3fdbc9b31b5eaa170dc5d4d65837f9d89 Mon Sep 17 00:00:00 2001 From: cl-server Date: Wed, 13 Feb 2013 09:49:42 +0000 Subject: [PATCH 109/180] init --- .htaccess | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .htaccess diff --git a/.htaccess b/.htaccess new file mode 100644 index 00000000..912ca125 --- /dev/null +++ b/.htaccess @@ -0,0 +1,4 @@ + + Order allow,deny + Deny from all + From ad59a64c38b9c60835781473d2ac25aebd36c534 Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" <> Date: Wed, 13 Feb 2013 10:54:13 +0000 Subject: [PATCH 110/180] Created Stoyan Controller and view --- .../Controller/StoyanController.php | 21 +++++++++++++++++++ .../view/application/stoyan/index.phtml | 1 + 2 files changed, 22 insertions(+) create mode 100644 module/Application/src/Application/Controller/StoyanController.php create mode 100644 module/Application/view/application/stoyan/index.phtml diff --git a/module/Application/src/Application/Controller/StoyanController.php b/module/Application/src/Application/Controller/StoyanController.php new file mode 100644 index 00000000..146c5c67 --- /dev/null +++ b/module/Application/src/Application/Controller/StoyanController.php @@ -0,0 +1,21 @@ +Stoyan \ No newline at end of file From 181d6ca160c0b4f908aba3912d4ad9c5c3425e17 Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" <> Date: Wed, 13 Feb 2013 11:13:11 +0000 Subject: [PATCH 111/180] Added extra info in module.config.php --- module/Application/config/module.config.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index a6dd62b8..1bbd1ef3 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -70,6 +70,7 @@ 'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController' + 'Application\Controller\Stoyan' => 'Application\Controller\StoyanController' // <-- Added by me ), ), 'view_manager' => array( @@ -81,6 +82,7 @@ 'template_map' => array( 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', + 'application/stoyan/index' => __DIR__ . '/../view/application/stoyan/index.phtml', // <-- Added by me 'error/404' => __DIR__ . '/../view/error/404.phtml', 'error/index' => __DIR__ . '/../view/error/index.phtml', ), From 5699730c0d51751c1cbcae1e63f750635a35fde4 Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" <> Date: Wed, 13 Feb 2013 11:16:08 +0000 Subject: [PATCH 112/180] commented the code --- module/Application/config/module.config.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index 1bbd1ef3..4203dc77 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -70,7 +70,7 @@ 'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController' - 'Application\Controller\Stoyan' => 'Application\Controller\StoyanController' // <-- Added by me + // 'Application\Controller\Stoyan' => 'Application\Controller\StoyanController' // <-- Added by me ), ), 'view_manager' => array( @@ -82,7 +82,7 @@ 'template_map' => array( 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', - 'application/stoyan/index' => __DIR__ . '/../view/application/stoyan/index.phtml', // <-- Added by me + // 'application/stoyan/index' => __DIR__ . '/../view/application/stoyan/index.phtml', // <-- Added by me 'error/404' => __DIR__ . '/../view/error/404.phtml', 'error/index' => __DIR__ . '/../view/error/index.phtml', ), From 21270619286a70eae6a6c7d9de8e716fa3d4d272 Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" <> Date: Wed, 13 Feb 2013 11:18:25 +0000 Subject: [PATCH 113/180] Correcting the record in module.config.php --- module/Application/config/module.config.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index 4203dc77..311323fd 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -69,8 +69,8 @@ ), 'controllers' => array( 'invokables' => array( - 'Application\Controller\Index' => 'Application\Controller\IndexController' - // 'Application\Controller\Stoyan' => 'Application\Controller\StoyanController' // <-- Added by me + 'Application\Controller\Index' => 'Application\Controller\IndexController', + 'Application\Controller\Stoyan' => 'Application\Controller\StoyanController' // <-- Added by me ), ), 'view_manager' => array( @@ -82,7 +82,7 @@ 'template_map' => array( 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', - // 'application/stoyan/index' => __DIR__ . '/../view/application/stoyan/index.phtml', // <-- Added by me + 'application/stoyan/index' => __DIR__ . '/../view/application/stoyan/index.phtml', // <-- Added by me 'error/404' => __DIR__ . '/../view/error/404.phtml', 'error/index' => __DIR__ . '/../view/error/index.phtml', ), From 8725973aacc90ad138f4b1dd75005ba576fb17b2 Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" <> Date: Wed, 13 Feb 2013 11:42:08 +0000 Subject: [PATCH 114/180] commented the view script to see if it works --- module/Application/config/module.config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index 311323fd..043c52f1 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -82,7 +82,7 @@ 'template_map' => array( 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', - 'application/stoyan/index' => __DIR__ . '/../view/application/stoyan/index.phtml', // <-- Added by me + // 'application/stoyan/index' => __DIR__ . '/../view/application/stoyan/index.phtml', // <-- Added by me 'error/404' => __DIR__ . '/../view/error/404.phtml', 'error/index' => __DIR__ . '/../view/error/index.phtml', ), From 8eaf6fff67060f9521a5b5ecfd138cc521572305 Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" <> Date: Wed, 13 Feb 2013 11:44:02 +0000 Subject: [PATCH 115/180] commented the controller --- module/Application/config/module.config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index 043c52f1..e92ce0de 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -70,7 +70,7 @@ 'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController', - 'Application\Controller\Stoyan' => 'Application\Controller\StoyanController' // <-- Added by me + // 'Application\Controller\Stoyan' => 'Application\Controller\StoyanController' // <-- Added by me ), ), 'view_manager' => array( From 5bf4cdcd7af1ae1f4fb0a1bd92cb7918829d16cf Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" <> Date: Wed, 13 Feb 2013 11:52:29 +0000 Subject: [PATCH 116/180] Adding extra action add and view script --- module/Application/config/module.config.php | 2 +- .../src/Application/Controller/StoyanController.php | 8 ++++++++ module/Application/view/application/stoyan/add.phtml | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 module/Application/view/application/stoyan/add.phtml diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index e92ce0de..043c52f1 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -70,7 +70,7 @@ 'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController', - // 'Application\Controller\Stoyan' => 'Application\Controller\StoyanController' // <-- Added by me + 'Application\Controller\Stoyan' => 'Application\Controller\StoyanController' // <-- Added by me ), ), 'view_manager' => array( diff --git a/module/Application/src/Application/Controller/StoyanController.php b/module/Application/src/Application/Controller/StoyanController.php index 146c5c67..7cb22a56 100644 --- a/module/Application/src/Application/Controller/StoyanController.php +++ b/module/Application/src/Application/Controller/StoyanController.php @@ -18,4 +18,12 @@ public function indexAction() { return new ViewModel(); } + + public function addAction() + { + return array( + 'id' => 1, + 'title' => 'I have to add' + ); + } } diff --git a/module/Application/view/application/stoyan/add.phtml b/module/Application/view/application/stoyan/add.phtml new file mode 100644 index 00000000..c21290df --- /dev/null +++ b/module/Application/view/application/stoyan/add.phtml @@ -0,0 +1,2 @@ +The id is '.$this->id.''; \ No newline at end of file From 533cf5a37521eac2d90d0ffefd7aed6e14e8d46b Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" <> Date: Wed, 13 Feb 2013 13:06:48 +0000 Subject: [PATCH 117/180] Created Stoyan Cheresharov Controller --- module/Application/config/module.config.php | 1 + .../StoyanCheresharovController.php | 29 +++++++++++++++++++ .../application/stoyan-cheresharov/add.phtml | 1 + .../stoyan-cheresharov/index.phtml | 8 +++++ 4 files changed, 39 insertions(+) create mode 100644 module/Application/src/Application/Controller/StoyanCheresharovController.php create mode 100644 module/Application/view/application/stoyan-cheresharov/add.phtml create mode 100644 module/Application/view/application/stoyan-cheresharov/index.phtml diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index 043c52f1..5b0b82cb 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -71,6 +71,7 @@ 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController', 'Application\Controller\Stoyan' => 'Application\Controller\StoyanController' // <-- Added by me + 'Application\Controller\StoyanCheresharov' => 'Application\Controller\StoyanCheresharovController' // <-- Added by me ), ), 'view_manager' => array( diff --git a/module/Application/src/Application/Controller/StoyanCheresharovController.php b/module/Application/src/Application/Controller/StoyanCheresharovController.php new file mode 100644 index 00000000..bcc0b20a --- /dev/null +++ b/module/Application/src/Application/Controller/StoyanCheresharovController.php @@ -0,0 +1,29 @@ + 1, + 'title' => 'I have to add' + ); + } +} diff --git a/module/Application/view/application/stoyan-cheresharov/add.phtml b/module/Application/view/application/stoyan-cheresharov/add.phtml new file mode 100644 index 00000000..111d98f2 --- /dev/null +++ b/module/Application/view/application/stoyan-cheresharov/add.phtml @@ -0,0 +1 @@ +

$this->title

\ No newline at end of file diff --git a/module/Application/view/application/stoyan-cheresharov/index.phtml b/module/Application/view/application/stoyan-cheresharov/index.phtml new file mode 100644 index 00000000..06b87d90 --- /dev/null +++ b/module/Application/view/application/stoyan-cheresharov/index.phtml @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World

'; ?> + + \ No newline at end of file From 7a28cf16b9eaebc700ab32aa3feae73f9b621f95 Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" <> Date: Wed, 13 Feb 2013 13:08:09 +0000 Subject: [PATCH 118/180] corrected the synax error --- module/Application/config/module.config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index 5b0b82cb..92a11d4b 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -70,7 +70,7 @@ 'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController', - 'Application\Controller\Stoyan' => 'Application\Controller\StoyanController' // <-- Added by me + 'Application\Controller\Stoyan' => 'Application\Controller\StoyanController', // <-- Added by me 'Application\Controller\StoyanCheresharov' => 'Application\Controller\StoyanCheresharovController' // <-- Added by me ), ), From d7145bbe1741d50c7be8a3c1ba751c5b87d268b1 Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" <> Date: Wed, 13 Feb 2013 13:09:39 +0000 Subject: [PATCH 119/180] add is correct now --- .../Application/view/application/stoyan-cheresharov/add.phtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/Application/view/application/stoyan-cheresharov/add.phtml b/module/Application/view/application/stoyan-cheresharov/add.phtml index 111d98f2..148efd0f 100644 --- a/module/Application/view/application/stoyan-cheresharov/add.phtml +++ b/module/Application/view/application/stoyan-cheresharov/add.phtml @@ -1 +1 @@ -

$this->title

\ No newline at end of file +

title; ?>

\ No newline at end of file From d2929a0d0ce8bd93398015dd429a684e901d2b23 Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" <> Date: Wed, 13 Feb 2013 13:23:28 +0000 Subject: [PATCH 120/180] Added a new controller --- module/Application/config/module.config.php | 3 +- .../Controller/FmiStudentController.php | 29 +++++++++++++++++++ .../view/application/fmi-student/add.phtml | 1 + .../view/application/fmi-student/index.phtml | 1 + 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 module/Application/src/Application/Controller/FmiStudentController.php create mode 100644 module/Application/view/application/fmi-student/add.phtml create mode 100644 module/Application/view/application/fmi-student/index.phtml diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index 92a11d4b..44325f50 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -71,7 +71,8 @@ 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController', 'Application\Controller\Stoyan' => 'Application\Controller\StoyanController', // <-- Added by me - 'Application\Controller\StoyanCheresharov' => 'Application\Controller\StoyanCheresharovController' // <-- Added by me + 'Application\Controller\StoyanCheresharov' => 'Application\Controller\StoyanCheresharovController', // <-- Added by me + 'Application\Controller\FmiStudent' => 'Application\Controller\FmiStudentController', // <-- Added by me ), ), 'view_manager' => array( diff --git a/module/Application/src/Application/Controller/FmiStudentController.php b/module/Application/src/Application/Controller/FmiStudentController.php new file mode 100644 index 00000000..7ccc213e --- /dev/null +++ b/module/Application/src/Application/Controller/FmiStudentController.php @@ -0,0 +1,29 @@ + 1, + 'title' => 'FMI Student' + ); + } +} diff --git a/module/Application/view/application/fmi-student/add.phtml b/module/Application/view/application/fmi-student/add.phtml new file mode 100644 index 00000000..d7754e07 --- /dev/null +++ b/module/Application/view/application/fmi-student/add.phtml @@ -0,0 +1 @@ +

I am in add.phtml

\ No newline at end of file diff --git a/module/Application/view/application/fmi-student/index.phtml b/module/Application/view/application/fmi-student/index.phtml new file mode 100644 index 00000000..7928af91 --- /dev/null +++ b/module/Application/view/application/fmi-student/index.phtml @@ -0,0 +1 @@ +

I am index.phtml

\ No newline at end of file From 5f3b27ebe59dfc9219d560b5d71e00619f90364f Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" <> Date: Wed, 13 Feb 2013 13:29:12 +0000 Subject: [PATCH 121/180] I have changed the layout --- module/Application/config/module.config.php | 3 ++- module/Application/view/layout/student.phtml | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 module/Application/view/layout/student.phtml diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index 44325f50..c33a3575 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -82,7 +82,8 @@ 'not_found_template' => 'error/404', 'exception_template' => 'error/index', 'template_map' => array( - 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', + // 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', + 'layout/layout' => __DIR__ . '/../view/layout/student.phtml', 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', // 'application/stoyan/index' => __DIR__ . '/../view/application/stoyan/index.phtml', // <-- Added by me 'error/404' => __DIR__ . '/../view/error/404.phtml', diff --git a/module/Application/view/layout/student.phtml b/module/Application/view/layout/student.phtml new file mode 100644 index 00000000..61d9c937 --- /dev/null +++ b/module/Application/view/layout/student.phtml @@ -0,0 +1,11 @@ + + + PHP Test + + + Hello World

'; ?> + + content; ?> + + + \ No newline at end of file From ab695fa13692b59f59a797f2e13ec36b36072c97 Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" <> Date: Wed, 13 Feb 2013 13:32:03 +0000 Subject: [PATCH 122/180] I am sending a parameter to the view script --- module/Application/view/application/fmi-student/add.phtml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/module/Application/view/application/fmi-student/add.phtml b/module/Application/view/application/fmi-student/add.phtml index d7754e07..4e378735 100644 --- a/module/Application/view/application/fmi-student/add.phtml +++ b/module/Application/view/application/fmi-student/add.phtml @@ -1 +1,2 @@ -

I am in add.phtml

\ No newline at end of file +

I am in add.phtml

+

title; ?>

\ No newline at end of file From 28bf91cc2bde2380bfc0782f6bebeb243baa821f Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" <> Date: Thu, 14 Feb 2013 11:25:21 +0000 Subject: [PATCH 123/180] Added a module StoyanCheresharov --- config/application.config.php | 1 + module/StoyanCheresharov/Module.php | 24 +++++++++++++ .../config/module.config.php | 34 +++++++++++++++++++ .../Controller/IndexController.php | 21 ++++++++++++ .../view/stoyan-cheresharov/index/index.phtml | 1 + 5 files changed, 81 insertions(+) create mode 100644 module/StoyanCheresharov/Module.php create mode 100644 module/StoyanCheresharov/config/module.config.php create mode 100644 module/StoyanCheresharov/src/StoyanCheresharov/Controller/IndexController.php create mode 100644 module/StoyanCheresharov/view/stoyan-cheresharov/index/index.phtml diff --git a/config/application.config.php b/config/application.config.php index aaa7a91f..249e3d8b 100644 --- a/config/application.config.php +++ b/config/application.config.php @@ -3,6 +3,7 @@ 'modules' => array( 'Application', 'Album', // <-- Add this line + 'StoyanCheresharov', // <-- Add this line ), 'module_listener_options' => array( 'config_glob_paths' => array( diff --git a/module/StoyanCheresharov/Module.php b/module/StoyanCheresharov/Module.php new file mode 100644 index 00000000..b34e8ac0 --- /dev/null +++ b/module/StoyanCheresharov/Module.php @@ -0,0 +1,24 @@ + array( + __DIR__ . '/autoload_classmap.php', + ), + 'Zend\Loader\StandardAutoloader' => array( + 'namespaces' => array( + __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, + ), + ), + ); + } + + public function getConfig() + { + return include __DIR__ . '/config/module.config.php'; + } +} \ No newline at end of file diff --git a/module/StoyanCheresharov/config/module.config.php b/module/StoyanCheresharov/config/module.config.php new file mode 100644 index 00000000..42988025 --- /dev/null +++ b/module/StoyanCheresharov/config/module.config.php @@ -0,0 +1,34 @@ + array( + 'invokables' => array( + 'StoyanCheresharov\Controller\Album' => 'StoyanCheresharov\Controller\IndexController', + ), + ), + + // The following section is new and should be added to your file + 'router' => array( + 'routes' => array( + 'album' => array( + 'type' => 'segment', + 'options' => array( + 'route' => '/stoyan-cheresharov[/:action][/:id]', + 'constraints' => array( + 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', + 'id' => '[0-9]+', + ), + 'defaults' => array( + 'controller' => 'StoyanCheresharov\Controller\Index', + 'action' => 'index', + ), + ), + ), + ), + ), + + 'view_manager' => array( + 'template_path_stack' => array( + 'album' => __DIR__ . '/../view', + ), + ), +); \ No newline at end of file diff --git a/module/StoyanCheresharov/src/StoyanCheresharov/Controller/IndexController.php b/module/StoyanCheresharov/src/StoyanCheresharov/Controller/IndexController.php new file mode 100644 index 00000000..5b5e8723 --- /dev/null +++ b/module/StoyanCheresharov/src/StoyanCheresharov/Controller/IndexController.php @@ -0,0 +1,21 @@ +I am the index.phtml in StoyanCheresharov module \ No newline at end of file From 334106c79448c83d5d2f6419f5dc0cc878bdc0d8 Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" <> Date: Thu, 14 Feb 2013 11:27:07 +0000 Subject: [PATCH 124/180] Comented the new module --- config/application.config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/application.config.php b/config/application.config.php index 249e3d8b..7f0e6f3c 100644 --- a/config/application.config.php +++ b/config/application.config.php @@ -3,7 +3,7 @@ 'modules' => array( 'Application', 'Album', // <-- Add this line - 'StoyanCheresharov', // <-- Add this line + // 'StoyanCheresharov', // <-- Add this line ), 'module_listener_options' => array( 'config_glob_paths' => array( From 9c879152ea71bd17d26585257c3be3e9adbdd682 Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" <> Date: Thu, 14 Feb 2013 11:31:28 +0000 Subject: [PATCH 125/180] Adding autoload_classmap.php --- config/application.config.php | 2 +- module/StoyanCheresharov/autoload_classmap.php | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 module/StoyanCheresharov/autoload_classmap.php diff --git a/config/application.config.php b/config/application.config.php index 7f0e6f3c..dbad3fa9 100644 --- a/config/application.config.php +++ b/config/application.config.php @@ -3,7 +3,7 @@ 'modules' => array( 'Application', 'Album', // <-- Add this line - // 'StoyanCheresharov', // <-- Add this line + 'StoyanCheresharov', // <-- Add this line ), 'module_listener_options' => array( 'config_glob_paths' => array( diff --git a/module/StoyanCheresharov/autoload_classmap.php b/module/StoyanCheresharov/autoload_classmap.php new file mode 100644 index 00000000..dad330e6 --- /dev/null +++ b/module/StoyanCheresharov/autoload_classmap.php @@ -0,0 +1,2 @@ + Date: Thu, 14 Feb 2013 11:37:34 +0000 Subject: [PATCH 126/180] Corected an error in module.config.php --- module/StoyanCheresharov/config/module.config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/StoyanCheresharov/config/module.config.php b/module/StoyanCheresharov/config/module.config.php index 42988025..fc99bda5 100644 --- a/module/StoyanCheresharov/config/module.config.php +++ b/module/StoyanCheresharov/config/module.config.php @@ -2,7 +2,7 @@ return array( 'controllers' => array( 'invokables' => array( - 'StoyanCheresharov\Controller\Album' => 'StoyanCheresharov\Controller\IndexController', + 'StoyanCheresharov\Controller\Index' => 'StoyanCheresharov\Controller\IndexController', ), ), From 20c162dcfe3952275f54d55dbd23ccb4f25abbae Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" <> Date: Thu, 14 Feb 2013 11:44:50 +0000 Subject: [PATCH 127/180] Stoyan Cheresharov layout --- module/Application/view/layout/student.phtml | 2 +- module/StoyanCheresharov/config/module.config.php | 8 ++++++++ module/StoyanCheresharov/view/layout/layout.phtml | 11 +++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 module/StoyanCheresharov/view/layout/layout.phtml diff --git a/module/Application/view/layout/student.phtml b/module/Application/view/layout/student.phtml index 61d9c937..44faf4b7 100644 --- a/module/Application/view/layout/student.phtml +++ b/module/Application/view/layout/student.phtml @@ -5,7 +5,7 @@ Hello World

'; ?> - content; ?> + content; ?> \ No newline at end of file diff --git a/module/StoyanCheresharov/config/module.config.php b/module/StoyanCheresharov/config/module.config.php index fc99bda5..c3386841 100644 --- a/module/StoyanCheresharov/config/module.config.php +++ b/module/StoyanCheresharov/config/module.config.php @@ -27,6 +27,14 @@ ), 'view_manager' => array( + 'template_map' => array( + 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', + // 'layout/layout' => __DIR__ . '/../view/layout/student.phtml', + // 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', + // 'application/stoyan/index' => __DIR__ . '/../view/application/stoyan/index.phtml', // <-- Added by me + // 'error/404' => __DIR__ . '/../view/error/404.phtml', + // 'error/index' => __DIR__ . '/../view/error/index.phtml', + ), 'template_path_stack' => array( 'album' => __DIR__ . '/../view', ), diff --git a/module/StoyanCheresharov/view/layout/layout.phtml b/module/StoyanCheresharov/view/layout/layout.phtml new file mode 100644 index 00000000..587da788 --- /dev/null +++ b/module/StoyanCheresharov/view/layout/layout.phtml @@ -0,0 +1,11 @@ + + + Stoyan Cheresharov Layout + + + Stoyan Cheresharov layout

'; ?> + + content; ?> + + + \ No newline at end of file From 45886e79d5c609f8c79911a00622658e6856f2e4 Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" <> Date: Thu, 14 Feb 2013 11:53:44 +0000 Subject: [PATCH 128/180] revert to using the default layout --- module/Application/config/module.config.php | 4 ++-- module/StoyanCheresharov/config/module.config.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index c33a3575..a4a8b700 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -82,8 +82,8 @@ 'not_found_template' => 'error/404', 'exception_template' => 'error/index', 'template_map' => array( - // 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', - 'layout/layout' => __DIR__ . '/../view/layout/student.phtml', + 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', + // 'layout/layout' => __DIR__ . '/../view/layout/student.phtml', 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', // 'application/stoyan/index' => __DIR__ . '/../view/application/stoyan/index.phtml', // <-- Added by me 'error/404' => __DIR__ . '/../view/error/404.phtml', diff --git a/module/StoyanCheresharov/config/module.config.php b/module/StoyanCheresharov/config/module.config.php index c3386841..f4de50ef 100644 --- a/module/StoyanCheresharov/config/module.config.php +++ b/module/StoyanCheresharov/config/module.config.php @@ -28,7 +28,7 @@ 'view_manager' => array( 'template_map' => array( - 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', + // 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', // the entire app is using it // 'layout/layout' => __DIR__ . '/../view/layout/student.phtml', // 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', // 'application/stoyan/index' => __DIR__ . '/../view/application/stoyan/index.phtml', // <-- Added by me From d0c668ac2aaf0eb773b66b4c846cc9a7a722a48a Mon Sep 17 00:00:00 2001 From: "stoyancheresharov@gmail.com" <> Date: Thu, 14 Feb 2013 12:47:45 +0000 Subject: [PATCH 129/180] Created a module by the name of FmiStudent --- config/application.config.php | 1 + module/FmiStudent/Module.php | 24 +++++++++++++ module/FmiStudent/autoload_classmap.php | 2 ++ module/FmiStudent/config/module.config.php | 34 +++++++++++++++++++ .../FmiStudent/Controller/IndexController.php | 21 ++++++++++++ .../view/fmi-student/index/index.phtml | 1 + 6 files changed, 83 insertions(+) create mode 100644 module/FmiStudent/Module.php create mode 100644 module/FmiStudent/autoload_classmap.php create mode 100644 module/FmiStudent/config/module.config.php create mode 100644 module/FmiStudent/src/FmiStudent/Controller/IndexController.php create mode 100644 module/FmiStudent/view/fmi-student/index/index.phtml diff --git a/config/application.config.php b/config/application.config.php index dbad3fa9..ddfb4bc9 100644 --- a/config/application.config.php +++ b/config/application.config.php @@ -4,6 +4,7 @@ 'Application', 'Album', // <-- Add this line 'StoyanCheresharov', // <-- Add this line + 'FmiStudent', // <-- Add this line ), 'module_listener_options' => array( 'config_glob_paths' => array( diff --git a/module/FmiStudent/Module.php b/module/FmiStudent/Module.php new file mode 100644 index 00000000..567542e1 --- /dev/null +++ b/module/FmiStudent/Module.php @@ -0,0 +1,24 @@ + array( + __DIR__ . '/autoload_classmap.php', + ), + 'Zend\Loader\StandardAutoloader' => array( + 'namespaces' => array( + __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, + ), + ), + ); + } + + public function getConfig() + { + return include __DIR__ . '/config/module.config.php'; + } +} \ No newline at end of file diff --git a/module/FmiStudent/autoload_classmap.php b/module/FmiStudent/autoload_classmap.php new file mode 100644 index 00000000..dad330e6 --- /dev/null +++ b/module/FmiStudent/autoload_classmap.php @@ -0,0 +1,2 @@ + array( + 'invokables' => array( + 'FmiStudent\Controller\Index' => 'FmiStudent\Controller\IndexController', + ), + ), + + // The following section is new and should be added to your file + 'router' => array( + 'routes' => array( + 'album' => array( + 'type' => 'segment', + 'options' => array( + 'route' => '/fmi-student[/:action][/:id]', + 'constraints' => array( + 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', + 'id' => '[0-9]+', + ), + 'defaults' => array( + 'controller' => 'FmiStudent\Controller\Index', + 'action' => 'index', + ), + ), + ), + ), + ), + + 'view_manager' => array( + 'template_path_stack' => array( + 'album' => __DIR__ . '/../view', + ), + ), +); \ No newline at end of file diff --git a/module/FmiStudent/src/FmiStudent/Controller/IndexController.php b/module/FmiStudent/src/FmiStudent/Controller/IndexController.php new file mode 100644 index 00000000..3d2aa0c2 --- /dev/null +++ b/module/FmiStudent/src/FmiStudent/Controller/IndexController.php @@ -0,0 +1,21 @@ +I am in index.phtml in the module FmiStudent \ No newline at end of file From 9ebfa72508183a95c75f9ee9285023dc7fb97bef Mon Sep 17 00:00:00 2001 From: alex1234 Date: Fri, 15 Feb 2013 08:00:06 +0000 Subject: [PATCH 130/180] Initial commit --- .gitignore | 9 + LICENSE.txt | 27 + README.md | 33 + composer.json | 22 + composer.phar | Bin 0 -> 570295 bytes config/application.config.php | 15 + config/autoload/.gitignore | 2 + config/autoload/README.md | 8 + config/autoload/global.php | 16 + config/autoload/local.php.dist | 16 + data/cache/.gitignore | 2 + init_autoloader.php | 49 + module/Application/Module.php | 39 + module/Application/config/module.config.php | 91 ++ module/Application/language/ar_SY.mo | Bin 0 -> 5526 bytes module/Application/language/ar_SY.po | 184 +++ module/Application/language/cs_CZ.mo | Bin 0 -> 5005 bytes module/Application/language/cs_CZ.po | 153 +++ module/Application/language/de_DE.mo | Bin 0 -> 5126 bytes module/Application/language/de_DE.po | 153 +++ module/Application/language/en_US.mo | Bin 0 -> 545 bytes module/Application/language/en_US.po | 153 +++ module/Application/language/es_ES.mo | Bin 0 -> 5063 bytes module/Application/language/es_ES.po | 111 ++ module/Application/language/fr_CA.mo | Bin 0 -> 5074 bytes module/Application/language/fr_CA.po | 153 +++ module/Application/language/fr_FR.mo | Bin 0 -> 5077 bytes module/Application/language/fr_FR.po | 153 +++ module/Application/language/it_IT.mo | Bin 0 -> 4922 bytes module/Application/language/it_IT.po | 154 +++ module/Application/language/ja_JP.mo | Bin 0 -> 5185 bytes module/Application/language/ja_JP.po | 140 +++ module/Application/language/nl_NL.mo | Bin 0 -> 4815 bytes module/Application/language/nl_NL.po | 153 +++ module/Application/language/pl_PL.mo | Bin 0 -> 4934 bytes module/Application/language/pl_PL.po | 153 +++ module/Application/language/tr_TR.mo | Bin 0 -> 4785 bytes module/Application/language/tr_TR.po | 153 +++ .../Controller/IndexController.php | 21 + .../view/application/index/index.phtml | 26 + module/Application/view/error/404.phtml | 61 + module/Application/view/error/index.phtml | 62 + module/Application/view/layout/layout.phtml | 57 + public/.htaccess | 7 + public/css/bootstrap-responsive.min.css | 3 + public/css/bootstrap.min.css | 610 +++++++++ public/css/style.css | 37 + public/images/favicon.ico | Bin 0 -> 1406 bytes public/images/zf2-logo.png | Bin 0 -> 738 bytes public/index.php | 12 + public/js/html5.js | 4 + public/js/jquery-1.7.2.min.js | 4 + vendor/.gitignore | 5 + vendor/README.md | 1 + vendor/doctrine/common/.gitignore | 4 + vendor/doctrine/common/.gitmodules | 3 + vendor/doctrine/common/.travis.yml | 5 + vendor/doctrine/common/LICENSE | 504 ++++++++ vendor/doctrine/common/README.md | 12 + vendor/doctrine/common/UPGRADE_TO_2_1 | 39 + vendor/doctrine/common/UPGRADE_TO_2_2 | 61 + vendor/doctrine/common/build.properties | 6 + vendor/doctrine/common/build.xml | 59 + vendor/doctrine/common/composer.json | 21 + .../Common/Annotations/Annotation.php | 75 ++ .../Annotations/Annotation/Attribute.php | 47 + .../Annotations/Annotation/Attributes.php | 37 + .../Annotation/IgnoreAnnotation.php | 44 + .../Annotations/Annotation/Required.php | 33 + .../Common/Annotations/Annotation/Target.php | 105 ++ .../Annotations/AnnotationException.php | 111 ++ .../Common/Annotations/AnnotationReader.php | 303 +++++ .../Common/Annotations/AnnotationRegistry.php | 129 ++ .../Common/Annotations/CachedReader.php | 179 +++ .../Doctrine/Common/Annotations/DocLexer.php | 140 +++ .../Doctrine/Common/Annotations/DocParser.php | 891 +++++++++++++ .../Common/Annotations/FileCacheReader.php | 209 +++ .../Common/Annotations/IndexedReader.php | 94 ++ .../Doctrine/Common/Annotations/PhpParser.php | 203 +++ .../Doctrine/Common/Annotations/Reader.php | 35 + .../Annotations/SimpleAnnotationReader.php | 152 +++ .../lib/Doctrine/Common/Cache/ApcCache.php | 97 ++ .../lib/Doctrine/Common/Cache/ArrayCache.php | 96 ++ .../lib/Doctrine/Common/Cache/Cache.php | 102 ++ .../Doctrine/Common/Cache/CacheProvider.php | 188 +++ .../Doctrine/Common/Cache/MemcacheCache.php | 121 ++ .../Doctrine/Common/Cache/MemcachedCache.php | 124 ++ .../Doctrine/Common/Cache/WinCacheCache.php | 92 ++ .../lib/Doctrine/Common/Cache/XcacheCache.php | 110 ++ .../Doctrine/Common/Cache/ZendDataCache.php | 84 ++ .../lib/Doctrine/Common/ClassLoader.php | 262 ++++ .../Common/Collections/ArrayCollection.php | 447 +++++++ .../Common/Collections/Collection.php | 243 ++++ .../lib/Doctrine/Common/CommonException.php | 28 + .../common/lib/Doctrine/Common/Comparable.php | 47 + .../common/lib/Doctrine/Common/EventArgs.php | 69 + .../lib/Doctrine/Common/EventManager.php | 136 ++ .../lib/Doctrine/Common/EventSubscriber.php | 45 + .../common/lib/Doctrine/Common/Lexer.php | 266 ++++ .../Doctrine/Common/NotifyPropertyChanged.php | 45 + .../Persistence/AbstractManagerRegistry.php | 224 ++++ .../Common/Persistence/ConnectionRegistry.php | 63 + .../Persistence/Event/LifecycleEventArgs.php | 77 ++ .../Event/LoadClassMetadataEventArgs.php | 76 ++ .../Persistence/Event/ManagerEventArgs.php | 59 + .../Persistence/Event/OnClearEventArgs.php | 84 ++ .../Persistence/Event/PreUpdateEventArgs.php | 129 ++ .../Common/Persistence/ManagerRegistry.php | 112 ++ .../Mapping/AbstractClassMetadataFactory.php | 359 ++++++ .../Persistence/Mapping/ClassMetadata.php | 165 +++ .../Mapping/ClassMetadataFactory.php | 74 ++ .../Mapping/Driver/AnnotationDriver.php | 214 ++++ .../Mapping/Driver/DefaultFileLocator.php | 169 +++ .../Persistence/Mapping/Driver/FileDriver.php | 178 +++ .../Mapping/Driver/FileLocator.php | 69 + .../Mapping/Driver/MappingDriver.php | 56 + .../Mapping/Driver/MappingDriverChain.php | 125 ++ .../Persistence/Mapping/Driver/PHPDriver.php | 70 ++ .../Mapping/Driver/StaticPHPDriver.php | 131 ++ .../Mapping/Driver/SymfonyFileLocator.php | 198 +++ .../Persistence/Mapping/MappingException.php | 57 + .../Persistence/Mapping/ReflectionService.php | 80 ++ .../Mapping/RuntimeReflectionService.php | 102 ++ .../Mapping/StaticReflectionService.php | 107 ++ .../Common/Persistence/ObjectManager.php | 143 +++ .../Common/Persistence/ObjectManagerAware.php | 49 + .../Common/Persistence/ObjectRepository.php | 78 ++ .../Common/Persistence/PersistentObject.php | 233 ++++ .../lib/Doctrine/Common/Persistence/Proxy.php | 60 + .../Common/PropertyChangedListener.php | 48 + .../lib/Doctrine/Common/Util/ClassUtils.php | 103 ++ .../common/lib/Doctrine/Common/Util/Debug.php | 123 ++ .../lib/Doctrine/Common/Util/Inflector.php | 72 ++ .../common/lib/Doctrine/Common/Version.php | 55 + vendor/doctrine/common/phpunit.xml.dist | 31 + vendor/doctrine/common/tests/.gitignore | 3 + .../Common/Annotations/AbstractReaderTest.php | 538 ++++++++ .../Annotations/AnnotationReaderTest.php | 13 + .../Common/Annotations/CachedReaderTest.php | 56 + .../Tests/Common/Annotations/DocLexerTest.php | 27 + .../Common/Annotations/DocParserTest.php | 1118 +++++++++++++++++ .../Annotations/FileCacheReaderTest.php | 40 + .../Annotation/AnnotWithDefaultValue.php | 10 + .../Fixtures/Annotation/Autoload.php | 10 + .../Annotations/Fixtures/Annotation/Route.php | 11 + .../Fixtures/Annotation/Secure.php | 18 + .../Fixtures/Annotation/Template.php | 14 + .../Fixtures/Annotation/Version.php | 11 + .../Fixtures/AnnotationTargetAll.php | 14 + .../Fixtures/AnnotationTargetAnnotation.php | 14 + .../Fixtures/AnnotationTargetClass.php | 15 + .../Fixtures/AnnotationTargetMethod.php | 15 + .../AnnotationTargetPropertyMethod.php | 14 + .../Fixtures/AnnotationWithAttributes.php | 119 ++ .../AnnotationWithRequiredAttributes.php | 50 + ...ithRequiredAttributesWithoutContructor.php | 24 + .../AnnotationWithTargetSyntaxError.php | 11 + .../Fixtures/AnnotationWithVarType.php | 62 + .../Annotations/Fixtures/ClassDDC1660.php | 30 + ...assWithAnnotationWithTargetSyntaxError.php | 21 + .../ClassWithAnnotationWithVarType.php | 31 + .../ClassWithFullyQualifiedUseStatements.php | 11 + ...lassWithInvalidAnnotationTargetAtClass.php | 17 + ...assWithInvalidAnnotationTargetAtMethod.php | 20 + ...sWithInvalidAnnotationTargetAtProperty.php | 24 + .../ClassWithValidAnnotationTarget.php | 41 + .../Annotations/Fixtures/Controller.php | 300 +++++ ...erentNamespacesPerFileWithClassAsFirst.php | 15 + ...ferentNamespacesPerFileWithClassAsLast.php | 15 + ...EqualNamespacesPerFileWithClassAsFirst.php | 13 + .../EqualNamespacesPerFileWithClassAsLast.php | 12 + ...lobalNamespacesPerFileWithClassAsFirst.php | 12 + ...GlobalNamespacesPerFileWithClassAsLast.php | 12 + .../InvalidAnnotationUsageButIgnoredClass.php | 14 + .../Fixtures/InvalidAnnotationUsageClass.php | 10 + .../Fixtures/MultipleClassesInFile.php | 9 + .../MultipleImportsInUseStatement.php | 10 + .../NamespaceAndClassCommentedOut.php | 20 + .../NamespaceWithClosureDeclaration.php | 15 + .../Fixtures/NamespacedSingleClassLOC1000.php | 1009 +++++++++++++++ .../Annotations/Fixtures/NoAnnotation.php | 5 + .../Fixtures/NonNamespacedClass.php | 10 + .../Fixtures/SingleClassLOC1000.php | 1006 +++++++++++++++ .../Annotations/Fixtures/TestInterface.php | 13 + .../Common/Annotations/PerformanceTest.php | 194 +++ .../Common/Annotations/PhpParserTest.php | 179 +++ .../SimpleAnnotationReaderTest.php | 97 ++ .../Common/Annotations/Ticket/DCOM55Test.php | 65 + .../Annotations/Ticket/DCOM58Entity.php | 8 + .../Common/Annotations/Ticket/DCOM58Test.php | 112 ++ .../Common/Annotations/TopLevelAnnotation.php | 8 + .../Tests/Common/Cache/ApcCacheTest.php | 20 + .../Tests/Common/Cache/ArrayCacheTest.php | 13 + .../Doctrine/Tests/Common/Cache/CacheTest.php | 87 ++ .../Tests/Common/Cache/MemcacheCacheTest.php | 38 + .../Tests/Common/Cache/MemcachedCacheTest.php | 40 + .../Tests/Common/Cache/WinCacheCacheTest.php | 20 + .../Tests/Common/Cache/XcacheCacheTest.php | 20 + .../Tests/Common/Cache/ZendDataCacheTest.php | 20 + .../Doctrine/Tests/Common/ClassLoaderTest.php | 45 + .../Common/ClassLoaderTest/ClassA.class.php | 6 + .../Common/ClassLoaderTest/ClassB.class.php | 6 + .../Common/ClassLoaderTest/ClassC.class.php | 6 + .../Tests/Common/ClassLoaderTest/ClassD.php | 5 + .../Common/Collections/CollectionTest.php | 195 +++ .../Tests/Common/DoctrineExceptionTest.php | 0 .../Tests/Common/EventManagerTest.php | 88 ++ .../Persistence/Mapping/ChainDriverTest.php | 94 ++ .../Mapping/ClassMetadataFactoryTest.php | 134 ++ .../Mapping/DefaultFileLocatorTest.php | 90 ++ .../Persistence/Mapping/FileDriverTest.php | 142 +++ .../Persistence/Mapping/PHPDriverTest.php | 18 + .../Mapping/RuntimeReflectionServiceTest.php | 70 ++ .../Mapping/StaticPHPDriverTest.php | 35 + .../Mapping/StaticReflectionServiceTest.php | 70 ++ .../Mapping/SymfonyFileLocatorTest.php | 88 ++ .../Persistence/Mapping/_files/TestEntity.php | 3 + .../Persistence/Mapping/_files/global.yml | 1 + .../Persistence/Mapping/_files/stdClass.yml | 1 + .../Persistence/PersistentObjectTest.php | 247 ++++ .../Tests/Common/Util/ClassUtilsTest.php | 100 ++ .../Doctrine/Tests/Common/Util/DebugTest.php | 27 + .../tests/Doctrine/Tests/DoctrineTestCase.php | 10 + .../common/tests/Doctrine/Tests/TestInit.php | 31 + .../common/tests/NativePhpunitTask.php | 246 ++++ vendor/doctrine/common/tests/README.markdown | 27 + 226 files changed, 20736 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 composer.json create mode 100644 composer.phar create mode 100644 config/application.config.php create mode 100644 config/autoload/.gitignore create mode 100644 config/autoload/README.md create mode 100644 config/autoload/global.php create mode 100644 config/autoload/local.php.dist create mode 100644 data/cache/.gitignore create mode 100644 init_autoloader.php create mode 100644 module/Application/Module.php create mode 100644 module/Application/config/module.config.php create mode 100644 module/Application/language/ar_SY.mo create mode 100644 module/Application/language/ar_SY.po create mode 100644 module/Application/language/cs_CZ.mo create mode 100644 module/Application/language/cs_CZ.po create mode 100644 module/Application/language/de_DE.mo create mode 100644 module/Application/language/de_DE.po create mode 100644 module/Application/language/en_US.mo create mode 100644 module/Application/language/en_US.po create mode 100644 module/Application/language/es_ES.mo create mode 100644 module/Application/language/es_ES.po create mode 100644 module/Application/language/fr_CA.mo create mode 100644 module/Application/language/fr_CA.po create mode 100644 module/Application/language/fr_FR.mo create mode 100644 module/Application/language/fr_FR.po create mode 100644 module/Application/language/it_IT.mo create mode 100644 module/Application/language/it_IT.po create mode 100644 module/Application/language/ja_JP.mo create mode 100644 module/Application/language/ja_JP.po create mode 100644 module/Application/language/nl_NL.mo create mode 100644 module/Application/language/nl_NL.po create mode 100644 module/Application/language/pl_PL.mo create mode 100644 module/Application/language/pl_PL.po create mode 100644 module/Application/language/tr_TR.mo create mode 100644 module/Application/language/tr_TR.po create mode 100644 module/Application/src/Application/Controller/IndexController.php create mode 100644 module/Application/view/application/index/index.phtml create mode 100644 module/Application/view/error/404.phtml create mode 100644 module/Application/view/error/index.phtml create mode 100644 module/Application/view/layout/layout.phtml create mode 100644 public/.htaccess create mode 100644 public/css/bootstrap-responsive.min.css create mode 100644 public/css/bootstrap.min.css create mode 100644 public/css/style.css create mode 100644 public/images/favicon.ico create mode 100644 public/images/zf2-logo.png create mode 100644 public/index.php create mode 100644 public/js/html5.js create mode 100644 public/js/jquery-1.7.2.min.js create mode 100644 vendor/.gitignore create mode 100644 vendor/README.md create mode 100644 vendor/doctrine/common/.gitignore create mode 100644 vendor/doctrine/common/.gitmodules create mode 100644 vendor/doctrine/common/.travis.yml create mode 100644 vendor/doctrine/common/LICENSE create mode 100644 vendor/doctrine/common/README.md create mode 100644 vendor/doctrine/common/UPGRADE_TO_2_1 create mode 100644 vendor/doctrine/common/UPGRADE_TO_2_2 create mode 100644 vendor/doctrine/common/build.properties create mode 100644 vendor/doctrine/common/build.xml create mode 100644 vendor/doctrine/common/composer.json create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/CommonException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Comparable.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventManager.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Lexer.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Version.php create mode 100644 vendor/doctrine/common/phpunit.xml.dist create mode 100644 vendor/doctrine/common/tests/.gitignore create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/CachedReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Autoload.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Route.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Secure.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetAll.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetPropertyMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithAttributes.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithTargetSyntaxError.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithVarType.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithAnnotationWithTargetSyntaxError.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithAnnotationWithVarType.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithFullyQualifiedUseStatements.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtProperty.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithValidAnnotationTarget.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Controller.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/EqualNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/EqualNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/GlobalNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/GlobalNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/InvalidAnnotationUsageButIgnoredClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/InvalidAnnotationUsageClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/MultipleClassesInFile.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/MultipleImportsInUseStatement.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespaceAndClassCommentedOut.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespaceWithClosureDeclaration.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespacedSingleClassLOC1000.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NonNamespacedClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/SingleClassLOC1000.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PerformanceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Test.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/CacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassB.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassC.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassD.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/CollectionTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/TestInit.php create mode 100644 vendor/doctrine/common/tests/NativePhpunitTask.php create mode 100644 vendor/doctrine/common/tests/README.markdown diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..ad907fa5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +nbproject +._* +.~lock.* +.buildpath +.DS_Store +.idea +.project +.settings +composer.lock diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..36e97601 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,27 @@ +Copyright (c) 2005-2012, Zend Technologies USA, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Zend Technologies USA, Inc. nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..4e7d164a --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +ZendSkeletonApplication +======================= + +Introduction +------------ +This is a simple, skeleton application using the ZF2 MVC layer and module +systems. This application is meant to be used as a starting place for those +looking to get their feet wet with ZF2. + + +Installation +------------ + +Using Composer (recommended) +---------------------------- +The recommended way to get a working copy of this project is to clone the repository +and use composer to install dependencies: + + cd my/project/dir + git clone git://github.com/zendframework/ZendSkeletonApplication.git + cd ZendSkeletonApplication + php composer.phar install + +Using Git submodules +-------------------- +Alternatively, you can install using native git submodules: + + git clone git://github.com/zendframework/ZendSkeletonApplication.git --recursive + +Virtual Host +------------ +Afterwards, set up a virtual host to point to the public/ directory of the +project and you should be ready to go! diff --git a/composer.json b/composer.json new file mode 100644 index 00000000..b70734ed --- /dev/null +++ b/composer.json @@ -0,0 +1,22 @@ +{ + "name": "zendframework/skeleton-application", + "description": "Skeleton Application for ZF2", + "license": "BSD-3-Clause", + "keywords": [ + "framework", + "zf2" + ], + "homepage": "http://framework.zend.com/", + "repositories": [ + { + "type": "composer", + "url": "http://packages.zendframework.com/" + } + ], + "require": { + "php": ">=5.3.3", + "zendframework/zendframework": "2.*", + "zendframework/zendservice-recaptcha": "2.*", + "doctrine/common": ">=2.1" + } +} diff --git a/composer.phar b/composer.phar new file mode 100644 index 0000000000000000000000000000000000000000..48edaa6149f3581df05a06f283f27ad50ff879de GIT binary patch literal 570295 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 literal 0 HcmV?d00001 diff --git a/config/application.config.php b/config/application.config.php new file mode 100644 index 00000000..6504dea7 --- /dev/null +++ b/config/application.config.php @@ -0,0 +1,15 @@ + array( + 'Application', + ), + 'module_listener_options' => array( + 'config_glob_paths' => array( + 'config/autoload/{,*.}{global,local}.php', + ), + 'module_paths' => array( + './module', + './vendor', + ), + ), +); diff --git a/config/autoload/.gitignore b/config/autoload/.gitignore new file mode 100644 index 00000000..1a83fda6 --- /dev/null +++ b/config/autoload/.gitignore @@ -0,0 +1,2 @@ +local.php +*.local.php diff --git a/config/autoload/README.md b/config/autoload/README.md new file mode 100644 index 00000000..4e504db0 --- /dev/null +++ b/config/autoload/README.md @@ -0,0 +1,8 @@ +About this directory: +===================== + +By default, this application is configured to load all configs in +`./config/autoload/{,*.}{global,local}.php`. Doing this provides a +location for a developer to drop in configuration override files provided by +modules, as well as cleanly provide individual, application-wide config files +for things like database connections, etc. diff --git a/config/autoload/global.php b/config/autoload/global.php new file mode 100644 index 00000000..1473720f --- /dev/null +++ b/config/autoload/global.php @@ -0,0 +1,16 @@ +add('Zend', $zf2Path . '/Zend'); + } else { + include $zf2Path . '/Zend/Loader/AutoloaderFactory.php'; + Zend\Loader\AutoloaderFactory::factory(array( + 'Zend\Loader\StandardAutoloader' => array( + 'autoregister_zf' => true + ) + )); + } +} + +if (!class_exists('Zend\Loader\AutoloaderFactory')) { + throw new RuntimeException('Unable to load ZF2. Run `php composer.phar install` or define a ZF2_PATH environment variable.'); +} diff --git a/module/Application/Module.php b/module/Application/Module.php new file mode 100644 index 00000000..86d9d4e2 --- /dev/null +++ b/module/Application/Module.php @@ -0,0 +1,39 @@ +getApplication()->getServiceManager()->get('translator'); + $eventManager = $e->getApplication()->getEventManager(); + $moduleRouteListener = new ModuleRouteListener(); + $moduleRouteListener->attach($eventManager); + } + + public function getConfig() + { + return include __DIR__ . '/config/module.config.php'; + } + + public function getAutoloaderConfig() + { + return array( + 'Zend\Loader\StandardAutoloader' => array( + 'namespaces' => array( + __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, + ), + ), + ); + } +} diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php new file mode 100644 index 00000000..a6dd62b8 --- /dev/null +++ b/module/Application/config/module.config.php @@ -0,0 +1,91 @@ + array( + 'routes' => array( + 'home' => array( + 'type' => 'Zend\Mvc\Router\Http\Literal', + 'options' => array( + 'route' => '/', + 'defaults' => array( + 'controller' => 'Application\Controller\Index', + 'action' => 'index', + ), + ), + ), + // The following is a route to simplify getting started creating + // new controllers and actions without needing to create a new + // module. Simply drop new controllers in, and you can access them + // using the path /application/:controller/:action + 'application' => array( + 'type' => 'Literal', + 'options' => array( + 'route' => '/application', + 'defaults' => array( + '__NAMESPACE__' => 'Application\Controller', + 'controller' => 'Index', + 'action' => 'index', + ), + ), + 'may_terminate' => true, + 'child_routes' => array( + 'default' => array( + 'type' => 'Segment', + 'options' => array( + 'route' => '/[:controller[/:action]]', + 'constraints' => array( + 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', + 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', + ), + 'defaults' => array( + ), + ), + ), + ), + ), + ), + ), + 'service_manager' => array( + 'factories' => array( + 'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory', + ), + ), + 'translator' => array( + 'locale' => 'en_US', + 'translation_file_patterns' => array( + array( + 'type' => 'gettext', + 'base_dir' => __DIR__ . '/../language', + 'pattern' => '%s.mo', + ), + ), + ), + 'controllers' => array( + 'invokables' => array( + 'Application\Controller\Index' => 'Application\Controller\IndexController' + ), + ), + 'view_manager' => array( + 'display_not_found_reason' => true, + 'display_exceptions' => true, + 'doctype' => 'HTML5', + 'not_found_template' => 'error/404', + 'exception_template' => 'error/index', + 'template_map' => array( + 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', + 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', + 'error/404' => __DIR__ . '/../view/error/404.phtml', + 'error/index' => __DIR__ . '/../view/error/index.phtml', + ), + 'template_path_stack' => array( + __DIR__ . '/../view', + ), + ), +); diff --git a/module/Application/language/ar_SY.mo b/module/Application/language/ar_SY.mo new file mode 100644 index 0000000000000000000000000000000000000000..fa7ae166939da5c016a79122da666e4ff85e3cf8 GIT binary patch literal 5526 zcmb7|%X1u86~-?l1dzik51s+80fkWU46^K$!#F0$mJ}Q8pt8mZ32b_1u4X#w>7MjM ziYSUIzhp%eVFQ0aFp9=1+p@47$0-)D;jw{Y0oA?9jtx~TS+D_q=XTFS!XYrFo-^I| z+;hHj&Ueo3(p&f4{S(DUb3G*2yOerVhL))ZdT~ zAxGr?Zlykqd=UA5PLLt4~8Ej-^+dXJ-Od& z$PaS=8>HC#Gg5H<6}b!fFQj7Mu6vXk=jXj_K7o7^Sw{X4`2_M8$gd#(ffWDy-j~~- zMV?~+3rO+vOThn=`#&J}bN_psXyje@D)l+!7m$MEDY-}Q+sF@b|NRf-daocQKbuI& z>#vYNQ*RaPe?dx~@4=bi7)O2@c@p_2>~)a*scDiaeoi69j*Aq%Wu(OaGvvpRw~>e0 z_ebQD+&@5)Uqn`slgM8qzmD96vFDJ_ARj?qLrT6fT){cp$t{6MFyHer>`q2z5}eCt+wBYNF9_V>j>}PrLqH5Vjq;Qxl%2L$}$A zBORK^gbSuoRulft-A4ky89H&|*je`= zK*d~HS6gnRqn^dO<7U3SGY*siIQqImZ0L$sT)-#hI-I$C%zlQ>PQO_ z#V$sNlI;vBMQ&`9HpIu!5R)4R;gSuoDV@P@A*67ooij>EZFDCLUNH4oeDy=2P<@8v zNq!=v6}p$5HzM4D~q7J-nr(9WHmj*N!@$dm+hlGb5u&xt6qIe#{`8%j5z9@;$-X@!d!hBghOR*i_8Z{8L?fN7%Mu$AdE_qvQkt91* z#e38EhFK_s@>%0S6Kk4bw|#7lk48$$JTwOM42|u0YNw_YH1Qiu8K*8y(&LznjMp}yAjy2;C*+ci!Q7miFKrKC z(bO#4m@y0x2)f`lOa!C+dGeCCr&t?}7TtMwG}^;2KO3&mcNX1UzUh@wfMwUm?B&OSu`v`&CmAzxOzqS=p!e>pJofmbWBbrM?nH5^8ajSN1VLEQ zRcCR|%Hp$B0@sk+nwd2C*azufVd3kNlA6GkRJbgDXCdVHWKz~)R?n)2&`%<_tU zyynIu-zv=nhPQ{(H_Q@)un`>xD+Y@=%s`=sv!bW`CZne{SUM6UOoXM1KK1mm>eQs3 ztxi;@W(VtsIVx!ARz;Tw4`(@n>a7_bm&RBqkIZ;U=y)ZL({@zRe#hQMhsF=;{O6%Z z{N0E4e(B(dO0T3hvvWGVn%+t;+TPux)Aj5ePfxRUNvCgStLc``&Sxv>Wv4rk{JPNmSQ&+MxteinRy^@{A#v9n!?pXF|m2PAgaK48#?W>z6`L{vwuK8yE%CCQ*_46>AD4*RgP0*i@|d`6kL+>1(9!Iu}G)vsI9k zOGP(`L#Sts3VBzAzPZDmlhZ;Wsn3eu<|!`#rDT(kS||kFyJSQtAmA<+0e3~{u-t=Z$+1ifbOtE;rn%qIJEZtJ@d`tV-n(d%{OTZEEUwcqZ}3eDieQBa zIG{dIMzXe%US=aK<$-uCQr)i))+Hr(ig!(_DPD!cd5x&9FbHQwCRbop(a{6Mc}fM! z8I)fmx&n;wjXGH{qtSo7om#+K!U73gNr1ExBSuPVDGLYtMUW&C>w4Zo^1f>K2{&)y z_SHOop;Q+fm+t)LS_H)WkdVZ0;YZNZhOA4i>`K2|Gyy=|A&w2`!(+ypY_Xk7VzUb} z26`hwI@C@S#;0W>otnOmM!K`@w#^zg-5_}@Id6)o+pGGvcirtXst*UqS8c7pBCP1q zT_VFcgOKkW(<-bY&C)G7tA@(hr_eUIMdFG{)y=1deJF#Wo8Gbs#KA3`t)$(-0a6Sq zAZ=zZ7g}gs&Mw&UlW9EK!3v27c6y_(K;Jjph0LqNJSS2+6oEmL*jTN3duC|@l}D?5 z{~&us71rL)cyZ_nr#EH%4O)(5T(*H0gNsQ2Pa^{Z0z&eXcDHAMVL?G;5!1GZI0U71 z>-m9HoY|s~Pj~r8hV8^`aAa9-ZZKUhW*1Q89P3JR%NZo6=k}Lac?)M, 2012. +# Tawfek Daghistani , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-07 13:58+0300\n" +"Last-Translator: Tawfek Daghistani \n" +"Language-Team: Arabic <>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: English\n" +"X-Poedit-Country: UNITED STATES\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +#: ../view/layout/layout.phtml:6 ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "الصفحة الرئيسية" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "جميع الحقوق محفوظة" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "أهلا بك في %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "" +"Congratulations! You have successfully installed the %sZF2 Skeleton " +"Application%s. You are currently running Zend Framework version %s. This " +"skeleton can serve as a simple starting point for you to begin building your " +"application on ZF2." +msgstr "" +"تهانينا! لقد قمت بتنصيب %sZF2 Skeleton Application%s . أنت الآن تستخدم مكتبة " +"زيند الإصدار %s . هذا التطبيق يمكن أن يكون لك نقطة بداية سهلة في بناء " +"برامجك الخاصة على مكتبة زيند " + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "اشتق مكتبة زيند على GitHub " + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "تابع أخر التطورات" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "" +"Zend Framework 2 is under active development. If you are interested in " +"following the development of ZF2, there is a special ZF2 portal on the " +"official Zend Framework website which provides links to the ZF2 %swiki%s, " +"%sdev blog%s, %sissue tracker%s, and much more. This is a great resource for " +"staying up to date with the latest developments!" +msgstr "" +"مكتبة زيند تخضع للتطوير المستمر , إذا كان لديك الرغبة في متابعة التطورات , " +"بإمكانك تصفح الموقع الرسمي للمكتبة الذي يحتوي على روابط إلى %swiki%s, %sdev " +"blog%s, %sissue tracker%s, ,و المزيد . هذه مصادر رائعة لمتابعة أخر التطورات" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "بوابة التطوير الخاصة ب زيند" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "تعرف على الإضافات" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "" +"The community is working on developing a community site to serve as a " +"repository and gallery for ZF2 modules. The project is available %son GitHub" +"%s. The site is currently live and currently contains a list of some of the " +"modules already available for ZF2." +msgstr "" +"المجتمع البرمجي يعمل على تطوير موقع خاص به ليكون كمصدر و معرض لإضافات ZF2 . " +"هذا المشروع موجود على %son GitHub%s . هذا الموقع يخضع للتطوير المستمر و " +"يحتوي على قائمة من الإضافات الخاصة ب ZF2 " + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "إكتشف إضافات ZF2 " + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "الدعم و المساعدة " + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "" +"If you need any help or support while developing with ZF2, you may reach us " +"via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or " +"feedback you may have regarding the beta releases. Alternatively, you may " +"subscribe and post questions to the %smailing lists%s." +msgstr "" +"إذا كنت تريد الحصول على دعم فني أو مساعدة في تطوير ZF2 , بإمكانك التواصل عبر " +"IRC: %s#zftalk.2 on Freenode%s. نحن نريد أن نسمع منك المزيد من الأسئلة , " +"الأراء و الملاحظات على النسخة التجربية من المكتبة , أو بإمكانك الإشتراك و " +"التفاعل أو وضع الأسئلة في القائمة البريدية %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "تواصل معنا في IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "حصل خطأ ما " + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "مزيد من المعلومات" + +#: ../view/error/index.phtml:11 ../view/error/index.phtml:35 +msgid "File" +msgstr "ملف" + +#: ../view/error/index.phtml:15 ../view/error/index.phtml:39 +msgid "Message" +msgstr "الرسالة" + +#: ../view/error/index.phtml:19 ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "تفاصيل الخطأ" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "الأخطاء السابقة" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "لايوجد خطأ" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "حصل خطأ 404 , الصفحة غير موجودة" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "المتحكم المطلوب غير قادر على إجابة الطلب" + +#: ../view/error/404.phtml:13 +msgid "" +"The requested controller could not be mapped to an existing controller class." +msgstr "لا يمكن ربط المتحكم المطلوب بأي من المتحكمات الموجودة حالياًَ" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "المتحكم المطلوب غير قادر على الإجابة " + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "الرابط المطلوب غير معرف لدى الموجه" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "لا يمكنني التحديد لماذا حصل الخطأ 404 في هذا الوقت " + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "المتحكم " + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "يوصل إلى %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "خطأ برمجي" diff --git a/module/Application/language/cs_CZ.mo b/module/Application/language/cs_CZ.mo new file mode 100644 index 0000000000000000000000000000000000000000..46f2c0f637a83e5aea25000e19c7016663ff5d98 GIT binary patch literal 5005 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 QV;@(@2=$5oVl3(S4+(UTng9R* literal 0 HcmV?d00001 diff --git a/module/Application/language/cs_CZ.po b/module/Application/language/cs_CZ.po new file mode 100644 index 00000000..2485e2d6 --- /dev/null +++ b/module/Application/language/cs_CZ.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-06 13:05+0100\n" +"Last-Translator: David Lukas \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Czech\n" +"X-Poedit-Country: CZECH REPUBLIC\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton aplikace" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Úvod" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Všechna práva vyhrazena." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Vítejte v %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Blahopřejeme! Úspěšně jste nainstalovali %sZF2 Skeleton Application%s. Právě používáte Zend Framework verze %s. Tato kostra aplikace vám poslouží jako jednoduchý výchozí bod, ze kterého můžete vyjít při tvorbě vlastní aplikace nad ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 na GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Sledujte vývoj" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 je aktivně vyvíjen. Chcete-li sledovat vývoj ZF2, máte na oficiálních webových stránkách Zend Framework k dispozici zvláštní portál ZF2, na kterém najdete odkazy na ZF2 %swiki%s, %svývojářský blog%s, %sissue tracker%s a mnoho dalšího. Tento portál je skvělý zdroj aktuálních informací o nejnovějším vývoji!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Vývojářský portál ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Objevte Moduly" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Komunita pracuje na vývoji komunitního webu, který bude sloužit jako archiv a galerie modulů ZF2. Tento projekt je dostupný %sna GitHub%s. Web je aktuálně v provozu a obsahuje seznam některých již dostupných modulů ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Prozkoumejte Moduly ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Pomoc & Podpora" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Budete-li při vývoji se ZF2 potřebovat jakoukoli pomoc nebo podporu, můžete nás zastihnout přes IRC: %s#zftalk.2 na Freenode%s. Budeme rádi za jakékoli vaše otázky nebo připomínky týkající se beta verzí. Případně se také můžete přihlásit k odběru a posílat otázky na naše %se-mailové distribuční seznamy%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Ozvěte se nám na IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Vyskytla se chyba" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Další informace" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Soubor" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Zpráva" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Trasování zásobníku (Stack trace)" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Předchozí výjimky" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Žádná výjimka není k dispozici" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Vyskytla se chyba 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Požadovaný controller nemohl vyřídit požadavek." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Požadovaný controller se nepodařilo namapovat na žádnou existující třídu controlleru." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Požadovaný controller nepodporuje vyřízení (controller not dispatchable)." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "S požadovaným URL nebyla při směrování (routing) nalezena shoda." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Momentálně nedokážeme určit, proč byla vygenerována chyba 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "je mapován na %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Výjimka" + diff --git a/module/Application/language/de_DE.mo b/module/Application/language/de_DE.mo new file mode 100644 index 0000000000000000000000000000000000000000..fcea0366faf48b28a5e7b083f717dc36c6dda9c4 GIT binary patch literal 5126 zcma)3*uf4mr6|b{+*LLC)HQhBcmFejo zs;XzatB4a42M!=15C;Sj%00lr;$U$Zi4zClP7rsH5H}7;{9bj>&UlFvTD$Y6yQ|*c z?|t>=?Gwj-oNztQ|7ZDs`h7|ACFJq<^TG8i@|R5bIEfE$AV0+Y4?kGj{VDP( z?%zU+zTY7~g8VZwVg1|4Rlff9i6q%Zo?vqu`7PuHzG6B0r7%0#aOD zLw*u@38|2GkP^oPDf_>Vd;@(yLE>U^@?-V7=aA2Fe*r0Zd$o}Rl$yDeYb=u$CT2;FPlbcW$YJD`yZ5kDv_U))a zJENk1MPRq9iozB>bs!{ zvUxu>qnNtQ`=h)h010yTcFX1_*|M3tTGdIenS7+q z=;7!kwOfrwr3=Zma%ht4-ROH^NU1LNRbSQ-kgpf1NgsnMt1U@P6C3*C(Q@23)MVA@ zw67|!##XEAx2~*_$S)prsnehxUD$HQ6lG>4zjw_GnaT-R($zPb{9yIlmGKg?7t>vQ z>F9KDXduGCnVxnrt5W%n2^zz>(cYkSJrBkeRGx(F&pq>1$EVJA3`R1l<->v{?AI6? zYMV=Bx%I*0W3mn0bk8I=OLbTbrN=DO9kRb8iwT$H5^b{M%-ELPn_1y}vKz$z;B;z| zJ={&p;jk)f0Ki@e=0pYi7xJnX7I_Q|TQ`Wb$}?4zfjTO9BJJ~{1Cq*0`s(NwaiQ*(qdP|f6a(imi*N)PTvMEl6l! z4S5chyiNKfDe|XS@0r3td%}r#O%6<=YIyBYhFU%C6DjjT$EzKBSm(*nl~T~E$RHG* zNnbgAb;*wAaUjdhF zEW2G>zj`!)iRnbNK__qp03F-Rco0<#$V=UcqV2Sw*nvImm-&Vhs*{(!`p$Y^ksMlT zV4OUXmL67U8^VzdaYyfZATh{c1N){X;t-}8YvpULl^50OSJuwG$oG{M7PfA|C~_hlUH4VBa(?aX`FhB191 z>DJWdm^QdV(EIAb&|EUy(r9kK4XnPgbVC=t3RY|F89l`NEtb+&wo|d$s|yF+76}i$ zymUbA9^Hih+t;@@=fR(CuPn)a0Mgpq9}!G2_rsS*IaKkIqLZ9A;o|MRt=9SZI`Oq@ zTx%1*gvr;``Hl@sueNqd!|c#{+3drOnZH3Nqp%6h%okjS?P=8hnrhD<&H`IgSLruh z%-@g;BHZW2=B@4Zo3G8^>~ip={T)=bR#4VnN;WAqji?O0Aj8d;=|iweSKZ`Z<)?3k z14awba{bZK#;98+?E|NA={lybIfsgNvWb#Lflww&dL}sdpx_*KwI)vHeEKjQOsc}C z{Zne!8s?pj;ZWe)yG=HXPIN0MmsV;9B5PcbwuexQDo{X}#p#SrMp*+{l!9`9WJ=)l z+^`I0UeY&xh`R&$OI`05DABoB1Ou^}o*z}kAS|oy^r7Q5Tre>lAjr)kOl&&HtD?88 zI@;rmbU$HZZ+OI>VsgMKv_CQip(8W2b`cX%Pdmwa;VxRPBMk%~osuEnLVn_dKgQ|n~AW9(6zYG{Q> z{x@VP%k)98(EYL+$cZ{2rDQ2;2LUQ8DJJ0S$}BZ~*ddsV^Wi7GfLp9+q0m^)ZOl_bd_9;xjFHCpF3YIZK&a6%eSp%% zsY?x}4+;T{pg3x*L40Ji!eYq;9s?J!Mzf7?8KlW%ZJ297#P<}*zjQ~kiH zBBvjWDzgRF-NK?>S+WfNbD;!jlB*iFKv8UtIY1-QId+>4i^s@72D3mj&Y?(S&O?f; znUgyahH)+4V$rKt3Jy#Y`yAi;(>L=-SVjqBGD(3xxP+q^ZPN!`3LONng5tViIOnB% z1zAVuhIXWC*z z{JHapDoN?#WcPB;tY&~{&tSTs0{@RX$z&lR3fs7<3nbp%{)Ar~^#(Xvn&1YV5m|D* z=t`GJlaRg!2SjtPlGi?VwGEL3V^LsCX}Mb2aQdL`7j2Xdu=5|GoCSZz1id-QZ3S325l6x zfl%lh9D(^r)QgLxl=\n" +"Language-Team: ZF Contributors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Startseite" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Alle Rechte vorbehalten." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Willkommen zu dem %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Herzlichen Glückwunsch! Sie haben die %sZF2 Skeleton Application%s erfolgreich installiert und benutzen gerade die Version %s des Zend Frameworks. Dieses Gerüst kann Ihnen als Einstiegspunkt, für Ihre weitere Entwicklung, basierend auf dem Zend Framework 2, dienen." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 auf GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Folge der Entwicklung" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Das Zend Framework 2 wird z.Z. aktiv weiterentwickelt. Sollten Sie daran interessiert sein, die Entwicklung von ZF2 zu verfolgen, so bietet Ihnen die offizielle Webseite einen eigens für das Zend Framework 2 eingerichteten Bereich, auf der Sie Verlinkungen zum ZF2 %sWiki%s, %sEntwickler Blog%s, einem %sFehlerverfolgungssystem%s und noch vielem mehr finden. Dieser Bereich ist eine hervorragende Quelle um stets aktuell zu bleiben." + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Entwickler Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Entdecken Sie Module" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Die Community arbeitet momentan an einer Community Seite, welche als Galerie für ZF2 Module dient. Dieses Projekt ist %sauf GitHub%s verfügbar. Die Webseite ist bereits Online und enthält eine Liste mit schon veröffentlichten Modulen für das Zend Framework 2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Erkunden Sie ZF2 Module" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Hilfe & Support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Sollten Sie Hilfe jeglicher Art bei der Entwicklung mit dem Zend Framework 2 benötigen, kontaktieren Sie uns doch einfach über das IRC: %s#zftalk.2 on Freenode%s. Wir freuen uns darauf, Ihnen bei Ihren Fragen zu helfen oder aber auch Ihre Meinung bezüglich der Beta Versionen zu hören. Alternativ können Sie auch die %smailing lists%s abonnieren und Ihre Fragen dort stellen." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Schreiben Sie uns im IRC an" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Ein Fehler ist aufgetreten" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Zusätzliche Information" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Datei" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Meldung" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stapelüberwachung" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Vorherige Ausnahme" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Es ist keine Ausnahme verfügbar" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Es trat ein 404 Fehler auf" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Der angeforderte Controller war nicht in der Lage die Anfrage zu verarbeiten." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Der angeforderte Controller konnte keiner Controller Klasse zugeordnet werden." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Der angeforderte Controller ist nicht aufrufbar." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Für die angeforderte URL konnte keine Übereinstimmung gefunden werden." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Zu diesem Zeitpunkt ist es uns nicht möglich zu bestimmen, warum ein 404 Fehler aufgetreten ist." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "wird aufgelöst in %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Ausnahme" + diff --git a/module/Application/language/en_US.mo b/module/Application/language/en_US.mo new file mode 100644 index 0000000000000000000000000000000000000000..972a28ab34c2f0d90cabf56f0d021c5f205bbc09 GIT binary patch literal 545 zcmaJ+O;5r=5XI=JN6#Mi;L*WCV!(=quaXc!i4ehb)vOfK!O`$uD#=6e|OmacsLHr?6s=z73-+k!ZznDgs*g(XHw}45ig~6 zNSCu{0L@ZYSY4onkZmPOr-5kB6?qRZF_\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: English\n" +"X-Poedit-Country: UNITED STATES\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "" + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "" + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "" + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "" + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "" + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "" + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "" + diff --git a/module/Application/language/es_ES.mo b/module/Application/language/es_ES.mo new file mode 100644 index 0000000000000000000000000000000000000000..3728554767333faa67772174898cf3de1d245970 GIT binary patch literal 5063 zcmai&&5s;M8OAG+@UaO55=@*)yz{h}at&GPZZ|3a_*Bt}$2$siwPjro25} z?XK=w&x!+QB*X>&fJh*bgQZB303jq0djJjyP8@TMgv5~pT;TUs_k8SPk&$QLsp+cs z`+e#ezx~vsKT*6i@8{(Gh*D=nzK1`&{)qe-@=wT*Bj0Y<|3rS2_0oHl`Umnk6?8-$U|G{fIwLCLWcjV*9{~#6T9)F)wt9*Qd!&}I&A-l*QA}=C;gS>$J7gFqh`2&sq9po*} z-$ja@-{Jf_tp9@i1nXa7MB@J|^3%w7kYfL_CzSd(@>!(Bf9gX`UNlnHt4PV~B_t-* z9i*J=BhMlakP^>Nk+`mYg?tUWzeURaC!bVm8TkzI6!H>M{Mc#NcahJt{yy?W&ixE2 zasHVi>>!sY(i!A;k>`;=Kwd%~AwP$Fgkp$)&m$|&_mEP*U*Hr=MVX@?h?p;t518Et&aZX6{pKO&s{#ycWj>Ojna(lfiL&<*p>lTQPBEzG~l$Gcyyvr+1ta^gCmDhbcaJlZ+E=%P(-CI_^vV9VY$jZiOSEdc zv}5O4+iBr~dRR-Uol1hLN|RW%OALu0jq2Q0bal|uh@uyz3&}PMn}Vxi(iZx$w8Z2p zUru6x1DOmyOG8S}jGB&;rnb5${au?>Vrv!(g_?Cp)BH5Im|@d=YBI7K_0PXb=wHJu zG82+D?e}z`n?y=ZTf^F9^hSzv)7(v6>&66>HrAcayLIzAk=9wNb6-(h4R|C&9`tE1 zU(2waJR&YMBXsg)Q3yPET&5&=Cuv>WotZ$9B`0$S7M>q4>f%M}LLpvA&EI8voy#V% zIXx89(5mmM+Z5a6QK_X-M=mF!6?@2Y<;dH?kR(M=73%|=Td+`o^0v)rlc*Z7I}Tf` z%Rxz*7hphdGuS3mCwEFg>pTTzOd>-v?JbEaM(($piRx^ooo_Zb$XZ0;>F_UHM@u)E)UxVq zg@H>um+L|3?D{pmwEfy{=Zbg+_I0jeb4{AWeb-H>I=iLG0}=RgP4`lt?RnkfW*X>=Ca#PuUL6STb?L6JE?qbIpa$_e zyVi^dVnbh%>2m!V9YJ3_-0P6{iifWrQo`oY*5=mwJn(bfl_fbub98nm1%Xude)Xjy z114V4Oi>wZb?MgbM(6x|pZK|F%g%b9c!BmceZKFinL8xtTb*rh;T4^4*a;AshU*M8 zy4wite8XjK0_JtNrn~bmr-7~Mox2YB{YS*WpF6Pa^*<{FvhWU{F@K9~)_pfhQ zsEgxJfRSIUxg0>cO+d4S-3?IF0+PE@~@aN9ttMOqmncLkSeVEfT03 z?BkH(0xpjpkPl0674)NkAyF7?W2iRSz1s0)My60UV}07oO?Ncm zHPPt;N~gboXH#PKMRh%LE_hjL(x!@nHhpt9R5{gSN9G0Rmnq4cw`NxZSS<{-v`(%P zS|iL*a=v?N<7~s3rAekN&W4uRE!4jq!Fk{Lmf}4GUU6RVC=xun&*p#*^=N_N_Ke!G zkICkKdopwAcf0Seg)yR`Y-=!Naz3n literal 0 HcmV?d00001 diff --git a/module/Application/language/es_ES.po b/module/Application/language/es_ES.po new file mode 100644 index 00000000..5170d3ce --- /dev/null +++ b/module/Application/language/es_ES.po @@ -0,0 +1,111 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-06 19:07+0100\n" +"PO-Revision-Date: 2012-07-06 19:09+0100\n" +"Last-Translator: Adolfo Abegg \n" +"Language-Team: ZF Contributors \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: Spanish\n" +"X-Poedit-Country: SPAIN\n" +"X-Poedit-SearchPath-0: ..\n" + +msgid "Skeleton Application" +msgstr "Aplicación Esqueleto" + +msgid "Home" +msgstr "Inicio" + +msgid "All rights reserved." +msgstr "Todos los derechos reservados" + +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenido al %sZend Framework 2%s" + +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "¡Felicitaciones! Haz instalado correctamente el %sla aplicación esqueleto del ZF2%s. Estás corriendo la versión %s del Zend Framework. Este esqueleto te servirá como un punto de inicio sencillo para empezar a construir tu aplicación con el ZF2." + +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Hacer un Fork del Zend Framework 2 en GitHub" + +msgid "Follow Development" +msgstr "Seguir el Desarrollo" + +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "El Zend Framework 2 está en pleno desarrollo. Si estás interesado en seguir el desarrollo del ZF2, existe un portal especial para el ZF2 en el sitio web oficial del Zend Framework el cual provee enlaces %sa la Wiki%s, %sal Blog de desarrollo%s, %sal issue tracker%s y mucho más. Este es un gran recurso para mantenerte al día con los últimos avances en el desarrollo!" + +msgid "ZF2 Development Portal" +msgstr "Portal de Desarrollo del ZF2" + +msgid "Discover Modules" +msgstr "Descubre Módulos" + +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La comunidad está trabajando en el desarrollo de una web comunitaria que servirá de repositorio y galería de los módulos del ZF2. El proyecto está disponible %sen GitHub%s. El sitio web está en línea y actualmente posee una lista de algunos módulos que ya están disponibles para el ZF2." + +msgid "Explore ZF2 Modules" +msgstr "Explora los módulos del ZF2" + +msgid "Help & Support" +msgstr "Ayuda & Soporte" + +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si necesitas alguna ayuda o soporte mientras estás desarrollando con el ZF2, puedes encontrarnos via IRC: %s#zftalk.2 en Freenode%s. Nos encantaría leer tus preguntas o cualquier feedback que puedas tener en relación a los lanzamientos de las versiones beta. También puedes subscribirte y enviar preguntas %sa la lista de correos%s" + +msgid "Ping us on IRC" +msgstr "Escríbenos en el IRC" + +msgid "An error occurred" +msgstr "Ha ocurrido un error" + +msgid "Additional information" +msgstr "Información adicional" + +msgid "File" +msgstr "Archivo" + +msgid "Message" +msgstr "Mensaje" + +msgid "Stack trace" +msgstr "Seguimiento de la pila (stack trace)" + +msgid "Previous exceptions" +msgstr "Excepciones anteriores" + +msgid "No Exception available" +msgstr "No hay ninguna Excepción disponible." + +msgid "A 404 error occurred" +msgstr "Ha ocurrido un error 404" + +msgid "The requested controller was unable to dispatch the request." +msgstr "El controlador solicitado no pudo ejecutar la petición." + +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "El controlador solicitado no se pudo mapear con una clase de controlador existente." + +msgid "The requested controller was not dispatchable." +msgstr "El controlador solicitado no es ejecutable." + +msgid "The requested URL could not be matched by routing." +msgstr "El ruteador no ha encontrado la ruta para la URL solicitada." + +msgid "We cannot determine at this time why a 404 was generated." +msgstr "No pudimos determinar por qué un error 404 ha sido generado." + +msgid "Controller" +msgstr "Controller" + +msgid "resolves to %s" +msgstr "se resuelve a %s" + +msgid "Exception" +msgstr "Excepción" + diff --git a/module/Application/language/fr_CA.mo b/module/Application/language/fr_CA.mo new file mode 100644 index 0000000000000000000000000000000000000000..956a0d9d90577e1c8366e18ddc2efc7397c014ef GIT binary patch literal 5074 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\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: CANADA\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Une erreur 404 est survenue" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Le contrôleur demandé n'a pas pu acheminer la requête." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Le contrôleur demandé ne correspond pas à une classe contrôleur existante." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Le contrôleur demandé ne peut être acheminé." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "L'URL demandée n'a pas pu trouver de route correspondante." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nous ne pouvons pas déterminer pour le moment pourquoi une 404 a été générée." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Contrôleur" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "résout en %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exception" + +#: ../view/error/404.phtml:55 +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +msgid "Stack trace" +msgstr "Pile d'exécution" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Une erreur est survenue" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informations complémentaires" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Fichier" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Message" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Exceptions précédentes" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Aucune exception disponible" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenue dans %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Félicitations ! Vous avez installé %sZF2 Skeleton Application%s avec succès. Vous utilisez actuellement Zend Framework version %s. Cette structure peut vous servir comme point de départ simple pour démarrer la construction de votre application avec ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Faites un Fork de Zend Framework 2 sur GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Suivre le développement" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 est en cours de développement. Si vous êtes intéressé pour suivre l'évolution de ZF2, il existe un portail dédié à ZF2 sur le site officiel Zend Framework qui propose des liens vers le %swiki%s ZF2, le %sblogue de dev%s, le %ssuivi des problèmes%s, et bien plus encore. Il s'agit d'une excellente ressource pour rester à jour sur les dernières évolutions !" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portail sur le développement de ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Découvrez les modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La communauté travaille sur le développement d'un site communautaire avec l'objectif de servir de dépôt et de galerie pour les modules ZF2. Le projet est disponible %ssur GitHub%s. Le site est déjà en ligne, et contient une liste non exhaustive des modules déjà disponibles pour ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Explorer les modules ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aide & support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si vous avez besoin d'aide ou de soutient en développant avec ZF2, vous pouvez nous joindre sur IRC : %s#zftalk.2 sur Freenode%s. Nous aimerions connaître vos questions ou les commentaires que vous pourriez avoir au sujet des versions beta. Sinon, vous pouvez vous abonner, et poser des questions sur la %sliste de diffusion%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Rejoignez-nous sur IRC" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Accueil" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tous droits réservés." + diff --git a/module/Application/language/fr_FR.mo b/module/Application/language/fr_FR.mo new file mode 100644 index 0000000000000000000000000000000000000000..28f1932ad37233a88a93cdd0dc86a9c817716d66 GIT binary patch literal 5077 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 literal 0 HcmV?d00001 diff --git a/module/Application/language/fr_FR.po b/module/Application/language/fr_FR.po new file mode 100644 index 00000000..49f89d92 --- /dev/null +++ b/module/Application/language/fr_FR.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:32-0700\n" +"PO-Revision-Date: 2012-07-05 23:36-0700\n" +"Last-Translator: Evan Coury \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: FRANCE\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Accueil" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tous droits réservés." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenue dans le %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Félicitations ! Vous avez installé avec succès le %sZF2 Skeleton Application%s. Vous utilisez actuellement Zend Framework version %s. Cette structure peut vous servir comme un point de départ simple pour démarrer la construction de votre application avec ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Faites un Fork de Zend Framework 2 sur GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Suivre le développement" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 est en cours de développement. Si vous êtes intéressé pour suivre l'évolution de ZF2, il existe un portail dédié à ZF2 sur le site officiel Zend Framework qui propose des liens vers le %swiki%s ZF2, %sdev blog%s, %ssuivi des problèmes%s, et bien plus encore. Il s'agit d'une excellente ressource pour rester à jour sur les dernières évolutions !" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portail sur le développement de ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Découvrez les modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La communauté travaille sur le développement d'un site communautaire avec l'objectif de servir de dépôt et de galerie pour les modules ZF2. Le projet est disponible %ssur GitHub%s. Le site est déjà en ligne, et contient une liste non exhaustive des modules déjà disponibles pour ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Explorer les modules ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aide & support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si vous avez besoin d'aide ou de support en développant avec ZF2, vous pouvez nous joindre sur IRC : %s#zftalk.2 sur Freenode%s. Nous aimerions avoir vos questions ou vos commentaires que vous pourriez avoir au sujet des versions bêta. Sinon, vous pouvez vous abonner, et poser des questions sur la %sliste de diffusion%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Rejoignez-nous sur IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Une erreur est survenue" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informations complémentaires" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Fichier" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Message" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Pile d'exécution" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Exceptions précédentes" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Aucune exception disponible" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Une erreur 404 est survenue" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Le contrôleur demandé n'a pas pu dispatcher la requête." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Le contrôleur demandé ne correspond pas à une classe existante de contrôleur." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Le contrôleur demandé n'est pas dispatchable." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "L'URL demandée n'a pas pu trouver de route correspondante." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nous ne pouvons pas déterminer pour le moment pourquoi une 404 a été générée." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Contrôleur" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "résout en %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exception" + diff --git a/module/Application/language/it_IT.mo b/module/Application/language/it_IT.mo new file mode 100644 index 0000000000000000000000000000000000000000..3656ac349512a2f60b0ea2ad8658554c27c13cdf GIT binary patch literal 4922 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\n" +"Language-Team: ZF Contributors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,-1,5,-1,-1,-1\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Pagina iniziale" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tutti i diritti sono riservati." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Benvenuto in %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Congratulazioni! Hai appena installato con successo %sZF2 Skeleton Application%s e stai utilizzando la versione %s di Zend Framework. Questa struttura può servirti come semplice punto di riferimento per iniziare a costruire un'applicazione basata su ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Crea un fork di Zend Framework 2 su GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Segui lo sviluppo" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 è in forte sviluppo. Se sei interessato a seguire lo sviluppo di ZF2, è presente un portale che fornisce link al %swiki%s, al %sdev blog%s, all'%sissue tracker%s e a molto altro riguardo a ZF2. Il Portale è un'ottima risorsa per rimanere aggiornati con gli ultimi sviluppi!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portale sullo sviluppo di ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Scopri i Moduli" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La community sta lavorando allo sviluppo di un sito che deve servire come raccolta e gallery di Moduli per ZF2. Il progetto è disponibile %son Github%s. Il sito è visitabile e al momento contiene una lista di alcuni dei Moduli già disponibili per ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Esplora i Moduli di ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aiuto & Supporto" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Qualora ti servisse aiuto o supporto mentre sviluppi con ZF2, puoi contattarci tramite IRC: %s#zftalk.2 on Freenode%s. Ci piacerebbe moltissimo ricevere le tue domande o qualunque feedback tu possa avere riguardo alle beta release. In alternativa, puoi iscriverti e inviare domande alla %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Contattaci su IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Si è verificato un errore" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informazioni aggiuntive" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "File" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Messaggio" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Eccezioni precedenti" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Non è disponibile alcuna eccezione" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Si è verificato un errore 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Il controller richiesto non è stato in grado di elaborare la richiesta." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Non è stato possibile mappare il controller richiesto ad una classe di tipo controller." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Il controller richiesto non è un oggetto dispatchable." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Non è stato possibile effettuare il match dell'indirizzo richiesto tramite routing." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "In questo momento non siamo in grado di determinare perchè sia stato generato un 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "viene risolto in %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Eccezione" + diff --git a/module/Application/language/ja_JP.mo b/module/Application/language/ja_JP.mo new file mode 100644 index 0000000000000000000000000000000000000000..66b6f3ccb4213eae7758f2b6cd6bfb94f6f23a06 GIT binary patch literal 5185 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 literal 0 HcmV?d00001 diff --git a/module/Application/language/ja_JP.po b/module/Application/language/ja_JP.po new file mode 100644 index 00000000..d6a953ee --- /dev/null +++ b/module/Application/language/ja_JP.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 19:30-0700\n" +"PO-Revision-Date: 2012-07-15 08:20+0900\n" +"Last-Translator: sasezaki \n" +"Language-Team: Japanese\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Japanese\n" +"X-Poedit-Country: Japan\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "%sZend Framework 2%s へようこそ" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "おめでとうございます! %sZF2 Skeleton Application%s のインストールに成功しました。 あなたは Zend Framework version %s を動作させています。このスケルトンはZF2上でのアプリケーション構築を始めるためにシンプルなスタートポイントを提供します。" + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "GitHub で Zend Framework 2 をフォーク" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "開発を追う" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 は鋭意開発中です。ZF2の開発進行にご関心がおありでしょうか、Zend Framework公式ウェブサイト上ではZF2特別ポータルがあり、 %swiki%s、 %sdev blog%s、 %sissue tracker%s、 などのZF2関連のものを提供しています。最新の開発状況に追随するためのすばらしいリソースです。" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 開発ポータル" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "モジュールを見つける" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "コミュニティーはZF2モジュールのためのリポジトリとギャラリーを提供するコミュニティーサイトを開発中です。プロジェクトは %s GitHub%s で利用可能です。サイトは現在運営されており、ZF2ですでに利用可能なモジュールのリストを持っています。" + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "ZF2モジュールを探す" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "ヘルプとサポート" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "ZF2 で開発中に何らかのお手伝いやサポートが必要な場合、IRC を通じて私たちと連絡することができます。: %s#zftalk.2 on Freenode%s ベータ版についてあなたが抱えるかもしれない質問やフィードバックを何でも聞きたいと望みます。あるいは、%smailing lists%s を購読したり質問をポストしたりできます。" + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "IRC で呼び出す" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "エラーが発生しました" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "追加の情報" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "ファイル" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "メッセージ" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "スタックトレース" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "前の例外" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "例外が利用できません" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "404エラーが発生しました" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "要求されたコントローラはリクエストをディスパッチできませんでした。" + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "要求されたコントローラは存在するコントローラクラスにマッピングできませんでした。" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "要求されたコントローラはディスパッチ不可能でした。" + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "要求されたURLはルーティングにマッチしませんでした。" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "404が生成された理由について現時点で判断できません。" + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "コントローラ" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "%s に解決" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "例外" + diff --git a/module/Application/language/nl_NL.mo b/module/Application/language/nl_NL.mo new file mode 100644 index 0000000000000000000000000000000000000000..a03a3328cfb393bb53fab0b04298f56255c8086f GIT binary patch literal 4815 zcma)<%Wot{9mfkucsL1xJP40KY85#=vNL$iqAcDJ@UHFbF6)i8_GU?hKsD1fGv(>& zYO1LK|!FFWQj+VOX)yXyD; zee1VxJ#yc76(7y_N%_7*sb>Y>$say%fRBN{0zU-4HC_J={2=Ru-VlQ{UmwquB5o_#W0jyuZ==WAOc~e+i1b zH$k!M&)@^#zd*&g2i~pJIzJ!e@Gkfzunm42d>;G>_yzFqpy>bHdmH)t;2q8%f}-bV z82?+=zX6|S{e6^(|8IaF1^))Y$z5 zDEiNX^8O|${(l2}2)!97`vby6&oL-*eQk`D zbQ%2m6u$@Vvwjm4{huL;BL4>Xis%J-rGAQ0EEQ=^b^vL=;K%tQUVV(O)PTeV_fq~b zJAEV_V&5nDKF(KkXuk51{E5$Ew|qn&W~X|Q^%L@kkHn9%N*}4s*@qOT9DI2CK;ou0 z^~JS|+J@kR_T6qBg3Z)smbuFL!sOZ&Js(C!R%$cPb#VPb6?L%DhOy1sYO^?f`l>Jb z!BlmgPQ`Qj6<_Ot8CxCeZr8@xtMmK_$+0qdZZlmCtX_?;?yT$mq0MdO3%yyEx$7nY ztFfIVm|%6Xuc$a3>Y{K(U%zULOz#9UvJ)SMdTc|)RK&IQ!N5fwXA--n(8*?PqBc6Z zQJG^=WkMx#O7DtFZg;g3QSlm{4TLq6FL2bF%^;n>H zeOBi-s_lDSTc*%$-z#&E1LEZD?T*W>+Tp05=q)?8xi3eysCa}Ur~FzMeJ{G|THR6C zY+mYT%&5Gq_v^Csp;FiU$g1nTWP4!=sVR>1K=$EKY&Pl10EIehG>K0WR}I9X^Xc5k z5LIis16@Zwc1B;neRYFCK7HIHPs4UHVJBEy_{>Ut@7hmhI>%uN*T5R$gVt}>Hj2wp zRQIr@W4gn+f>Z{<_Dx7pmCSc+Wl)@36D?9V^U8*T%oC8Kg=Mks#BOjMi;|3N#cD|t z`kNXW8JCM^xr~1t~Q% zYAQ;K+Uhd+L))!H*W48nHLsAS_$h8t!=^>oeUp(qkzlL6patiuSl+jJh}s3bSN)hOS7FmA|^B~boyjj z3O#sCCM8%WVO`#xn@Ex+CJO_W-cM+Cu_AM^6e}d>|6_Yy$R^P_JCwpO72j5ONwz7H zP)nhXTtPr9_7LaF5x2>JASF^2?R{HVxKN1luFWZvBpR|iNn7iyQAwJYXh84L*d|w} zcS=I*B7>x5O8Cq|)9B_W*%F?S_(@i$btz{g(TM|iE~gSXmbU94 ze=$k;g`X6c9Q3`OYhImnU}8I|+Ta)ngaRGA%tk7z7!sGJJw@7ToVcM|jpzA=5xSH6 zezS5h)&z%^8rmR_q|Zk+(nb*Hl+BZMeJZh%8wg77+EjuTlmnm}uydgI+nQMqB zEV~@fDLI{wu@Kvc{a({it?OCq<>m(2NDMq{{-x_^UodXhyE7Q~TC0>I>@|7cV`# zc7c62O{`i6!4we>eAv);jZmXLFr$vQf%iqfhTB>P){HQBM_;9nT&HGp)XyLHS_HV_ z-ItHaRh!y-VSWaCcdzemFPy#5UR#ml6h!ObsKofn-m5-a=1{|BP3MGYt1sR;*lAr_ z>=WC1Hng^jt`|Dr(3d){TKQ^g&szqF)>rHiT$sh1bS?s?uGqzfnF||wtEN2{FRuC; zN;ulkx3&+iZQs7Rd24Hb@%9Qg1^qnO(Cx*;eJ-HxV2{VGHD0t=)D}!>xWtVfQoV(< zl~8kL3%YXbX`zDYWjg6_{VYZuE0c~;N_Rj&^w|5*u>)VH6Wc+0gjR>{)%7l`JqOs30Yc>-hpe+LWwi9YM ztWJ*uY0MG1Z7AcI9+=6~9cQyjAKGMLnr=!$sr^Wvi52r1hGs64Z?G4)u&*Z)5GjJ` zIP+3bWp+3pSEl!;RdmP@_eI!jl(|BO(XZ-dpZCRKj?(9hUby(5=9zLn&(vqnGn;u7 zqX+VunZxy)cvkL^Xh#;fHPeGVBi7h-UT54E!@7{OGKO@ZH75q2J=2s-kIOR+`wddb zIev&txrre%+hdK$aiHh8jtYI8Dnc{sn*L(a83uPK8yIVX?e%Cqp<7ulPdPWNn3xjf z{ZN~ZFSsZ;Mo!qh8s9d_T(JRat*A25-pnT=Hg*SY*fAzF!;E-5b(Cx{ty2lp%~73I zfhT5}t>sZ>LY{G7?p{%esA6e`nK6Fm@XyIbV#t^5?AQtBKplqvD6nRh!S=&cYpH7H z!^}0pyEM!!IYR`9L^JR`J{710CtoB9bNtfVbNs5%Il%Y&Ng*=#w{=df`>6^m$`TwlVDP$YkTAGFQ yi%X>qJ^lj#Ke;Sp1M#iPR^?lnOg_Tqbif!9(gI@oj3$%IZ6zsBEs|^_3I7HGp4>hF literal 0 HcmV?d00001 diff --git a/module/Application/language/nl_NL.po b/module/Application/language/nl_NL.po new file mode 100644 index 00000000..fa97eae1 --- /dev/null +++ b/module/Application/language/nl_NL.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-24 12:48+0100\n" +"Last-Translator: Walter Tamboer\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Dutch\n" +"X-Poedit-Country: NETHERLANDS\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Applicatie Fundering" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Home" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Alle rechten voorbehouden." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Welkom bij %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Gefeliciteerd! Je hebt de %sZF2 Applicatie Fundering%s succesvol geinstalleerd. Je gebruikt Zend Framework versie %s. Deze fundering biedt je een startpunt om je ZF2 applicatie op voort te bouwen." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 op GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Volg de Ontwikkeling" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 wordt actief ontwikkeld. Als je interesse hebt in het volgen van deze ontwikkelingen dan kun je de ZF2 portaal bezoeken op de officiële website van Zend Framework. Daar staan links naar de ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s en nog veel meer. Het is het perfecte middel om up-to-date te blijven met de ontwikkelingen." + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Ontwikkelaars Portaal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Ontdek Modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "De community werkt aan een eigen community website die dient als een bewaarplaats en galerij voor ZF2 modules. Het project is beschikbaar %sop GitHub%s. De site staat op dit moment live en bevat een lijst met modules die op dit moment beschikbaar zijn voor ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Verken ZF2 Modules" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Hulp & Support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Als je hulp nodig hebt tijdens het ontwikkelen met ZF2, dan kun je ons bereiken via IRC: %s#zftalk.2 op Freenode%s. We beantwoorde met alle liefde je vragen en zouden graag feedback krijgen betreffende de beta releases. Je kunt je ook abonneren op de %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Ping ons via IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Er is een fout opgetreden" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Additionele informatie" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Bestand" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Bericht" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stack trace" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Vorige excepties" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Geen exceptie beschikbaar" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "De pagina kon niet worden gevonden." + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "De opgevraagde controller kon deze aanvraag niet verwerken." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Er is geen mapping beschikbaar voor de opgevraagde controller." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "De opgevraagde controller is niet bruikbaar (dispatchable)." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Er is geen route gevonden die overeenkomt met de opgevraagde URL." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "We kunnen op dit moment niet achterhalen waarom de pagina niet kon worden gevonden." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "verwijst naar %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exceptie" + diff --git a/module/Application/language/pl_PL.mo b/module/Application/language/pl_PL.mo new file mode 100644 index 0000000000000000000000000000000000000000..0df3fc6d1c60bd28da8262ba9698a293a35d4155 GIT binary patch literal 4934 zcmb7`PmCm09mh)r(EsytZD| z6xHG4#*G(^7d@BiGwHn{9biW&yFO7N_T&|s^0JS zet*C3_x3%v{UYL0d>@qW$D-&l!H@I9^=I%4;9tNmf^X07-vd9-{mLhz=-=Rj;ELSe z7Db-}?*l&#J_6ngu7P}_GyL2Go&&!Qet&-d7RV?189(=8!_UDxxc~L--M+sCKg0c> zK+*RPQ0#gKyc2vMjF7wYlTozJ-@6dL06q)$!JmT9fH%NzgZ~9(|HnVo>E8igMScv* zK7Yjc|8W0T@ILPUz$UWa-$9AfJD~V~$6ZnMH}C;a{CyV``S(CnMYrAE`Fl4g{weUQ z;41hqcp4PFL-4cUTi`DH{sa_#|3cXV;Je`0z}s0Q@%zRcp9IDK7s30HdkuV+`+_8F zgTDdS!1qCk%NjiZ!I4*tK z6~j_jbrz)jL+W)`tC8L}%GYshyx*&{tVOf0be5S!RU@NT{To~BY9}?Bsa&BpCzH&^ zLBXo;2MxM3D%e+4NSAd{*kY*OFh!!aN}Zd=m8se{rN>m%_0{gkdgT`yV_m3Vv(jE^ z*VY9#A$$ajlWGh#!PbUTSpjjcvv z(TO0JYocm&JW{n+`&O%S7f){x$cLwUP;Po?qL-aIOor0?EYky`zb%V#m*C=Uv|XBg>$o?I z#QErhN;2B1#Hp&(v59u^A$ECQ7q+6Ry^=x{y(m2rY<*;rw^az*k$Nl*KH18ZZE$cX zoxy)8NU52;t0*aIqb8*ro4As_4qYKphZWKlKgBKEuxQye8Bq=TmycrVSJR91ghWlb zJ>{t;L5b;nW2G}{Bf+>u>=vf=LjXz>@=oQwdhtA-)>)zoSCL!=dBh`L3@9&GOS2sp z5fi!=Ixabx2t7DVCM8%WVLiG!)1D+tOqK>5dEe0LVnt&8M68gUf5`H>kVUfRLMVh` zuD%~#BH6kKN)3gY+k${rtRc>oC2q}#AO%vD-G``bg4z zga*_$jjglj_)1A=T_muKj-^Q!H73;2S91;!u7uAFG|k@pC0oKX5sX5*;{z z=OPuzabjW%`HM-yFZ`vrM9}T++3wY?4m4&!dc=DRfl#3PHZh)xDpKOowWnxX^^HyK zsz1R$j8KEj4ZAz*eNAv^snnG6Ncudl(UwD;b2bmw4XMORP9P{bHlYro@m74RCn0kL zydyU;nPZ439Cg`06p3`UkA>Jq?6YYn^uXQKLMquDY^B*~mRxZ-1W!1ajhc@Y* zs)xR}>o(NN_A9%+(_$Ii*E_?W8)|*+rb-p zB3=w@sIRwcbdEP$>NIU;2Q|99dS<%UBmNcdo|}?N5nIaO&V_Rq&MsqdvcI+>;?zrT zx1HcyW!|j5Imuv-rxlG=dQ*Mp)!nV$Q_FQ?`kpC!XN%Yg+i$3+2DV!HUT@nO=8N7- zriCgKf1b)g;oMWRT(EFqgI<7}M$0#+T@7Wlym;mO=F4Z6FHUiY(CVWN)n7i`;cSXW z+dS^A@uI&HU21)GaAjg=m(^f)`QS<-4I7 zs%JM^xMX^KCTLVct&S~F1I*8KDbhu^w@Keinh@b z&3?&rH~XDLjy}Zz#=@LrxAC-)$)`-~@o}ftW#4Yld6e_nDZc&~^d4b=Z<>3`I%tRf>9scJQedo z3(kHIMagij6ArF0VoB!mo7aah*c8ikfFZgb3--3Xpq_IO!56e6QbTv~=E zXGPWKs?<{mmGH#Vt{}shCFVnChkOn_+e(jBBTReixbjivt&q}2&ZiXik>t{0k{&6~ z1%1p}jmLd8=Od95nit*=lUNsCTE;Angt1s(x@qIa^$Cf(1Rdh;#xHU)AHL+AAT5sB zYs{Ho#$CB#%`v}N)YTNxS#+%OSKEe>@2sORUslxBU)!2;1KWd!0X?Bel m73B>rjlHx=%QNxL1`-$-PS}moveXqb7miASb}fw+(f\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Polish\n" +"X-Poedit-Country: POLAND\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Szkielet Aplikacji" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Strona startowa" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Wszelkie prawa zastrzeżone." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Witaj w %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Gratulacje! Z powodzeniem zainstalowałeś %sZF2 Skeleton Application%s. Aktualnie używasz Zend Framework w wersji %s. Ten szkielet może służyć jak prosty punkt startowy do budowy Twoich aplikacji na ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Forkuj Zend Framework 2 na GitHub'e" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Śledź prace programistyczne" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 jest w trakcie aktywnych prac programistycznych. Jeśli jesteś zainteresowany śledzeniem jego rozwoju, istnieje specialny portal ZF2 na oficjalnej stronie Zend Framework na którym dostępne są linki do ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, oraz wiele więcej. Jest to świetne miejsce by śledzić najnowsze zmiany!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Development Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Odkryj Moduły" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Społeczność pracuje nad stworzeniem społecznościowego serwisu który posłuży jako repozytorium i galeria dla modułów ZF2. Projekt wkrótce będzie dostępny na %son GitHub%s. Ta strona jest aktualnie online i udostępnia listę niektórych modułów dostępnych dla ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Odkryj Moduły ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Pomoc & Wsparcie" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Jeśli potrzebujesz jakiejkolwiek pomocy lub wsparcia podczas programowania na ZF2, możesz skontaktować się z nami via IRC: %s#zftalk.2 w sieci Freenode%s. Z przyjemnością wysłuchamy wszelkich pytań lub sugestii które możesz mieć odnoście wydań beta. Alternatywnie, możesz zapisać się i wysłać pytanie na %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Wyślij nam wiadomość na IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Wystąpił błąd" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Dodatkowe informacje" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Plik" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Komunikat" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stack trace" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Poprzedni wyjątek" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Brak dostępnego wyjątku" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Wystąpił błąd 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Żądany kontroler nie mógł zmapować żądania." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Żądany kontroler nie mógł być zmapowany na isteniejącą klasę kontrolera." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Żądany kontroler nie mógł zostać zmapowany." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Żądany adres URL nie mógł zostać powiązany z routing'iem." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nie możemy określić tym razem dlaczego wygenerowano błąd 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Kontroler" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "rozwiązuje na %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Wyjątek" + diff --git a/module/Application/language/tr_TR.mo b/module/Application/language/tr_TR.mo new file mode 100644 index 0000000000000000000000000000000000000000..952882142e8f6f0863f0fb0c08efdf31590512d3 GIT binary patch literal 4785 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\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Turkish\n" +"X-Poedit-Country: TURKEY\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Anasayfa" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tüm haklar saklıdır." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "%sZend Framework 2%s'a hoş geldiniz" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Tebrikler! %sZF2 Skeleton Application%s'u başarıyla yüklediniz. Şu anda Zend Framework %s sürüm ile çalışıyorsunuz. Bu iskelet ZF2 üzerinde uygulama oluşturmak için basit bir başlangıç ​​noktası olarak hizmet verebilir." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Zend Framework 2'yi GitHub'da fork edin" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Gelişimi izleyin" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 aktif geliştirilmektedir. Eğer ZF2'nin gelişimi ile ilgileniyorsanız, ZF2 için resmi Zend Framework websitesinde özel portal mevcut, orada ZF2 %swiki%s'ye, %sDEV blog%s'a, %ssorun takibi%s'ne bağlantılarını ve çok daha fazlasını sunar. Bu son gelişmeler ile güncel kalmak için büyük bir kaynaktır!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Development Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Modülleri keşfedin" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Topluluk ZF2 modülleri için bir depo ve galeri olarak hizmet edecek bir topluluk sitesi geliştirme üzerinde çalışıyor. Proje %sGitHub%s'da mevcut. Site şu anda canlı ve ZF2 için bazı mevcut modüllerin listesini içerir." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "ZF2 Modüllerini keşfedin" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Yardım & Destek" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "ZF2 ile geliştirirken herhangi yardım veya desteğe ihtiyacınız varsa, bize IRC: %sFreenode #zftalk.2%s üzerinden ulaşabilirsiniz. Beta sürümleri ile ilgili olabilecek herhangi bir sorunuzu ya da yorumlarınızı duymak isteriz. Alternatif olarak %smailing listelerine%s abone olup sorularınızı sorabilirsiniz." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "IRC bizi pingleyin" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "An error occurred" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Ek bilgiler" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Klasör" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Mesaj" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Denetleyici" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Önceki istisnalar" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "İstisna yok" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Bir 404 hatası oluştu" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Talep edilen denetleyici işlemi işlemesi mümkün değildir." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Talep edilen denetleyiciye uygun denetleyici sınıfı tahsis edilemedi." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Talep edilen denetleyici çağrılabilir değildir." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "İstenen URL yönlendirmede tahsis edilemedi" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Neden 404 hatasının oluştuğunu şu an belirleyemiyoruz." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Denetleyici" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "Buraya çözümlenir: %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "İstisna" + diff --git a/module/Application/src/Application/Controller/IndexController.php b/module/Application/src/Application/Controller/IndexController.php new file mode 100644 index 00000000..a1aafaee --- /dev/null +++ b/module/Application/src/Application/Controller/IndexController.php @@ -0,0 +1,21 @@ + +

translate('Welcome to %sZend Framework 2%s'), '', '') ?>

+
+

translate('Fork Zend Framework 2 on GitHub') ?> »

+

translate('Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2.'), '', '', \Zend\Version\Version::VERSION) ?>

+ +
+ +
+

translate('Follow Development') ?>

+

translate('Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!'), '', '', '', '', '', '') ?>

+

translate('ZF2 Development Portal') ?> »

+
+ +
+

translate('Discover Modules') ?>

+

translate('The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2.'), '', '') ?>

+

translate('Explore ZF2 Modules') ?> »

+
+ +
+

translate('Help & Support') ?>

+

translate('If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We\'d love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s.'), '', '', '', '') ?>

+

translate('Ping us on IRC') ?> »

+
+
diff --git a/module/Application/view/error/404.phtml b/module/Application/view/error/404.phtml new file mode 100644 index 00000000..3edd37a8 --- /dev/null +++ b/module/Application/view/error/404.phtml @@ -0,0 +1,61 @@ +

translate('A 404 error occurred') ?>

+

message ?>

+ +reason) && $this->reason): ?> + +reason) { + case 'error-controller-cannot-dispatch': + $reasonMessage = $this->translate('The requested controller was unable to dispatch the request.'); + break; + case 'error-controller-not-found': + $reasonMessage = $this->translate('The requested controller could not be mapped to an existing controller class.'); + break; + case 'error-controller-invalid': + $reasonMessage = $this->translate('The requested controller was not dispatchable.'); + break; + case 'error-router-no-match': + $reasonMessage = $this->translate('The requested URL could not be matched by routing.'); + break; + default: + $reasonMessage = $this->translate('We cannot determine at this time why a 404 was generated.'); + break; +} +?> + +

+ + + +controller) && $this->controller): ?> + +
+
translate('Controller') ?>:
+
escapeHtml($this->controller) ?> +controller_class) + && $this->controller_class + && $this->controller_class != $this->controller +) { + echo '(' . sprintf($this->translate('resolves to %s'), $this->escapeHtml($this->controller_class)) . ')'; +} +?> +
+
+ + + +exception) && $this->exception): ?> + +

translate('Exception') ?>:

+ +

escapeHtml($this->exception->getMessage()) ?>

+ +

translate('Stack trace') ?>:

+ +
+exception->getTraceAsString() ?>
+
+ + diff --git a/module/Application/view/error/index.phtml b/module/Application/view/error/index.phtml new file mode 100644 index 00000000..5165cd8e --- /dev/null +++ b/module/Application/view/error/index.phtml @@ -0,0 +1,62 @@ +

translate('An error occurred') ?>

+

message ?>

+ +display_exceptions) && $this->display_exceptions): ?> + +exception) && $this->exception instanceof Exception): ?> +
+

translate('Additional information') ?>:

+

exception); ?>

+
+
translate('File') ?>:
+
+
exception->getFile() ?>:exception->getLine() ?>
+
+
translate('Message') ?>:
+
+
exception->getMessage() ?>
+
+
translate('Stack trace') ?>:
+
+
exception->getTraceAsString() ?>
+
+
+exception->getPrevious(); + if ($e) : +?> +
+

translate('Previous exceptions') ?>:

+
    + +
  • +

    +
    +
    translate('File') ?>:
    +
    +
    getFile() ?>:getLine() ?>
    +
    +
    translate('Message') ?>:
    +
    +
    getMessage() ?>
    +
    +
    translate('Stack trace') ?>:
    +
    +
    getTraceAsString() ?>
    +
    +
    +
  • + getPrevious(); + endwhile; + ?> +
+ + + + +

translate('No Exception available') ?>

+ + + + diff --git a/module/Application/view/layout/layout.phtml b/module/Application/view/layout/layout.phtml new file mode 100644 index 00000000..d5af45f6 --- /dev/null +++ b/module/Application/view/layout/layout.phtml @@ -0,0 +1,57 @@ +doctype(); ?> + + + + + headTitle('ZF2 '. $this->translate('Skeleton Application'))->setSeparator(' - ')->setAutoEscape(false) ?> + + headMeta()->appendName('viewport', 'width=device-width, initial-scale=1.0') ?> + + + headLink(array('rel' => 'shortcut icon', 'type' => 'image/vnd.microsoft.icon', 'href' => $this->basePath() . '/images/favicon.ico')) + ->prependStylesheet($this->basePath() . '/css/bootstrap-responsive.min.css') + ->prependStylesheet($this->basePath() . '/css/style.css') + ->prependStylesheet($this->basePath() . '/css/bootstrap.min.css') ?> + + + headScript()->prependFile($this->basePath() . '/js/html5.js', 'text/javascript', array('conditional' => 'lt IE 9',)) + ->prependFile($this->basePath() . '/js/jquery-1.7.2.min.js') ?> + + + + + + + +
+ + content; ?> + +
+ +
+

© 2005 - 2012 by Zend Technologies Ltd. translate('All rights reserved.') ?>

+
+ +
+ + inlineScript() ?> + + diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 00000000..10d71d77 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,7 @@ +RewriteEngine On +RewriteCond %{REQUEST_FILENAME} -s [OR] +RewriteCond %{REQUEST_FILENAME} -l [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteBase /fmi +RewriteRule ^.*$ - [NC,L] +RewriteRule ^.*$ index.php [NC,L] diff --git a/public/css/bootstrap-responsive.min.css b/public/css/bootstrap-responsive.min.css new file mode 100644 index 00000000..bc3f2ab7 --- /dev/null +++ b/public/css/bootstrap-responsive.min.css @@ -0,0 +1,3 @@ + +.hidden{display:none;visibility:hidden;} +@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:768px){.container{width:auto;padding:0 20px;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;}}@media (min-width:768px) and (max-width:980px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .span1{width:42px;} .span2{width:104px;} .span3{width:166px;} .span4{width:228px;} .span5{width:290px;} .span6{width:352px;} .span7{width:414px;} .span8{width:476px;} .span9{width:538px;} .span10{width:600px;} .span11{width:662px;} .span12,.container{width:724px;} .offset1{margin-left:82px;} .offset2{margin-left:144px;} .offset3{margin-left:206px;} .offset4{margin-left:268px;} .offset5{margin-left:330px;} .offset6{margin-left:392px;} .offset7{margin-left:454px;} .offset8{margin-left:516px;} .offset9{margin-left:578px;} .offset10{margin-left:640px;} .offset11{margin-left:702px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.801104972%;} .row-fluid .span2{width:14.364640883%;} .row-fluid .span3{width:22.928176794%;} .row-fluid .span4{width:31.491712705%;} .row-fluid .span5{width:40.055248616%;} .row-fluid .span6{width:48.618784527%;} .row-fluid .span7{width:57.182320438000005%;} .row-fluid .span8{width:65.74585634900001%;} .row-fluid .span9{width:74.30939226%;} .row-fluid .span10{width:82.87292817100001%;} .row-fluid .span11{width:91.436464082%;} .row-fluid .span12{width:99.999999993%;} input.span1,textarea.span1,.uneditable-input.span1{width:32px;} input.span2,textarea.span2,.uneditable-input.span2{width:94px;} input.span3,textarea.span3,.uneditable-input.span3{width:156px;} input.span4,textarea.span4,.uneditable-input.span4{width:218px;} input.span5,textarea.span5,.uneditable-input.span5{width:280px;} input.span6,textarea.span6,.uneditable-input.span6{width:342px;} input.span7,textarea.span7,.uneditable-input.span7{width:404px;} input.span8,textarea.span8,.uneditable-input.span8{width:466px;} input.span9,textarea.span9,.uneditable-input.span9{width:528px;} input.span10,textarea.span10,.uneditable-input.span10{width:590px;} input.span11,textarea.span11,.uneditable-input.span11{width:652px;} input.span12,textarea.span12,.uneditable-input.span12{width:714px;}}@media (max-width:980px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .span1{width:70px;} .span2{width:170px;} .span3{width:270px;} .span4{width:370px;} .span5{width:470px;} .span6{width:570px;} .span7{width:670px;} .span8{width:770px;} .span9{width:870px;} .span10{width:970px;} .span11{width:1070px;} .span12,.container{width:1170px;} .offset1{margin-left:130px;} .offset2{margin-left:230px;} .offset3{margin-left:330px;} .offset4{margin-left:430px;} .offset5{margin-left:530px;} .offset6{margin-left:630px;} .offset7{margin-left:730px;} .offset8{margin-left:830px;} .offset9{margin-left:930px;} .offset10{margin-left:1030px;} .offset11{margin-left:1130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.982905983%;} .row-fluid .span2{width:14.529914530000001%;} .row-fluid .span3{width:23.076923077%;} .row-fluid .span4{width:31.623931624%;} .row-fluid .span5{width:40.170940171000005%;} .row-fluid .span6{width:48.717948718%;} .row-fluid .span7{width:57.264957265%;} .row-fluid .span8{width:65.81196581200001%;} .row-fluid .span9{width:74.358974359%;} .row-fluid .span10{width:82.905982906%;} .row-fluid .span11{width:91.45299145300001%;} .row-fluid .span12{width:100%;} input.span1,textarea.span1,.uneditable-input.span1{width:60px;} input.span2,textarea.span2,.uneditable-input.span2{width:160px;} input.span3,textarea.span3,.uneditable-input.span3{width:260px;} input.span4,textarea.span4,.uneditable-input.span4{width:360px;} input.span5,textarea.span5,.uneditable-input.span5{width:460px;} input.span6,textarea.span6,.uneditable-input.span6{width:560px;} input.span7,textarea.span7,.uneditable-input.span7{width:660px;} input.span8,textarea.span8,.uneditable-input.span8{width:760px;} input.span9,textarea.span9,.uneditable-input.span9{width:860px;} input.span10,textarea.span10,.uneditable-input.span10{width:960px;} input.span11,textarea.span11,.uneditable-input.span11{width:1060px;} input.span12,textarea.span12,.uneditable-input.span12{width:1160px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}} diff --git a/public/css/bootstrap.min.css b/public/css/bootstrap.min.css new file mode 100644 index 00000000..b01f92e6 --- /dev/null +++ b/public/css/bootstrap.min.css @@ -0,0 +1,610 @@ +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} +audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} +audio:not([controls]){display:none;} +html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} +a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +a:hover,a:active{outline:0;} +sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} +sup{top:-0.5em;} +sub{bottom:-0.25em;} +img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;} +button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} +button,input{*overflow:visible;line-height:normal;} +button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} +button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} +input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} +input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} +textarea{overflow:auto;vertical-align:top;} +body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;} +a{color:#0088cc;text-decoration:none;} +a:hover{color:#005580;text-decoration:underline;} +.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} +.row:after{clear:both;} +[class*="span"]{float:left;margin-left:20px;} +.span1{width:60px;} +.span2{width:140px;} +.span3{width:220px;} +.span4{width:300px;} +.span5{width:380px;} +.span6{width:460px;} +.span7{width:540px;} +.span8{width:620px;} +.span9{width:700px;} +.span10{width:780px;} +.span11{width:860px;} +.span12,.container{width:940px;} +.offset1{margin-left:100px;} +.offset2{margin-left:180px;} +.offset3{margin-left:260px;} +.offset4{margin-left:340px;} +.offset5{margin-left:420px;} +.offset6{margin-left:500px;} +.offset7{margin-left:580px;} +.offset8{margin-left:660px;} +.offset9{margin-left:740px;} +.offset10{margin-left:820px;} +.offset11{margin-left:900px;} +.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} +.row-fluid:after{clear:both;} +.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;} +.row-fluid>[class*="span"]:first-child{margin-left:0;} +.row-fluid .span1{width:6.382978723%;} +.row-fluid .span2{width:14.89361702%;} +.row-fluid .span3{width:23.404255317%;} +.row-fluid .span4{width:31.914893614%;} +.row-fluid .span5{width:40.425531911%;} +.row-fluid .span6{width:48.93617020799999%;} +.row-fluid .span7{width:57.446808505%;} +.row-fluid .span8{width:65.95744680199999%;} +.row-fluid .span9{width:74.468085099%;} +.row-fluid .span10{width:82.97872339599999%;} +.row-fluid .span11{width:91.489361693%;} +.row-fluid .span12{width:99.99999998999999%;} +.container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";} +.container:after{clear:both;} +.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";} +.container-fluid:after{clear:both;} +p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;} +.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;} +h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;} +h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;} +h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;} +h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;} +h4,h5,h6{line-height:18px;} +h4{font-size:14px;}h4 small{font-size:12px;} +h5{font-size:12px;} +h6{font-size:11px;color:#999999;text-transform:uppercase;} +.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;} +.page-header h1{line-height:1;} +ul,ol{padding:0;margin:0 0 9px 25px;} +ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} +ul{list-style:disc;} +ol{list-style:decimal;} +li{line-height:18px;} +ul.unstyled{margin-left:0;list-style:none;} +dl{margin-bottom:18px;} +dt,dd{line-height:18px;} +dt{font-weight:bold;} +dd{margin-left:9px;} +hr{margin:18px 0;border:0;border-top:1px solid #e5e5e5;border-bottom:1px solid #ffffff;} +strong{font-weight:bold;} +em{font-style:italic;} +.muted{color:#999999;} +abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;} +blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;} +blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} +blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} +q:before,q:after,blockquote:before,blockquote:after{content:"";} +address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;} +small{font-size:100%;} +cite{font-style:normal;} +code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} +pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;}pre.prettyprint{margin-bottom:18px;} +pre code{padding:0;background-color:transparent;} +form{margin:0 0 18px;} +fieldset{padding:0;margin:0;border:0;} +legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;} +label,input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;} +label{display:block;margin-bottom:5px;color:#333333;} +input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.uneditable-textarea{width:auto;height:auto;} +label input,label textarea,label select{display:block;} +input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:0;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +input[type="file"]{padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;} +select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;} +select{width:220px;background-color:#ffffff;} +select[multiple],select[size]{height:auto;} +input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +textarea{height:auto;} +input[type="hidden"]{display:none;} +.radio,.checkbox{padding-left:18px;} +.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;} +.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} +.radio.inline,.checkbox.inline{display:inline-block;margin-bottom:0;vertical-align:middle;} +.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} +.controls>.radio.inline:first-child,.controls>.checkbox.inline:first-child{padding-top:0;} +input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;} +input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;} +input[type="file"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.input-mini{width:60px;} +.input-small{width:90px;} +.input-medium{width:150px;} +.input-large{width:210px;} +.input-xlarge{width:270px;} +.input-xxlarge{width:530px;} +input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;} +input.span1,textarea.span1,.uneditable-input.span1{width:50px;} +input.span2,textarea.span2,.uneditable-input.span2{width:130px;} +input.span3,textarea.span3,.uneditable-input.span3{width:210px;} +input.span4,textarea.span4,.uneditable-input.span4{width:290px;} +input.span5,textarea.span5,.uneditable-input.span5{width:370px;} +input.span6,textarea.span6,.uneditable-input.span6{width:450px;} +input.span7,textarea.span7,.uneditable-input.span7{width:530px;} +input.span8,textarea.span8,.uneditable-input.span8{width:610px;} +input.span9,textarea.span9,.uneditable-input.span9{width:690px;} +input.span10,textarea.span10,.uneditable-input.span10{width:770px;} +input.span11,textarea.span11,.uneditable-input.span11{width:850px;} +input.span12,textarea.span12,.uneditable-input.span12{width:930px;} +input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;} +.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} +.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;} +.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} +.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} +.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;} +.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} +.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} +.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;} +.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} +input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} +.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;} +.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} +:-moz-placeholder{color:#999999;} +::-webkit-input-placeholder{color:#999999;} +.help-block{margin-top:5px;margin-bottom:0;color:#999999;} +.help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;} +.input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";} +.input-prepend:after,.input-append:after{clear:both;} +.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;} +.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;} +.input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;} +.input-prepend .add-on{*margin-top:1px;} +.input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-append .uneditable-input{border-right-color:#ccc;} +.input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;} +.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;} +.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input{display:inline-block;margin-bottom:0;} +.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;} +.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;} +.control-group{margin-bottom:9px;} +.form-horizontal legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;} +.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";} +.form-horizontal .control-group:after{clear:both;} +.form-horizontal .control-group>label{float:left;width:140px;padding-top:5px;text-align:right;} +.form-horizontal .controls{margin-left:160px;} +.form-horizontal .form-actions{padding-left:160px;} +table{max-width:100%;border-collapse:collapse;border-spacing:0;} +.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;border-top:1px solid #ddd;} +.table th{font-weight:bold;vertical-align:bottom;} +.table td{vertical-align:top;} +.table thead:first-child tr th,.table thead:first-child tr td{border-top:0;} +.table tbody+tbody{border-top:2px solid #ddd;} +.table-condensed th,.table-condensed td{padding:4px 5px;} +.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;} +.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} +.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;} +.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;} +.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;} +.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;} +.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} +table .span1{float:none;width:44px;margin-left:0;} +table .span2{float:none;width:124px;margin-left:0;} +table .span3{float:none;width:204px;margin-left:0;} +table .span4{float:none;width:284px;margin-left:0;} +table .span5{float:none;width:364px;margin-left:0;} +table .span6{float:none;width:444px;margin-left:0;} +table .span7{float:none;width:524px;margin-left:0;} +table .span8{float:none;width:604px;margin-left:0;} +table .span9{float:none;width:684px;margin-left:0;} +table .span10{float:none;width:764px;margin-left:0;} +table .span11{float:none;width:844px;margin-left:0;} +table .span12{float:none;width:924px;margin-left:0;} +[class^="icon-"]{display:inline-block;width:14px;height:14px;vertical-align:text-top;background-image:url(../img/glyphicons-halflings.png);background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child{*margin-left:0;} +.icon-white{background-image:url(../img/glyphicons-halflings-white.png);} +.icon-glass{background-position:0 0;} +.icon-music{background-position:-24px 0;} +.icon-search{background-position:-48px 0;} +.icon-envelope{background-position:-72px 0;} +.icon-heart{background-position:-96px 0;} +.icon-star{background-position:-120px 0;} +.icon-star-empty{background-position:-144px 0;} +.icon-user{background-position:-168px 0;} +.icon-film{background-position:-192px 0;} +.icon-th-large{background-position:-216px 0;} +.icon-th{background-position:-240px 0;} +.icon-th-list{background-position:-264px 0;} +.icon-ok{background-position:-288px 0;} +.icon-remove{background-position:-312px 0;} +.icon-zoom-in{background-position:-336px 0;} +.icon-zoom-out{background-position:-360px 0;} +.icon-off{background-position:-384px 0;} +.icon-signal{background-position:-408px 0;} +.icon-cog{background-position:-432px 0;} +.icon-trash{background-position:-456px 0;} +.icon-home{background-position:0 -24px;} +.icon-file{background-position:-24px -24px;} +.icon-time{background-position:-48px -24px;} +.icon-road{background-position:-72px -24px;} +.icon-download-alt{background-position:-96px -24px;} +.icon-download{background-position:-120px -24px;} +.icon-upload{background-position:-144px -24px;} +.icon-inbox{background-position:-168px -24px;} +.icon-play-circle{background-position:-192px -24px;} +.icon-repeat{background-position:-216px -24px;} +.icon-refresh{background-position:-240px -24px;} +.icon-list-alt{background-position:-264px -24px;} +.icon-lock{background-position:-287px -24px;} +.icon-flag{background-position:-312px -24px;} +.icon-headphones{background-position:-336px -24px;} +.icon-volume-off{background-position:-360px -24px;} +.icon-volume-down{background-position:-384px -24px;} +.icon-volume-up{background-position:-408px -24px;} +.icon-qrcode{background-position:-432px -24px;} +.icon-barcode{background-position:-456px -24px;} +.icon-tag{background-position:0 -48px;} +.icon-tags{background-position:-25px -48px;} +.icon-book{background-position:-48px -48px;} +.icon-bookmark{background-position:-72px -48px;} +.icon-print{background-position:-96px -48px;} +.icon-camera{background-position:-120px -48px;} +.icon-font{background-position:-144px -48px;} +.icon-bold{background-position:-167px -48px;} +.icon-italic{background-position:-192px -48px;} +.icon-text-height{background-position:-216px -48px;} +.icon-text-width{background-position:-240px -48px;} +.icon-align-left{background-position:-264px -48px;} +.icon-align-center{background-position:-288px -48px;} +.icon-align-right{background-position:-312px -48px;} +.icon-align-justify{background-position:-336px -48px;} +.icon-list{background-position:-360px -48px;} +.icon-indent-left{background-position:-384px -48px;} +.icon-indent-right{background-position:-408px -48px;} +.icon-facetime-video{background-position:-432px -48px;} +.icon-picture{background-position:-456px -48px;} +.icon-pencil{background-position:0 -72px;} +.icon-map-marker{background-position:-24px -72px;} +.icon-adjust{background-position:-48px -72px;} +.icon-tint{background-position:-72px -72px;} +.icon-edit{background-position:-96px -72px;} +.icon-share{background-position:-120px -72px;} +.icon-check{background-position:-144px -72px;} +.icon-move{background-position:-168px -72px;} +.icon-step-backward{background-position:-192px -72px;} +.icon-fast-backward{background-position:-216px -72px;} +.icon-backward{background-position:-240px -72px;} +.icon-play{background-position:-264px -72px;} +.icon-pause{background-position:-288px -72px;} +.icon-stop{background-position:-312px -72px;} +.icon-forward{background-position:-336px -72px;} +.icon-fast-forward{background-position:-360px -72px;} +.icon-step-forward{background-position:-384px -72px;} +.icon-eject{background-position:-408px -72px;} +.icon-chevron-left{background-position:-432px -72px;} +.icon-chevron-right{background-position:-456px -72px;} +.icon-plus-sign{background-position:0 -96px;} +.icon-minus-sign{background-position:-24px -96px;} +.icon-remove-sign{background-position:-48px -96px;} +.icon-ok-sign{background-position:-72px -96px;} +.icon-question-sign{background-position:-96px -96px;} +.icon-info-sign{background-position:-120px -96px;} +.icon-screenshot{background-position:-144px -96px;} +.icon-remove-circle{background-position:-168px -96px;} +.icon-ok-circle{background-position:-192px -96px;} +.icon-ban-circle{background-position:-216px -96px;} +.icon-arrow-left{background-position:-240px -96px;} +.icon-arrow-right{background-position:-264px -96px;} +.icon-arrow-up{background-position:-289px -96px;} +.icon-arrow-down{background-position:-312px -96px;} +.icon-share-alt{background-position:-336px -96px;} +.icon-resize-full{background-position:-360px -96px;} +.icon-resize-small{background-position:-384px -96px;} +.icon-plus{background-position:-408px -96px;} +.icon-minus{background-position:-433px -96px;} +.icon-asterisk{background-position:-456px -96px;} +.icon-exclamation-sign{background-position:0 -120px;} +.icon-gift{background-position:-24px -120px;} +.icon-leaf{background-position:-48px -120px;} +.icon-fire{background-position:-72px -120px;} +.icon-eye-open{background-position:-96px -120px;} +.icon-eye-close{background-position:-120px -120px;} +.icon-warning-sign{background-position:-144px -120px;} +.icon-plane{background-position:-168px -120px;} +.icon-calendar{background-position:-192px -120px;} +.icon-random{background-position:-216px -120px;} +.icon-comment{background-position:-240px -120px;} +.icon-magnet{background-position:-264px -120px;} +.icon-chevron-up{background-position:-288px -120px;} +.icon-chevron-down{background-position:-313px -119px;} +.icon-retweet{background-position:-336px -120px;} +.icon-shopping-cart{background-position:-360px -120px;} +.icon-folder-close{background-position:-384px -120px;} +.icon-folder-open{background-position:-408px -120px;} +.icon-resize-vertical{background-position:-432px -119px;} +.icon-resize-horizontal{background-position:-456px -118px;} +.dropdown{position:relative;} +.dropdown-toggle{*margin-bottom:-3px;} +.dropdown-toggle:active,.open .dropdown-toggle{outline:0;} +.caret{display:inline-block;width:0;height:0;text-indent:-99999px;*text-indent:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"\2193";} +.dropdown .caret{margin-top:8px;margin-left:2px;} +.dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);} +.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;max-width:220px;_width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.bottom-up{top:auto;bottom:100%;margin-bottom:2px;} +.dropdown-menu .divider{height:1px;margin:5px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;} +.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#555555;white-space:nowrap;} +.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;} +.dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);} +.dropdown.open .dropdown-menu{display:block;} +.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} +.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;} +.collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;} +.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;} +.btn{display:inline-block;padding:4px 10px 4px;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#fafafa;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;*margin-left:.3em;}.btn:first-child{*margin-left:0;} +.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} +.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;color:rgba(0, 0, 0, 0.5);outline:0;} +.btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.btn-large .icon{margin-top:1px;} +.btn-small{padding:5px 9px;font-size:11px;line-height:16px;} +.btn-small .icon{margin-top:-1px;} +.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;} +.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active{color:rgba(255, 255, 255, 0.75);} +.btn-primary{background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-ms-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(top, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0044cc;} +.btn-primary:active,.btn-primary.active{background-color:#003399 \9;} +.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;} +.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} +.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;} +.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} +.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;} +.btn-success:active,.btn-success.active{background-color:#408140 \9;} +.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;} +.btn-info:active,.btn-info.active{background-color:#24748c \9;} +button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} +button.btn.large,input[type="submit"].btn.large{*padding-top:7px;*padding-bottom:7px;} +button.btn.small,input[type="submit"].btn.small{*padding-top:3px;*padding-bottom:3px;} +.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";} +.btn-group:after{clear:both;} +.btn-group:first-child{*margin-left:0;} +.btn-group+.btn-group{margin-left:5px;} +.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;} +.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} +.btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} +.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} +.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;} +.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} +.btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:5px;*padding-bottom:5px;} +.btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);} +.btn .caret{margin-top:7px;margin-left:0;} +.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);} +.btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret{border-top-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);} +.btn-small .caret{margin-top:4px;} +.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.alert,.alert-heading{color:#c09853;} +.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;} +.alert-success{background-color:#dff0d8;border-color:#d6e9c6;} +.alert-success,.alert-success .alert-heading{color:#468847;} +.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;} +.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading{color:#b94a48;} +.alert-info{background-color:#d9edf7;border-color:#bce8f1;} +.alert-info,.alert-info .alert-heading{color:#3a87ad;} +.alert-block{padding-top:14px;padding-bottom:14px;} +.alert-block>p,.alert-block>ul{margin-bottom:0;} +.alert-block p+p{margin-top:5px;} +.nav{margin-left:0;margin-bottom:18px;list-style:none;} +.nav>li>a{display:block;} +.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} +.nav-list{padding-left:14px;padding-right:14px;margin-bottom:0;} +.nav-list>li>a,.nav-list .nav-header{display:block;padding:3px 15px;margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} +.nav-list .nav-header{font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-transform:uppercase;} +.nav-list>li+.nav-header{margin-top:9px;} +.nav-list .active>a,.nav-list .active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} +.nav-list [class^="icon-"]{margin-right:2px;} +.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";} +.nav-tabs:after,.nav-pills:after{clear:both;} +.nav-tabs>li,.nav-pills>li{float:left;} +.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} +.nav-tabs{border-bottom:1px solid #ddd;} +.nav-tabs>li{margin-bottom:-1px;} +.nav-tabs>li>a{padding-top:9px;padding-bottom:9px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} +.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} +.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.nav-pills .active>a,.nav-pills .active>a:hover{color:#ffffff;background-color:#0088cc;} +.nav-stacked>li{float:none;} +.nav-stacked>li>a{margin-right:0;} +.nav-tabs.nav-stacked{border-bottom:0;} +.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} +.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} +.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} +.nav-pills.nav-stacked>li>a{margin-bottom:3px;} +.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} +.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;} +.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;margin-top:6px;} +.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;} +.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;} +.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;} +.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} +.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;opacity:1;filter:alpha(opacity=100);} +.tabs-stacked .open>a:hover{border-color:#999999;} +.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";} +.tabbable:after{clear:both;} +.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;} +.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} +.tab-content>.active,.pill-content>.active{display:block;} +.tabs-below .nav-tabs{border-top:1px solid #ddd;} +.tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;} +.tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} +.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;} +.tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;} +.tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} +.tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} +.tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} +.tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} +.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} +.tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} +.tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} +.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} +.navbar{overflow:visible;margin-bottom:18px;} +.navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);} +.btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;} +.btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;} +.btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} +.btn-navbar .icon-bar+.icon-bar{margin-top:3px;} +.nav-collapse.collapse{height:auto;} +.navbar .brand:hover{text-decoration:none;} +.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;} +.navbar .navbar-text{margin-bottom:0;line-height:40px;color:#999999;}.navbar .navbar-text a:hover{color:#ffffff;background-color:transparent;} +.navbar .btn,.navbar .btn-group{margin-top:5px;} +.navbar .btn-group .btn{margin-top:0;} +.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";} +.navbar-form:after{clear:both;} +.navbar-form input,.navbar-form select{display:inline-block;margin-top:5px;margin-bottom:0;} +.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} +.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} +.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;color:rgba(255, 255, 255, 0.75);background:#666;background:rgba(255, 255, 255, 0.3);border:1px solid #111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query :-moz-placeholder{color:#eeeeee;} +.navbar-search .search-query::-webkit-input-placeholder{color:#eeeeee;} +.navbar-search .search-query:hover{color:#ffffff;background-color:#999999;background-color:rgba(255, 255, 255, 0.5);} +.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} +.navbar-fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030;} +.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} +.navbar .nav.pull-right{float:right;} +.navbar .nav>li{display:block;float:left;} +.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} +.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;} +.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;background-color:rgba(0, 0, 0, 0.5);} +.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;} +.navbar .nav.pull-right{margin-left:10px;margin-right:0;} +.navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} +.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} +.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;} +.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);} +.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;} +.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;} +.navbar .nav.pull-right .dropdown-menu{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before{left:auto;right:12px;} +.navbar .nav.pull-right .dropdown-menu:after{left:auto;right:13px;} +.breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;} +.breadcrumb .divider{padding:0 5px;color:#999999;} +.breadcrumb .active a{color:#333333;} +.pagination{height:36px;margin:18px 0;} +.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} +.pagination li{display:inline;} +.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;} +.pagination a:hover,.pagination .active a{background-color:#f5f5f5;} +.pagination .active a{color:#999999;cursor:default;} +.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;} +.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.pagination-centered{text-align:center;} +.pagination-right{text-align:right;} +.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";} +.pager:after{clear:both;} +.pager li{display:inline;} +.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} +.pager a:hover{text-decoration:none;background-color:#f5f5f5;} +.pager .next a{float:right;} +.pager .previous a{float:left;} +.modal-open .dropdown-menu{z-index:2050;} +.modal-open .dropdown.open{*z-index:2050;} +.modal-open .popover{z-index:2060;} +.modal-open .tooltip{z-index:2070;} +.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} +.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} +.modal{position:fixed;top:50%;left:50%;z-index:1050;max-height:500px;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} +.modal.fade.in{top:50%;} +.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} +.modal-body{padding:15px;} +.modal-footer{padding:14px 15px 15px;margin-bottom:0;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";} +.modal-footer:after{clear:both;} +.modal-footer .btn{float:right;margin-left:5px;margin-bottom:0;} +.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} +.tooltip.top{margin-top:-2px;} +.tooltip.right{margin-left:2px;} +.tooltip.bottom{margin-top:2px;} +.tooltip.left{margin-left:-2px;} +.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.tooltip-arrow{position:absolute;width:0;height:0;} +.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;} +.popover.right{margin-left:5px;} +.popover.bottom{margin-top:5px;} +.popover.left{margin-left:-5px;} +.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.popover .arrow{position:absolute;width:0;height:0;} +.popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);} +.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;} +.popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;} +.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";} +.thumbnails:after{clear:both;} +.thumbnails>li{float:left;margin:0 0 18px 20px;} +.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);} +a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} +.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} +.thumbnail .caption{padding:9px;} +.label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.label-important{background-color:#b94a48;} +.label-warning{background-color:#f89406;} +.label-success{background-color:#468847;} +.label-info{background-color:#3a87ad;} +@-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} +.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} +.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} +.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);} +.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);} +.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);} +.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.accordion{margin-bottom:18px;} +.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.accordion-heading{border-bottom:0;} +.accordion-heading .accordion-toggle{display:block;padding:8px 15px;} +.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} +.carousel{position:relative;margin-bottom:18px;line-height:1;} +.carousel-inner{overflow:hidden;width:100%;position:relative;} +.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;} +.carousel .item>img{display:block;line-height:1;} +.carousel .active,.carousel .next,.carousel .prev{display:block;} +.carousel .active{left:0;} +.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;} +.carousel .next{left:100%;} +.carousel .prev{left:-100%;} +.carousel .next.left,.carousel .prev.right{left:0;} +.carousel .active.left{left:-100%;} +.carousel .active.right{left:100%;} +.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} +.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} +.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);} +.carousel-caption h4,.carousel-caption p{color:#ffffff;} +.hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;} +.hero-unit p{font-size:18px;font-weight:200;line-height:27px;} +.pull-right{float:right;} +.pull-left{float:left;} +.hide{display:none;} +.show{display:block;} +.invisible{visibility:hidden;} diff --git a/public/css/style.css b/public/css/style.css new file mode 100644 index 00000000..28af8659 --- /dev/null +++ b/public/css/style.css @@ -0,0 +1,37 @@ +body { + padding-top: 60px; + padding-bottom: 40px; +} + +.zf-green { + color: #68b604; +} + +.btn-success { + background-color: #57a900; + background-image: -moz-linear-gradient(top, #70d900, #57a900); + background-image: -ms-linear-gradient(top, #70d900, #57a900); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#70d900), to(#57a900)); + background-image: -webkit-linear-gradient(top, #70d900, #57a900); + background-image: -o-linear-gradient(top, #70d900, #57a900); + background-image: linear-gradient(top, #70d900, #57a900); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#70d900', endColorstr='#57a900', GradientType=0); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #57a900; +} + +.btn-success:active, .btn-success.active { + background-color: #57a900; +} + +div.container a.brand { + background: url("../images/zf2-logo.png") no-repeat scroll 0 10px transparent; + margin-left: 0; + padding: 8px 20px 12px 40px; +} diff --git a/public/images/favicon.ico b/public/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..17f119909ffcba66c8a48cba1050d724ab0a51aa GIT binary patch literal 1406 zcmeH{u@S;B3`L(4!_kq77D~2&f)%m@8>CIi3Rxj5&{O4(F&KaWl5ZuLa4BgmpX9H9 z`YL`QaC$|7#dQTcp`$WT2c=`93TJ2EqV#>w00001b5ch_0Itp) z=>Px#24YJ`L;!yP_W%GgN~tse000SaNLh0L04^f{04^f|c%?sf00007bV*G`2iyV+ z0u~zPmpWDe00Lr3L_t(I%azo>i(FL{2k_6yUMCTM712~SHnN3^LXZ#>#6mD{K>q+S zX(BTq2r-aC&_W?)Kx6SHAYz+Fn|-UGg{D#q@kj43WQ(W}QBZutvDmjev$Joqn*)z` zx!n6b_xnBHb7I_-lIg1mkJx`4z((?5a5tV$o(yi!+&@Tx2+;xVFVZx_aXf%ea3pTw zz=& z*KA7NE5{=1(-GdEtJD{D)gIf$xG8VowH+1R9lzF9d;hp8Cvg#v;TN1QJ&Es)a4EB6 zlK#nXw&z@AdSR|r`@17O)2%PzXt!R)mC_@{hd3M|rRdt~`z5`4L;AAE*sb(4E>DKr zcVERJ{Dg0?5({kJiSSaU?AW|pSMAxQrfkZjWC_xn=92RG&mP?K#vF4 za9gH`@MmYF>p7EgOP%X=)!yiw{*-V5$C87=q2#_v)&Aa-_&C;awXWJ1OP6>h_%s*lEe?=BYch#lx|Y3run(); diff --git a/public/js/html5.js b/public/js/html5.js new file mode 100644 index 00000000..6692336c --- /dev/null +++ b/public/js/html5.js @@ -0,0 +1,4 @@ +// iepp v2.1pre @jon_neal & @aFarkas github.com/aFarkas/iepp +// html5shiv @rem remysharp.com/html5-enabling-script +// Dual licensed under the MIT or GPL Version 2 licenses +/*@cc_on(function(a,b){function r(a){var b=-1;while(++b").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( +a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f +.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); diff --git a/vendor/.gitignore b/vendor/.gitignore new file mode 100644 index 00000000..4578c85a --- /dev/null +++ b/vendor/.gitignore @@ -0,0 +1,5 @@ +!.gitignore +.composer +composer +zendframework +autoload.php diff --git a/vendor/README.md b/vendor/README.md new file mode 100644 index 00000000..52144c94 --- /dev/null +++ b/vendor/README.md @@ -0,0 +1 @@ +This vendor/ directory is where third-party modules should be installed. diff --git a/vendor/doctrine/common/.gitignore b/vendor/doctrine/common/.gitignore new file mode 100644 index 00000000..fb5e79d6 --- /dev/null +++ b/vendor/doctrine/common/.gitignore @@ -0,0 +1,4 @@ +build/ +logs/ +reports/ +dist/ diff --git a/vendor/doctrine/common/.gitmodules b/vendor/doctrine/common/.gitmodules new file mode 100644 index 00000000..51f08435 --- /dev/null +++ b/vendor/doctrine/common/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/vendor/doctrine-build-common"] + path = lib/vendor/doctrine-build-common + url = git://github.com/doctrine/doctrine-build-common.git diff --git a/vendor/doctrine/common/.travis.yml b/vendor/doctrine/common/.travis.yml new file mode 100644 index 00000000..4464d4f7 --- /dev/null +++ b/vendor/doctrine/common/.travis.yml @@ -0,0 +1,5 @@ +language: php + +php: + - 5.3 + - 5.4 diff --git a/vendor/doctrine/common/LICENSE b/vendor/doctrine/common/LICENSE new file mode 100644 index 00000000..1c03f74b --- /dev/null +++ b/vendor/doctrine/common/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/vendor/doctrine/common/README.md b/vendor/doctrine/common/README.md new file mode 100644 index 00000000..c63f7627 --- /dev/null +++ b/vendor/doctrine/common/README.md @@ -0,0 +1,12 @@ +# Doctrine Common + +[![Build Status](https://secure.travis-ci.org/doctrine/common.png)](http://travis-ci.org/doctrine/common) + +The Doctrine Common project is a library that provides extensions to core PHP functionality. + +## More resources: + +* [Website](http://www.doctrine-project.org) +* [Documentation](http://www.doctrine-project.org/projects/common/current/docs/en) +* [Issue Tracker](http://www.doctrine-project.org/jira/browse/DCOM) +* [Downloads](http://github.com/doctrine/common/downloads) diff --git a/vendor/doctrine/common/UPGRADE_TO_2_1 b/vendor/doctrine/common/UPGRADE_TO_2_1 new file mode 100644 index 00000000..891a2e5c --- /dev/null +++ b/vendor/doctrine/common/UPGRADE_TO_2_1 @@ -0,0 +1,39 @@ +This document details all the possible changes that you should investigate when updating +your project from Doctrine Common 2.0.x to 2.1 + +## AnnotationReader changes + +The annotation reader was heavily refactored between 2.0 and 2.1-RC1. In theory the operation of the new reader should be backwards compatible, but it has to be setup differently to work that way: + + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\'); + // new code necessary starting here + $reader->setIgnoreNotImportedAnnotations(true); + $reader->setEnableParsePhpImports(false); + $reader = new \Doctrine\Common\Annotations\CachedReader( + new \Doctrine\Common\Annotations\IndexedReader($reader), new ArrayCache() + ); + +## Annotation Base class or @Annotation + +Beginning after 2.1-RC2 you have to either extend ``Doctrine\Common\Annotations\Annotation`` or add @Annotation to your annotations class-level docblock, otherwise the class will simply be ignored. + +## Removed methods on AnnotationReader + +* AnnotationReader::setAutoloadAnnotations() +* AnnotationReader::getAutoloadAnnotations() +* AnnotationReader::isAutoloadAnnotations() + +## AnnotationRegistry + +Autoloading through the PHP autoloader is removed from the 2.1 AnnotationReader. Instead you have to use the global AnnotationRegistry for loading purposes: + + \Doctrine\Common\Annotations\AnnotationRegistry::registerFile($fileWithAnnotations); + \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespace($namespace, $dirs = null); + \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespaces($namespaces); + \Doctrine\Common\Annotations\AnnotationRegistry::registerLoader($callable); + +The $callable for registering a loader accepts a class as first and only parameter and must try to silently autoload it. On success true has to be returned. +The registerAutoloadNamespace function registers a PSR-0 compatible silent autoloader for all classes with the given namespace in the given directories. +If null is passed as directory the include path will be used. + diff --git a/vendor/doctrine/common/UPGRADE_TO_2_2 b/vendor/doctrine/common/UPGRADE_TO_2_2 new file mode 100644 index 00000000..1d93a131 --- /dev/null +++ b/vendor/doctrine/common/UPGRADE_TO_2_2 @@ -0,0 +1,61 @@ +This document details all the possible changes that you should investigate when +updating your project from Doctrine Common 2.1 to 2.2: + +## Annotation Changes + +- AnnotationReader::setIgnoreNotImportedAnnotations has been removed, you need to + add ignore annotation names which are supposed to be ignored via + AnnotationReader::addGlobalIgnoredName + +- AnnotationReader::setAutoloadAnnotations was deprecated by the AnnotationRegistry + in 2.1 and has been removed in 2.2 + +- AnnotationReader::setEnableParsePhpImports was added to ease transition to the new + annotation mechanism in 2.1 and is removed in 2.2 + +- AnnotationReader::isParsePhpImportsEnabled is removed (see above) + +- AnnotationReader::setDefaultAnnotationNamespace was deprecated in favor of explicit + configuration in 2.1 and will be removed in 2.2 (for isolated projects where you + have full-control over _all_ available annotations, we offer a dedicated reader + class ``SimpleAnnotationReader``) + +- AnnotationReader::setAnnotationCreationFunction was deprecated in 2.1 and will be + removed in 2.2. We only offer two creation mechanisms which cannot be changed + anymore to allow the same reader instance to work with all annotations regardless + of which library they are coming from. + +- AnnotationReader::setAnnotationNamespaceAlias was deprecated in 2.1 and will be + removed in 2.2 (see setDefaultAnnotationNamespace) + +- If you use a class as annotation which has not the @Annotation marker in it's + class block, we will now throw an exception instead of silently ignoring it. You + can however still achieve the previous behavior using the @IgnoreAnnotation, or + AnnotationReader::addGlobalIgnoredName (the exception message will contain detailed + instructions when you run into this problem). + +## Cache Changes + +- Renamed old AbstractCache to CacheProvider + +- Dropped the support to the following functions of all cache providers: + + - CacheProvider::deleteByWildcard + + - CacheProvider::deleteByRegEx + + - CacheProvider::deleteByPrefix + + - CacheProvider::deleteBySuffix + +- CacheProvider::deleteAll will not remove ALL entries, it will only mark them as invalid + +- CacheProvider::flushAll will remove ALL entries, namespaced or not + +- Added support to MemcachedCache + +- Added support to WincacheCache + +## ClassLoader Changes + +- ClassLoader::fileExistsInIncludePath() no longer exists. Use the native stream_resolve_include_path() PHP function \ No newline at end of file diff --git a/vendor/doctrine/common/build.properties b/vendor/doctrine/common/build.properties new file mode 100644 index 00000000..ff311a45 --- /dev/null +++ b/vendor/doctrine/common/build.properties @@ -0,0 +1,6 @@ +# Project Name +project.name=DoctrineCommon + +# Version class and file +project.version_class = Doctrine\Common\Version +project.version_file = lib/Doctrine/Common/Version.php diff --git a/vendor/doctrine/common/build.xml b/vendor/doctrine/common/build.xml new file mode 100644 index 00000000..71a9a500 --- /dev/null +++ b/vendor/doctrine/common/build.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DoctrineCommon + Doctrine Common PHP Extensions + pear.doctrine-project.org + The Doctrine Common package contains shared code between the other packages. + + + + + LGPL + + + - + + + + + + + diff --git a/vendor/doctrine/common/composer.json b/vendor/doctrine/common/composer.json new file mode 100644 index 00000000..f995f6c6 --- /dev/null +++ b/vendor/doctrine/common/composer.json @@ -0,0 +1,21 @@ +{ + "name": "doctrine/common", + "type": "library","version":"2.2.3", + "description": "Common Library for Doctrine projects", + "keywords": ["collections", "spl", "eventmanager", "annotations", "persistence"], + "homepage": "http://www.doctrine-project.org", + "license": "LGPL", + "authors": [ + {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"}, + {"name": "Roman Borschel", "email": "roman@code-factory.org"}, + {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"}, + {"name": "Jonathan Wage", "email": "jonwage@gmail.com"}, + {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"} + ], + "require": { + "php": ">=5.3.2" + }, + "autoload": { + "psr-0": { "Doctrine\\Common": "lib/" } + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php new file mode 100644 index 00000000..62512522 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php @@ -0,0 +1,75 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Annotations class + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class Annotation +{ + /** + * Value property. Common among all derived classes. + * + * @var string + */ + public $value; + + /** + * Constructor + * + * @param array $data Key-value for properties to be defined in this class + */ + public final function __construct(array $data) + { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + /** + * Error handler for unknown property accessor in Annotation class. + * + * @param string $name Unknown property name + */ + public function __get($name) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } + + /** + * Error handler for unknown property mutator in Annotation class. + * + * @param string $name Unkown property name + * @param mixed $value Property value + */ + public function __set($name, $value) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php new file mode 100644 index 00000000..21597b14 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php @@ -0,0 +1,47 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the attribute type during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attribute +{ + /** + * @var string + */ + public $name; + + /** + * @var string + */ + public $type; + + /** + * @var boolean + */ + public $required = false; +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php new file mode 100644 index 00000000..6e314be4 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php @@ -0,0 +1,37 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the types of all declared attributes during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attributes +{ + /** + * @var array + */ + public $value; +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php new file mode 100644 index 00000000..1b2b20ac --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php @@ -0,0 +1,44 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser to ignore specific + * annotations during the parsing process. + * + * @Annotation + * @author Johannes M. Schmitt + */ +final class IgnoreAnnotation +{ + public $names; + + public function __construct(array $values) + { + if (is_string($values['value'])) { + $values['value'] = array($values['value']); + } + if (!is_array($values['value'])) { + throw new \RuntimeException(sprintf('@IgnoreAnnotation expects either a string name, or an array of strings, but got %s.', json_encode($values['value']))); + } + + $this->names = $values['value']; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php new file mode 100644 index 00000000..7b89a022 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php @@ -0,0 +1,33 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check if that attribute is required during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Required +{ +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php new file mode 100644 index 00000000..c41896ad --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php @@ -0,0 +1,105 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the annotation target during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Target +{ + const TARGET_CLASS = 1; + const TARGET_METHOD = 2; + const TARGET_PROPERTY = 4; + const TARGET_ANNOTATION = 8; + const TARGET_ALL = 15; + + /** + * @var array + */ + private static $map = array( + 'ALL' => self::TARGET_ALL, + 'CLASS' => self::TARGET_CLASS, + 'METHOD' => self::TARGET_METHOD, + 'PROPERTY' => self::TARGET_PROPERTY, + 'ANNOTATION' => self::TARGET_ANNOTATION, + ); + + /** + * @var array + */ + public $value; + + /** + * Targets as bitmask. + * + * @var integer + */ + public $targets; + + /** + * Literal target declaration. + * + * @var integer + */ + public $literal; + + /** + * Annotation construct + * + * @param array $values + */ + public function __construct(array $values) + { + if (!isset($values['value'])){ + $values['value'] = null; + } + if (is_string($values['value'])){ + $values['value'] = array($values['value']); + } + if (!is_array($values['value'])){ + throw new \InvalidArgumentException( + sprintf('@Target expects either a string value, or an array of strings, "%s" given.', + is_object($values['value']) ? get_class($values['value']) : gettype($values['value']) + ) + ); + } + + $bitmask = 0; + foreach ($values['value'] as $literal) { + if(!isset(self::$map[$literal])){ + throw new \InvalidArgumentException( + sprintf('Invalid Target "%s". Available targets: [%s]', + $literal, implode(', ', array_keys(self::$map))) + ); + } + $bitmask += self::$map[$literal]; + } + + $this->targets = $bitmask; + $this->value = $values['value']; + $this->literal = implode(', ', $this->value); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php new file mode 100644 index 00000000..fdc1913a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php @@ -0,0 +1,111 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Description of AnnotationException + * + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class AnnotationException extends \Exception +{ + /** + * Creates a new AnnotationException describing a Syntax error. + * + * @param string $message Exception message + * @return AnnotationException + */ + public static function syntaxError($message) + { + return new self('[Syntax Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing a Semantical error. + * + * @param string $message Exception message + * @return AnnotationException + */ + public static function semanticalError($message) + { + return new self('[Semantical Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing an error which occurred during + * the creation of the annotation. + * + * @since 2.2 + * @param string $message + * @return AnnotationException + */ + public static function creationError($message) + { + return new self('[Creation Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing an type error of an attribute. + * + * @since 2.2 + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * @param mixed $actual + * @return AnnotationException + */ + public static function typeError($attributeName, $annotationName, $context, $expected, $actual) + { + return new self(sprintf( + '[Type Error] Attribute "%s" of @%s declared on %s expects %s, but got %s.', + $attributeName, + $annotationName, + $context, + $expected, + is_object($actual) ? 'an instance of '.get_class($actual) : gettype($actual) + )); + } + + /** + * Creates a new AnnotationException describing an required error of an attribute. + * + * @since 2.2 + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * @return AnnotationException + */ + public static function requiredError($attributeName, $annotationName, $context, $expected) + { + return new self(sprintf( + '[Type Error] Attribute "%s" of @%s declared on %s expects %s. This value should not be null.', + $attributeName, + $annotationName, + $context, + $expected + )); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php new file mode 100644 index 00000000..be87728b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php @@ -0,0 +1,303 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\IgnoreAnnotation; +use Doctrine\Common\Annotations\Annotation\Target; +use Closure; +use ReflectionClass; +use ReflectionMethod; +use ReflectionProperty; + +/** + * A reader for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +final class AnnotationReader implements Reader +{ + /** + * Global map for imports. + * + * @var array + */ + private static $globalImports = array( + 'ignoreannotation' => 'Doctrine\Common\Annotations\Annotation\IgnoreAnnotation', + ); + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names are case sensitive. + * + * @var array + */ + private static $globalIgnoredNames = array( + 'access'=> true, 'author'=> true, 'copyright'=> true, 'deprecated'=> true, + 'example'=> true, 'ignore'=> true, 'internal'=> true, 'link'=> true, 'see'=> true, + 'since'=> true, 'tutorial'=> true, 'version'=> true, 'package'=> true, + 'subpackage'=> true, 'name'=> true, 'global'=> true, 'param'=> true, + 'return'=> true, 'staticvar'=> true, 'category'=> true, 'staticVar'=> true, + 'static'=> true, 'var'=> true, 'throws'=> true, 'inheritdoc'=> true, + 'inheritDoc'=> true, 'license'=> true, 'todo'=> true, 'deprecated'=> true, + 'deprec'=> true, 'author'=> true, 'property' => true, 'method' => true, + 'abstract'=> true, 'exception'=> true, 'magic' => true, 'api' => true, + 'final'=> true, 'filesource'=> true, 'throw' => true, 'uses' => true, + 'usedby'=> true, 'private' => true, 'Annotation' => true, 'override' => true, + 'codeCoverageIgnore' => true, 'codeCoverageIgnoreStart' => true, 'codeCoverageIgnoreEnd' => true, + 'Required' => true, 'Attribute' => true, 'Attributes' => true, + 'Target' => true, 'SuppressWarnings' => true, + 'ingroup' => true, 'code' => true, 'endcode' => true, + 'package_version' => true, + ); + + /** + * Add a new annotation to the globally ignored annotation names with regard to exception handling. + * + * @param string $name + */ + static public function addGlobalIgnoredName($name) + { + self::$globalIgnoredNames[$name] = true; + } + + /** + * Annotations Parser + * + * @var Doctrine\Common\Annotations\DocParser + */ + private $parser; + + /** + * Annotations Parser used to collect parsing metadata + * + * @var Doctrine\Common\Annotations\DocParser + */ + private $preParser; + + /** + * PHP Parser used to collect imports. + * + * @var Doctrine\Common\Annotations\PhpParser + */ + private $phpParser; + + /** + * In-memory cache mechanism to store imported annotations per class. + * + * @var array + */ + private $imports = array(); + + /** + * In-memory cache mechanism to store ignored annotations per class. + * + * @var array + */ + private $ignoredAnnotationNames = array(); + + /** + * Constructor. + * + * Initializes a new AnnotationReader. + */ + public function __construct() + { + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/IgnoreAnnotation.php'); + + $this->parser = new DocParser; + + $this->preParser = new DocParser; + $this->preParser->setImports(self::$globalImports); + $this->preParser->setIgnoreNotImportedAnnotations(true); + + $this->phpParser = new PhpParser; + } + + /** + * Gets the annotations applied to a class. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @return array An array of Annotations. + */ + public function getClassAnnotations(ReflectionClass $class) + { + $this->parser->setTarget(Target::TARGET_CLASS); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($class->getDocComment(), 'class ' . $class->getName()); + } + + /** + * Gets a class annotation. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getClassAnnotation(ReflectionClass $class, $annotationName) + { + $annotations = $this->getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets the annotations applied to a property. + * + * @param ReflectionProperty $property The ReflectionProperty of the property + * from which the annotations should be read. + * @return array An array of Annotations. + */ + public function getPropertyAnnotations(ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + $this->parser->setTarget(Target::TARGET_PROPERTY); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($property->getDocComment(), $context); + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets the annotations applied to a method. + * + * @param ReflectionMethod $property The ReflectionMethod of the method from which + * the annotations should be read. + * @return array An array of Annotations. + */ + public function getMethodAnnotations(ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + $this->parser->setTarget(Target::TARGET_METHOD); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($method->getDocComment(), $context); + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Returns the ignored annotations for the given class. + * + * @param ReflectionClass $class + * @return array + */ + private function getIgnoredAnnotationNames(ReflectionClass $class) + { + if (isset($this->ignoredAnnotationNames[$name = $class->getName()])) { + return $this->ignoredAnnotationNames[$name]; + } + $this->collectParsingMetadata($class); + + return $this->ignoredAnnotationNames[$name]; + } + + private function getImports(ReflectionClass $class) + { + if (isset($this->imports[$name = $class->getName()])) { + return $this->imports[$name]; + } + $this->collectParsingMetadata($class); + + return $this->imports[$name]; + } + + /** + * Collects parsing metadata for a given class + * + * @param ReflectionClass $class + */ + private function collectParsingMetadata(ReflectionClass $class) + { + $ignoredAnnotationNames = self::$globalIgnoredNames; + + $annotations = $this->preParser->parse($class->getDocComment(), 'class '.$class->name); + foreach ($annotations as $annotation) { + if ($annotation instanceof IgnoreAnnotation) { + foreach ($annotation->names AS $annot) { + $ignoredAnnotationNames[$annot] = true; + } + } + } + + $name = $class->getName(); + $this->imports[$name] = array_merge( + self::$globalImports, + $this->phpParser->parseClass($class), + array('__NAMESPACE__' => $class->getNamespaceName()) + ); + $this->ignoredAnnotationNames[$name] = $ignoredAnnotationNames; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php new file mode 100644 index 00000000..60b00f51 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php @@ -0,0 +1,129 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +final class AnnotationRegistry +{ + /** + * A map of namespaces to use for autoloading purposes based on a PSR-0 convention. + * + * Contains the namespace as key and an array of directories as value. If the value is NULL + * the include path is used for checking for the corresponding file. + * + * This autoloading mechanism does not utilize the PHP autoloading but implements autoloading on its own. + * + * @var array + */ + static private $autoloadNamespaces = array(); + + /** + * A map of autoloader callables. + * + * @var array + */ + static private $loaders = array(); + + static public function reset() + { + self::$autoloadNamespaces = array(); + self::$loaders = array(); + } + + static public function registerFile($file) + { + require_once $file; + } + + /** + * Add a namespace with one or many directories to look for files or null for the include path. + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param string $namespace + * @param string|array|null $dirs + */ + static public function registerAutoloadNamespace($namespace, $dirs = null) + { + self::$autoloadNamespaces[$namespace] = $dirs; + } + + /** + * Register multiple namespaces + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param array $namespaces + */ + static public function registerAutoloadNamespaces(array $namespaces) + { + self::$autoloadNamespaces = array_merge(self::$autoloadNamespaces, $namespaces); + } + + /** + * Register an autoloading callabale for annotations, much like spl_autoload_register(). + * + * NOTE: These class loaders HAVE to be silent when a class was not found! + * IMPORTANT: Loaders have to return true if they loaded a class that could contain the searched annotation class. + * + * @param callabale $callabale + */ + static public function registerLoader($callabale) + { + if (!is_callable($callabale)) { + throw new \InvalidArgumentException("A callable is expected in AnnotationRegistry::registerLoader()."); + } + self::$loaders[] = $callabale; + } + + /** + * Autoload an annotation class silently. + * + * @param string $class + * @return void + */ + static public function loadAnnotationClass($class) + { + foreach (self::$autoloadNamespaces AS $namespace => $dirs) { + if (strpos($class, $namespace) === 0) { + $file = str_replace("\\", DIRECTORY_SEPARATOR, $class) . ".php"; + if ($dirs === null) { + if ($path = stream_resolve_include_path($file)) { + require $path; + return true; + } + } else { + foreach((array)$dirs AS $dir) { + if (file_exists($dir . DIRECTORY_SEPARATOR . $file)) { + require $dir . DIRECTORY_SEPARATOR . $file; + return true; + } + } + } + } + } + + foreach (self::$loaders AS $loader) { + if (call_user_func($loader, $class) === true) { + return true; + } + } + return false; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php new file mode 100644 index 00000000..6ea47c6a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php @@ -0,0 +1,179 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Cache\Cache; + +/** + * A cache aware annotation reader. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + */ +final class CachedReader implements Reader +{ + private static $CACHE_SALT = '@[Annot]'; + + /** + * @var Reader + */ + private $delegate; + + /** + * @var Cache + */ + private $cache; + + /** + * @var boolean + */ + private $debug; + + /** + * @var array + */ + private $loadedAnnotations; + + /** + * @param Reader $reader + * @param Cache $cache + */ + public function __construct(Reader $reader, Cache $cache, $debug = false) + { + $this->delegate = $reader; + $this->cache = $cache; + $this->debug = $debug; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $cacheKey = $class->getName() . self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getClassAnnotations($class); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $cacheKey = $class->getName().'$'.$property->getName().self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getPropertyAnnotations($property); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $cacheKey = $class->getName().'#'.$method->getName().self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getMethodAnnotations($method); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = array(); + } + + private function isCacheFresh($cacheKey, \ReflectionClass $class) + { + if (false === $filename = $class->getFilename()) { + return true; + } + + return $this->cache->fetch('[C]'.$cacheKey) >= filemtime($filename); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php new file mode 100644 index 00000000..c6223e36 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php @@ -0,0 +1,140 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Lexer; + +/** + * Simple lexer for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +final class DocLexer extends Lexer +{ + const T_NONE = 1; + const T_IDENTIFIER = 2; + const T_INTEGER = 3; + const T_STRING = 4; + const T_FLOAT = 5; + + const T_AT = 101; + const T_CLOSE_CURLY_BRACES = 102; + const T_CLOSE_PARENTHESIS = 103; + const T_COMMA = 104; + const T_EQUALS = 105; + const T_FALSE = 106; + const T_NAMESPACE_SEPARATOR = 107; + const T_OPEN_CURLY_BRACES = 108; + const T_OPEN_PARENTHESIS = 109; + const T_TRUE = 110; + const T_NULL = 111; + const T_COLON = 112; + + /** + * @inheritdoc + */ + protected function getCatchablePatterns() + { + return array( + '[a-z_][a-z0-9_:]*', + '(?:[+-]?[0-9]+(?:[\.][0-9]+)*)(?:[eE][+-]?[0-9]+)?', + '"(?:[^"]|"")*"', + ); + } + + /** + * @inheritdoc + */ + protected function getNonCatchablePatterns() + { + return array('\s+', '\*+', '(.)'); + } + + /** + * @inheritdoc + */ + protected function getType(&$value) + { + $type = self::T_NONE; + + // Checking numeric value + if (is_numeric($value)) { + return (strpos($value, '.') !== false || stripos($value, 'e') !== false) + ? self::T_FLOAT : self::T_INTEGER; + } + + if ($value[0] === '"') { + $value = str_replace('""', '"', substr($value, 1, strlen($value) - 2)); + + return self::T_STRING; + } else { + switch (strtolower($value)) { + case '@': + return self::T_AT; + + case ',': + return self::T_COMMA; + + case '(': + return self::T_OPEN_PARENTHESIS; + + case ')': + return self::T_CLOSE_PARENTHESIS; + + case '{': + return self::T_OPEN_CURLY_BRACES; + + case '}': + return self::T_CLOSE_CURLY_BRACES; + + case '=': + return self::T_EQUALS; + + case '\\': + return self::T_NAMESPACE_SEPARATOR; + + case 'true': + return self::T_TRUE; + + case 'false': + return self::T_FALSE; + + case 'null': + return self::T_NULL; + + case ':': + return self::T_COLON; + + default: + if (ctype_alpha($value[0]) || $value[0] === '_') { + return self::T_IDENTIFIER; + } + + break; + } + } + + return $type; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php new file mode 100644 index 00000000..9d16b176 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php @@ -0,0 +1,891 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Closure; +use ReflectionClass; +use Doctrine\Common\Annotations\Annotation\Target; +use Doctrine\Common\Annotations\Annotation\Attribute; +use Doctrine\Common\Annotations\Annotation\Attributes; + +/** + * A parser for docblock annotations. + * + * It is strongly discouraged to change the default annotation parsing process. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +final class DocParser +{ + /** + * An array of all valid tokens for a class name. + * + * @var array + */ + private static $classIdentifiers = array(DocLexer::T_IDENTIFIER, DocLexer::T_TRUE, DocLexer::T_FALSE, DocLexer::T_NULL); + + /** + * The lexer. + * + * @var Doctrine\Common\Annotations\DocLexer + */ + private $lexer; + + /** + * Current target context + * + * @var string + */ + private $target; + + /** + * Doc Parser used to collect annotation target + * + * @var Doctrine\Common\Annotations\DocParser + */ + private static $metadataParser; + + /** + * Flag to control if the current annotation is nested or not. + * + * @var boolean + */ + private $isNestedAnnotation = false; + + /** + * Hashmap containing all use-statements that are to be used when parsing + * the given doc block. + * + * @var array + */ + private $imports = array(); + + /** + * This hashmap is used internally to cache results of class_exists() + * look-ups. + * + * @var array + */ + private $classExists = array(); + + /** + * Whether annotations that have not been imported should be ignored. + * + * @var boolean + */ + private $ignoreNotImportedAnnotations = false; + + /** + * An array of default namespaces if operating in simple mode. + * + * @var array + */ + private $namespaces = array(); + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names must be the raw names as used in the class, not the fully qualified + * class names. + * + * @var array + */ + private $ignoredAnnotationNames = array(); + + /** + * @var string + */ + private $context = ''; + + /** + * Hash-map for caching annotation metadata + * @var array + */ + private static $annotationMetadata = array( + 'Doctrine\Common\Annotations\Annotation\Target' => array( + 'is_annotation' => true, + 'has_constructor' => true, + 'properties' => array(), + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'attribute_types' => array( + 'value' => array( + 'required' => false, + 'type' =>'array', + 'array_type'=>'string', + 'value' =>'array' + ) + ), + ), + 'Doctrine\Common\Annotations\Annotation\Attribute' => array( + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_ANNOTATION', + 'targets' => Target::TARGET_ANNOTATION, + 'default_property' => 'name', + 'properties' => array( + 'name' => 'name', + 'type' => 'type', + 'required' => 'required' + ), + 'attribute_types' => array( + 'value' => array( + 'required' => true, + 'type' =>'string', + 'value' =>'string' + ), + 'type' => array( + 'required' =>true, + 'type' =>'string', + 'value' =>'string' + ), + 'required' => array( + 'required' =>false, + 'type' =>'boolean', + 'value' =>'boolean' + ) + ), + ), + 'Doctrine\Common\Annotations\Annotation\Attributes' => array( + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'properties' => array( + 'value' => 'value' + ), + 'attribute_types' => array( + 'value' => array( + 'type' =>'array', + 'required' =>true, + 'array_type'=>'Doctrine\Common\Annotations\Annotation\Attribute', + 'value' =>'array' + ) + ), + ), + ); + + /** + * Hash-map for handle types declaration + * + * @var array + */ + private static $typeMap = array( + 'float' => 'double', + 'bool' => 'boolean', + // allow uppercase Boolean in honor of George Boole + 'Boolean' => 'boolean', + 'int' => 'integer', + ); + + /** + * Constructs a new DocParser. + */ + public function __construct() + { + $this->lexer = new DocLexer; + } + + /** + * Sets the annotation names that are ignored during the parsing process. + * + * The names are supposed to be the raw names as used in the class, not the + * fully qualified class names. + * + * @param array $names + */ + public function setIgnoredAnnotationNames(array $names) + { + $this->ignoredAnnotationNames = $names; + } + + public function setIgnoreNotImportedAnnotations($bool) + { + $this->ignoreNotImportedAnnotations = (Boolean) $bool; + } + + /** + * Sets the default namespaces. + * @param array $namespaces + */ + public function addNamespace($namespace) + { + if ($this->imports) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + $this->namespaces[] = $namespace; + } + + public function setImports(array $imports) + { + if ($this->namespaces) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + $this->imports = $imports; + } + + /** + * Sets current target context as bitmask. + * + * @param integer $target + */ + public function setTarget($target) + { + $this->target = $target; + } + + /** + * Parses the given docblock string for annotations. + * + * @param string $input The docblock string to parse. + * @param string $context The parsing context. + * @return array Array of annotations. If no annotations are found, an empty array is returned. + */ + public function parse($input, $context = '') + { + if (false === $pos = strpos($input, '@')) { + return array(); + } + + // also parse whatever character is before the @ + if ($pos > 0) { + $pos -= 1; + } + + $this->context = $context; + $this->lexer->setInput(trim(substr($input, $pos), '* /')); + $this->lexer->moveNext(); + + return $this->Annotations(); + } + + /** + * Attempts to match the given token with the current lookahead token. + * If they match, updates the lookahead token; otherwise raises a syntax error. + * + * @param int Token type. + * @return bool True if tokens match; false otherwise. + */ + private function match($token) + { + if ( ! $this->lexer->isNextToken($token) ) { + $this->syntaxError($this->lexer->getLiteral($token)); + } + + return $this->lexer->moveNext(); + } + + /** + * Attempts to match the current lookahead token with any of the given tokens. + * + * If any of them matches, this method updates the lookahead token; otherwise + * a syntax error is raised. + * + * @param array $tokens + * @return bool + */ + private function matchAny(array $tokens) + { + if ( ! $this->lexer->isNextTokenAny($tokens)) { + $this->syntaxError(implode(' or ', array_map(array($this->lexer, 'getLiteral'), $tokens))); + } + + return $this->lexer->moveNext(); + } + + /** + * Generates a new syntax error. + * + * @param string $expected Expected string. + * @param array $token Optional token. + * @throws SyntaxException + */ + private function syntaxError($expected, $token = null) + { + if ($token === null) { + $token = $this->lexer->lookahead; + } + + $message = "Expected {$expected}, got "; + + if ($this->lexer->lookahead === null) { + $message .= 'end of string'; + } else { + $message .= "'{$token['value']}' at position {$token['position']}"; + } + + if (strlen($this->context)) { + $message .= ' in ' . $this->context; + } + + $message .= '.'; + + throw AnnotationException::syntaxError($message); + } + + /** + * Attempt to check if a class exists or not. This never goes through the PHP autoloading mechanism + * but uses the {@link AnnotationRegistry} to load classes. + * + * @param string $fqcn + * @return boolean + */ + private function classExists($fqcn) + { + if (isset($this->classExists[$fqcn])) { + return $this->classExists[$fqcn]; + } + + // first check if the class already exists, maybe loaded through another AnnotationReader + if (class_exists($fqcn, false)) { + return $this->classExists[$fqcn] = true; + } + + // final check, does this class exist? + return $this->classExists[$fqcn] = AnnotationRegistry::loadAnnotationClass($fqcn); + } + + /** + * Collects parsing metadata for a given annotation class + * + * @param string $name The annotation name + */ + private function collectAnnotationMetadata($name) + { + if (self::$metadataParser == null){ + self::$metadataParser = new self(); + self::$metadataParser->setTarget(Target::TARGET_CLASS); + self::$metadataParser->setIgnoreNotImportedAnnotations(true); + self::$metadataParser->setImports(array( + 'target' => 'Doctrine\Common\Annotations\Annotation\Target', + 'attribute' => 'Doctrine\Common\Annotations\Annotation\Attribute', + 'attributes' => 'Doctrine\Common\Annotations\Annotation\Attributes' + )); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Target.php'); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attribute.php'); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attributes.php'); + } + + $class = new \ReflectionClass($name); + $docComment = $class->getDocComment(); + + // Sets default values for annotation metadata + $metadata = array( + 'default_property' => null, + 'has_constructor' => (null !== $constructor = $class->getConstructor()) && $constructor->getNumberOfParameters() > 0, + 'properties' => array(), + 'property_types' => array(), + 'attribute_types' => array(), + 'targets_literal' => null, + 'targets' => Target::TARGET_ALL, + 'is_annotation' => false !== strpos($docComment, '@Annotation'), + ); + + // verify that the class is really meant to be an annotation + if ($metadata['is_annotation']) { + foreach (self::$metadataParser->parse($docComment, 'class @' . $name) as $annotation) { + if ($annotation instanceof Target) { + $metadata['targets'] = $annotation->targets; + $metadata['targets_literal'] = $annotation->literal; + + } elseif ($annotation instanceof Attributes) { + foreach ($annotation->value as $attrib) { + // handle internal type declaration + $type = isset(self::$typeMap[$attrib->type]) ? self::$typeMap[$attrib->type] : $attrib->type; + + // handle the case if the property type is mixed + if ('mixed' !== $type) { + // Checks if the property has array + if (false !== $pos = strpos($type, '<')) { + $arrayType = substr($type, $pos+1, -1); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$attrib->name]['array_type'] = $arrayType; + } + + $metadata['attribute_types'][$attrib->name]['type'] = $type; + $metadata['attribute_types'][$attrib->name]['value'] = $attrib->type; + $metadata['attribute_types'][$attrib->name]['required'] = $attrib->required; + } + } + } + } + + // if not has a constructor will inject values into public properties + if (false === $metadata['has_constructor']) { + // collect all public properties + foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) { + $metadata['properties'][$property->name] = $property->name; + + // checks if the property has @var annotation + if ((false !== $propertyComment = $property->getDocComment()) + && false !== strpos($propertyComment, '@var') + && preg_match('/@var\s+([^\s]+)/',$propertyComment, $matches)) { + // literal type declaration + $value = $matches[1]; + + // handle internal type declaration + $type = isset(self::$typeMap[$value]) ? self::$typeMap[$value] : $value; + + // handle the case if the property type is mixed + if ('mixed' !== $type) { + // Checks if the property has @var array annotation + if (false !== $pos = strpos($type, '<')) { + $arrayType = substr($type, $pos+1, -1); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$property->name]['array_type'] = $arrayType; + } + + $metadata['attribute_types'][$property->name]['type'] = $type; + $metadata['attribute_types'][$property->name]['value'] = $value; + $metadata['attribute_types'][$property->name]['required'] = false !== strpos($propertyComment, '@Required'); + } + } + } + + // choose the first property as default property + $metadata['default_property'] = reset($metadata['properties']); + } + } + + self::$annotationMetadata[$name] = $metadata; + } + + /** + * Annotations ::= Annotation {[ "*" ]* [Annotation]}* + * + * @return array + */ + private function Annotations() + { + $annotations = array(); + + while (null !== $this->lexer->lookahead) { + if (DocLexer::T_AT !== $this->lexer->lookahead['type']) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is preceded by non-catchable pattern + if (null !== $this->lexer->token && $this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value'])) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is followed by either a namespace separator, or + // an identifier token + if ((null === $peek = $this->lexer->glimpse()) + || (DocLexer::T_NAMESPACE_SEPARATOR !== $peek['type'] && !in_array($peek['type'], self::$classIdentifiers, true)) + || $peek['position'] !== $this->lexer->lookahead['position'] + 1) { + $this->lexer->moveNext(); + continue; + } + + $this->isNestedAnnotation = false; + if (false !== $annot = $this->Annotation()) { + $annotations[] = $annot; + } + } + + return $annotations; + } + + /** + * Annotation ::= "@" AnnotationName ["(" [Values] ")"] + * AnnotationName ::= QualifiedName | SimpleName + * QualifiedName ::= NameSpacePart "\" {NameSpacePart "\"}* SimpleName + * NameSpacePart ::= identifier | null | false | true + * SimpleName ::= identifier | null | false | true + * + * @return mixed False if it is not a valid annotation. + */ + private function Annotation() + { + $this->match(DocLexer::T_AT); + + // check if we have an annotation + if ($this->lexer->isNextTokenAny(self::$classIdentifiers)) { + $this->lexer->moveNext(); + $name = $this->lexer->token['value']; + } else if ($this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) { + $name = ''; + } else { + $this->syntaxError('namespace separator or identifier'); + } + + while ($this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value']) && $this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) { + $this->match(DocLexer::T_NAMESPACE_SEPARATOR); + $this->matchAny(self::$classIdentifiers); + $name .= '\\'.$this->lexer->token['value']; + } + + // only process names which are not fully qualified, yet + // fully qualified names must start with a \ + $originalName = $name; + if ('\\' !== $name[0]) { + $alias = (false === $pos = strpos($name, '\\'))? $name : substr($name, 0, $pos); + + $found = false; + if ($this->namespaces) { + foreach ($this->namespaces as $namespace) { + if ($this->classExists($namespace.'\\'.$name)) { + $name = $namespace.'\\'.$name; + $found = true; + break; + } + } + } elseif (isset($this->imports[$loweredAlias = strtolower($alias)])) { + if (false !== $pos) { + $name = $this->imports[$loweredAlias].substr($name, $pos); + } else { + $name = $this->imports[$loweredAlias]; + } + $found = true; + } elseif (isset($this->imports['__NAMESPACE__']) && $this->classExists($this->imports['__NAMESPACE__'].'\\'.$name)) { + $name = $this->imports['__NAMESPACE__'].'\\'.$name; + $found = true; + } elseif ($this->classExists($name)) { + $found = true; + } + + if (!$found) { + if ($this->ignoreNotImportedAnnotations || isset($this->ignoredAnnotationNames[$name])) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s was never imported. Did you maybe forget to add a "use" statement for this annotation?', $name, $this->context)); + } + } + + if (!$this->classExists($name)) { + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s does not exist, or could not be auto-loaded.', $name, $this->context)); + } + + // at this point, $name contains the fully qualified class name of the + // annotation, and it is also guaranteed that this class exists, and + // that it is loaded + + + // collects the metadata annotation only if there is not yet + if (!isset(self::$annotationMetadata[$name])) { + $this->collectAnnotationMetadata($name); + } + + // verify that the class is really meant to be an annotation and not just any ordinary class + if (self::$annotationMetadata[$name]['is_annotation'] === false) { + if (isset($this->ignoredAnnotationNames[$originalName])) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The class "%s" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "%s". If it is indeed no annotation, then you need to add @IgnoreAnnotation("%s") to the _class_ doc comment of %s.', $name, $name, $originalName, $this->context)); + } + + //if target is nested annotation + $target = $this->isNestedAnnotation ? Target::TARGET_ANNOTATION : $this->target; + + // Next will be nested + $this->isNestedAnnotation = true; + + //if annotation does not support current target + if (0 === (self::$annotationMetadata[$name]['targets'] & $target) && $target) { + throw AnnotationException::semanticalError( + sprintf('Annotation @%s is not allowed to be declared on %s. You may only use this annotation on these code elements: %s.', + $originalName, $this->context, self::$annotationMetadata[$name]['targets_literal']) + ); + } + + $values = array(); + if ($this->lexer->isNextToken(DocLexer::T_OPEN_PARENTHESIS)) { + $this->match(DocLexer::T_OPEN_PARENTHESIS); + + if ( ! $this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) { + $values = $this->Values(); + } + + $this->match(DocLexer::T_CLOSE_PARENTHESIS); + } + + // checks all declared attributes + foreach (self::$annotationMetadata[$name]['attribute_types'] as $property => $type) { + if ($property === self::$annotationMetadata[$name]['default_property'] + && !isset($values[$property]) && isset($values['value'])) { + $property = 'value'; + } + + // handle a not given attribute or null value + if (!isset($values[$property])) { + if ($type['required']) { + throw AnnotationException::requiredError($property, $originalName, $this->context, 'a(n) '.$type['value']); + } + + continue; + } + + if ($type['type'] === 'array') { + // handle the case of a single value + if (!is_array($values[$property])) { + $values[$property] = array($values[$property]); + } + + // checks if the attribute has array type declaration, such as "array" + if (isset($type['array_type'])) { + foreach ($values[$property] as $item) { + if (gettype($item) !== $type['array_type'] && !$item instanceof $type['array_type']) { + throw AnnotationException::typeError($property, $originalName, $this->context, 'either a(n) '.$type['array_type'].', or an array of '.$type['array_type'].'s', $item); + } + } + } + } elseif (gettype($values[$property]) !== $type['type'] && !$values[$property] instanceof $type['type']) { + throw AnnotationException::typeError($property, $originalName, $this->context, 'a(n) '.$type['value'], $values[$property]); + } + } + + // check if the annotation expects values via the constructor, + // or directly injected into public properties + if (self::$annotationMetadata[$name]['has_constructor'] === true) { + return new $name($values); + } + + $instance = new $name(); + foreach ($values as $property => $value) { + if (!isset(self::$annotationMetadata[$name]['properties'][$property])) { + if ('value' !== $property) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not have a property named "%s". Available properties: %s', $originalName, $this->context, $property, implode(', ', self::$annotationMetadata[$name]['properties']))); + } + + // handle the case if the property has no annotations + if (!$property = self::$annotationMetadata[$name]['default_property']) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not accept any values, but got %s.', $originalName, $this->context, json_encode($values))); + } + } + + $instance->{$property} = $value; + } + + return $instance; + } + + /** + * Values ::= Array | Value {"," Value}* + * + * @return array + */ + private function Values() + { + $values = array(); + + // Handle the case of a single array as value, i.e. @Foo({....}) + if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { + $values['value'] = $this->Value(); + return $values; + } + + $values[] = $this->Value(); + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + $token = $this->lexer->lookahead; + $value = $this->Value(); + + if ( ! is_object($value) && ! is_array($value)) { + $this->syntaxError('Value', $token); + } + + $values[] = $value; + } + + foreach ($values as $k => $value) { + if (is_object($value) && $value instanceof \stdClass) { + $values[$value->name] = $value->value; + } else if ( ! isset($values['value'])){ + $values['value'] = $value; + } else { + if ( ! is_array($values['value'])) { + $values['value'] = array($values['value']); + } + + $values['value'][] = $value; + } + + unset($values[$k]); + } + + return $values; + } + + /** + * Value ::= PlainValue | FieldAssignment + * + * @return mixed + */ + private function Value() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type']) { + return $this->FieldAssignment(); + } + + return $this->PlainValue(); + } + + /** + * PlainValue ::= integer | string | float | boolean | Array | Annotation + * + * @return mixed + */ + private function PlainValue() + { + if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { + return $this->Arrayx(); + } + + if ($this->lexer->isNextToken(DocLexer::T_AT)) { + return $this->Annotation(); + } + + switch ($this->lexer->lookahead['type']) { + case DocLexer::T_STRING: + $this->match(DocLexer::T_STRING); + return $this->lexer->token['value']; + + case DocLexer::T_INTEGER: + $this->match(DocLexer::T_INTEGER); + return (int)$this->lexer->token['value']; + + case DocLexer::T_FLOAT: + $this->match(DocLexer::T_FLOAT); + return (float)$this->lexer->token['value']; + + case DocLexer::T_TRUE: + $this->match(DocLexer::T_TRUE); + return true; + + case DocLexer::T_FALSE: + $this->match(DocLexer::T_FALSE); + return false; + + case DocLexer::T_NULL: + $this->match(DocLexer::T_NULL); + return null; + + default: + $this->syntaxError('PlainValue'); + } + } + + /** + * FieldAssignment ::= FieldName "=" PlainValue + * FieldName ::= identifier + * + * @return array + */ + private function FieldAssignment() + { + $this->match(DocLexer::T_IDENTIFIER); + $fieldName = $this->lexer->token['value']; + + $this->match(DocLexer::T_EQUALS); + + $item = new \stdClass(); + $item->name = $fieldName; + $item->value = $this->PlainValue(); + + return $item; + } + + /** + * Array ::= "{" ArrayEntry {"," ArrayEntry}* [","] "}" + * + * @return array + */ + private function Arrayx() + { + $array = $values = array(); + + $this->match(DocLexer::T_OPEN_CURLY_BRACES); + $values[] = $this->ArrayEntry(); + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + + // optional trailing comma + if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) { + break; + } + + $values[] = $this->ArrayEntry(); + } + + $this->match(DocLexer::T_CLOSE_CURLY_BRACES); + + foreach ($values as $value) { + list ($key, $val) = $value; + + if ($key !== null) { + $array[$key] = $val; + } else { + $array[] = $val; + } + } + + return $array; + } + + /** + * ArrayEntry ::= Value | KeyValuePair + * KeyValuePair ::= Key ("=" | ":") PlainValue + * Key ::= string | integer + * + * @return array + */ + private function ArrayEntry() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type'] + || DocLexer::T_COLON === $peek['type']) { + $this->matchAny(array(DocLexer::T_INTEGER, DocLexer::T_STRING)); + + $key = $this->lexer->token['value']; + $this->matchAny(array(DocLexer::T_EQUALS, DocLexer::T_COLON)); + + return array($key, $this->PlainValue()); + } + + return array(null, $this->Value()); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php new file mode 100644 index 00000000..4a42b583 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php @@ -0,0 +1,209 @@ +. + */ + +namespace Doctrine\Common\Annotations; + + +/** + * File cache reader for annotations. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + */ +class FileCacheReader implements Reader +{ + /** + * @var Reader + */ + private $reader; + private $dir; + private $debug; + private $loadedAnnotations = array(); + + public function __construct(Reader $reader, $cacheDir, $debug = false) + { + $this->reader = $reader; + if (!is_dir($cacheDir) && !@mkdir($cacheDir, 0777, true)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist and could not be created.', $cacheDir)); + } + if (!is_writable($cacheDir)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" is not writable. Both, the webserver and the console user need access. You can manage access rights for multiple users with "chmod +a". If your system does not support this, check out the acl package.', $cacheDir)); + } + + $this->dir = rtrim($cacheDir, '\\/'); + $this->debug = $debug; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $key = $class->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + @unlink($path); + + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $key = $class->getName().'$'.$property->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + unlink($path); + + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $key = $class->getName().'#'.$method->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + unlink($path); + + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + private function saveCacheFile($path, $data) + { + file_put_contents($path, 'getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = array(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php new file mode 100644 index 00000000..1eea4921 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php @@ -0,0 +1,94 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Reader; + +/** + * Allows the reader to be used in-place of Doctrine's reader. + * + * @author Johannes M. Schmitt + */ +class IndexedReader implements Reader +{ + private $delegate; + + public function __construct(Reader $reader) + { + $this->delegate = $reader; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $annotations = array(); + foreach ($this->delegate->getClassAnnotations($class) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getClassAnnotation(\ReflectionClass $class, $annotation) + { + return $this->delegate->getClassAnnotation($class, $annotation); + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $annotations = array(); + foreach ($this->delegate->getMethodAnnotations($method) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getMethodAnnotation(\ReflectionMethod $method, $annotation) + { + return $this->delegate->getMethodAnnotation($method, $annotation); + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $annotations = array(); + foreach ($this->delegate->getPropertyAnnotations($property) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getPropertyAnnotation(\ReflectionProperty $property, $annotation) + { + return $this->delegate->getPropertyAnnotation($property, $annotation); + } + + /** + * Proxy all methods to the delegate. + * + * @param type $method + * @param type $args + * @return type + */ + public function __call($method, $args) + { + return call_user_func_array(array($this->delegate, $method), $args); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php new file mode 100644 index 00000000..a14f8f5b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php @@ -0,0 +1,203 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use SplFileObject; + +/** + * Parses a file for namespaces/use/class declarations. + * + * @author Fabien Potencier + * @author Christian Kaps + */ +final class PhpParser +{ + /** + * The token list. + * + * @var array + */ + private $tokens; + + /** + * The number of tokens. + * + * @var int + */ + private $numTokens = 0; + + /** + * The current array pointer. + * + * @var int + */ + private $pointer = 0; + + /** + * Parses a class. + * + * @param \ReflectionClass $class A ReflectionClass object. + * @return array A list with use statements in the form (Alias => FQN). + */ + public function parseClass(\ReflectionClass $class) + { + if (false === $filename = $class->getFilename()) { + return array(); + } + + $content = $this->getFileContent($filename, $class->getStartLine()); + $namespace = str_replace('\\', '\\\\', $class->getNamespaceName()); + $content = preg_replace('/^.*?(\bnamespace\s+' . $namespace . '\s*[;{].*)$/s', '\\1', $content); + $this->tokens = token_get_all('numTokens = count($this->tokens); + $this->pointer = 0; + + $statements = $this->parseUseStatements($class->getNamespaceName()); + + return $statements; + } + + /** + * Get the content of the file right up to the given line number. + * + * @param string $filename The name of the file to load. + * @param int $lineNumber The number of lines to read from file. + * @return string The content of the file. + */ + private function getFileContent($filename, $lineNumber) + { + $content = ''; + $lineCnt = 0; + $file = new SplFileObject($filename); + while(!$file->eof()) { + if ($lineCnt++ == $lineNumber) { + break; + } + + $content .= $file->fgets(); + } + + return $content; + } + + /** + * Gets the next non whitespace and non comment token. + * + * @return array The token if exists, null otherwise. + */ + private function next() + { + for ($i = $this->pointer; $i < $this->numTokens; $i++) { + $this->pointer++; + if ($this->tokens[$i][0] === T_WHITESPACE || + $this->tokens[$i][0] === T_COMMENT || + $this->tokens[$i][0] === T_DOC_COMMENT) { + + continue; + } + + return $this->tokens[$i]; + } + + return null; + } + + /** + * Get all use statements. + * + * @param string $namespaceName The namespace name of the reflected class. + * @return array A list with all found use statements. + */ + private function parseUseStatements($namespaceName) + { + $statements = array(); + while (($token = $this->next())) { + if ($token[0] === T_USE) { + $statements = array_merge($statements, $this->parseUseStatement()); + continue; + } else if ($token[0] !== T_NAMESPACE || $this->parseNamespace() != $namespaceName) { + continue; + } + + // Get fresh array for new namespace. This is to prevent the parser to collect the use statements + // for a previous namespace with the same name. This is the case if a namespace is defined twice + // or if a namespace with the same name is commented out. + $statements = array(); + } + + return $statements; + } + + /** + * Get the namespace name. + * + * @return string The found namespace name. + */ + private function parseNamespace() + { + $namespace = ''; + while (($token = $this->next())){ + if ($token[0] === T_STRING || $token[0] === T_NS_SEPARATOR) { + $namespace .= $token[1]; + } else { + break; + } + } + + return $namespace; + } + + /** + * Parse a single use statement. + * + * @return array A list with all found class names for a use statement. + */ + private function parseUseStatement() + { + $class = ''; + $alias = ''; + $statements = array(); + $explicitAlias = false; + while (($token = $this->next())) { + $isNameToken = $token[0] === T_STRING || $token[0] === T_NS_SEPARATOR; + if (!$explicitAlias && $isNameToken) { + $class .= $token[1]; + $alias = $token[1]; + } else if ($explicitAlias && $isNameToken) { + $alias .= $token[1]; + } else if ($token[0] === T_AS) { + $explicitAlias = true; + $alias = ''; + } else if ($token === ',') { + $statements[strtolower($alias)] = $class; + $class = ''; + $alias = ''; + $explicitAlias = false; + } else if ($token === ';') { + $statements[strtolower($alias)] = $class; + break; + } else { + break; + } + } + + return $statements; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php new file mode 100644 index 00000000..8e85d392 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php @@ -0,0 +1,35 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Interface for annotation readers. + * + * @author Johannes M. Schmitt + */ +interface Reader +{ + function getClassAnnotations(\ReflectionClass $class); + function getClassAnnotation(\ReflectionClass $class, $annotationName); + function getMethodAnnotations(\ReflectionMethod $method); + function getMethodAnnotation(\ReflectionMethod $method, $annotationName); + function getPropertyAnnotations(\ReflectionProperty $property); + function getPropertyAnnotation(\ReflectionProperty $property, $annotationName); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php new file mode 100644 index 00000000..a13c7fa0 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php @@ -0,0 +1,152 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\Target; + +/** + * Simple Annotation Reader. + * + * This annotation reader is intended to be used in projects where you have + * full-control over all annotations that are available. + * + * @since 2.2 + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +class SimpleAnnotationReader implements Reader +{ + /** + * @var DocParser + */ + private $parser; + + /** + * Constructor. + * + * Initializes a new SimpleAnnotationReader. + */ + public function __construct() + { + $this->parser = new DocParser(); + $this->parser->setIgnoreNotImportedAnnotations(true); + } + + /** + * Adds a namespace in which we will look for annotations. + * + * @param string $namespace + */ + public function addNamespace($namespace) + { + $this->parser->addNamespace($namespace); + } + + /** + * Gets the annotations applied to a class. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @return array An array of Annotations. + */ + public function getClassAnnotations(\ReflectionClass $class) + { + return $this->parser->parse($class->getDocComment(), 'class '.$class->getName()); + } + + /** + * Gets the annotations applied to a method. + * + * @param ReflectionMethod $property The ReflectionMethod of the method from which + * the annotations should be read. + * @return array An array of Annotations. + */ + public function getMethodAnnotations(\ReflectionMethod $method) + { + return $this->parser->parse($method->getDocComment(), 'method '.$method->getDeclaringClass()->name.'::'.$method->getName().'()'); + } + + /** + * Gets the annotations applied to a property. + * + * @param ReflectionProperty $property The ReflectionProperty of the property + * from which the annotations should be read. + * @return array An array of Annotations. + */ + public function getPropertyAnnotations(\ReflectionProperty $property) + { + return $this->parser->parse($property->getDocComment(), 'property '.$property->getDeclaringClass()->name.'::$'.$property->getName()); + } + + /** + * Gets a class annotation. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php new file mode 100644 index 00000000..a59296f5 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php @@ -0,0 +1,97 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * APC cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class ApcCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return apc_fetch($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + $found = false; + + apc_fetch($id, $found); + + return $found; + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return (bool) apc_store($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return apc_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return apc_clear_cache() && apc_clear_cache('user'); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = apc_cache_info(); + $sma = apc_sma_info(); + + return array( + Cache::STATS_HITS => $info['num_hits'], + Cache::STATS_MISSES => $info['num_misses'], + Cache::STATS_UPTIME => $info['start_time'], + Cache::STATS_MEMORY_USAGE => $info['mem_size'], + Cache::STATS_MEMORY_AVAILIABLE => $sma['avail_mem'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php new file mode 100644 index 00000000..8a0b982b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php @@ -0,0 +1,96 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Array cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class ArrayCache extends CacheProvider +{ + /** + * @var array $data + */ + private $data = array(); + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return (isset($this->data[$id])) ? $this->data[$id] : false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return isset($this->data[$id]); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + $this->data[$id] = $data; + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + unset($this->data[$id]); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->data = array(); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php new file mode 100644 index 00000000..d303bde4 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php @@ -0,0 +1,102 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Interface for cache drivers. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Fabio B. Silva + */ +interface Cache +{ + const STATS_HITS = 'hits'; + const STATS_MISSES = 'misses'; + const STATS_UPTIME = 'uptime'; + const STATS_MEMORY_USAGE = 'memory_usage'; + const STATS_MEMORY_AVAILIABLE = 'memory_available'; + + /** + * Fetches an entry from the cache. + * + * @param string $id cache id The id of the cache entry to fetch. + * @return string The cached data or FALSE, if no cache entry exists for the given id. + */ + function fetch($id); + + /** + * Test if an entry exists in the cache. + * + * @param string $id cache id The cache id of the entry to check for. + * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. + */ + function contains($id); + + /** + * Puts data into the cache. + * + * @param string $id The cache id. + * @param string $data The cache entry/data. + * @param int $lifeTime The lifetime. If != 0, sets a specific lifetime for this cache entry (0 => infinite lifeTime). + * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. + */ + function save($id, $data, $lifeTime = 0); + + /** + * Deletes a cache entry. + * + * @param string $id cache id + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + function delete($id); + + /** + * Retrieves cached information from data store + * + * The server's statistics array has the following values: + * + * - hits + * Number of keys that have been requested and found present. + * + * - misses + * Number of items that have been requested and not found. + * + * - uptime + * Time that the server is running. + * + * - memory_usage + * Memory used by this server to store items. + * + * - memory_available + * Memory allowed to use for storage. + * + * @since 2.2 + * @var array Associative array with server's statistics if available, NULL otherwise. + */ + function getStats(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php new file mode 100644 index 00000000..fa11fc22 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php @@ -0,0 +1,188 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Base class for cache provider implementations. + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Fabio B. Silva + */ +abstract class CacheProvider implements Cache +{ + const DOCTRINE_NAMESPACE_CACHEKEY = 'DoctrineNamespaceCacheKey[%s]'; + + /** + * @var string The namespace to prefix all cache ids with + */ + private $namespace = ''; + + /** + * Set the namespace to prefix all cache ids with. + * + * @param string $namespace + * @return void + */ + public function setNamespace($namespace) + { + $this->namespace = (string) $namespace; + } + + /** + * Retrieve the namespace that prefixes all cache ids. + * + * @return string + */ + public function getNamespace() + { + return $this->namespace; + } + + /** + * {@inheritdoc} + */ + public function fetch($id) + { + return $this->doFetch($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function contains($id) + { + return $this->doContains($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function save($id, $data, $lifeTime = 0) + { + return $this->doSave($this->getNamespacedId($id), $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + public function delete($id) + { + return $this->doDelete($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function getStats() + { + return $this->doGetStats(); + } + + /** + * Deletes all cache entries. + * + * @return boolean TRUE if the cache entries were successfully flushed, FALSE otherwise. + */ + public function flushAll() + { + return $this->doFlush(); + } + + /** + * Delete all cache entries. + * + * @return boolean TRUE if the cache entries were successfully deleted, FALSE otherwise. + */ + public function deleteAll() + { + $namespaceCacheKey = sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); + $namespaceVersion = ($this->doContains($namespaceCacheKey)) ? $this->doFetch($namespaceCacheKey) : 1; + + return $this->doSave($namespaceCacheKey, $namespaceVersion + 1); + } + + /** + * Prefix the passed id with the configured namespace value + * + * @param string $id The id to namespace + * @return string $id The namespaced id + */ + private function getNamespacedId($id) + { + $namespaceCacheKey = sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); + $namespaceVersion = ($this->doContains($namespaceCacheKey)) ? $this->doFetch($namespaceCacheKey) : 1; + + return sprintf('%s[%s][%s]', $this->namespace, $id, $namespaceVersion); + } + + /** + * Fetches an entry from the cache. + * + * @param string $id cache id The id of the cache entry to fetch. + * @return string The cached data or FALSE, if no cache entry exists for the given id. + */ + abstract protected function doFetch($id); + + /** + * Test if an entry exists in the cache. + * + * @param string $id cache id The cache id of the entry to check for. + * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. + */ + abstract protected function doContains($id); + + /** + * Puts data into the cache. + * + * @param string $id The cache id. + * @param string $data The cache entry/data. + * @param int $lifeTime The lifetime. If != false, sets a specific lifetime for this cache entry (null => infinite lifeTime). + * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. + */ + abstract protected function doSave($id, $data, $lifeTime = false); + + /** + * Deletes a cache entry. + * + * @param string $id cache id + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + abstract protected function doDelete($id); + + /** + * Deletes all cache entries. + * + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + abstract protected function doFlush(); + + /** + * Retrieves cached information from data store + * + * @since 2.2 + * @return array An associative array with server's statistics if available, NULL otherwise. + */ + abstract protected function doGetStats(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php new file mode 100644 index 00000000..dd6d1e31 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php @@ -0,0 +1,121 @@ +. + */ + +namespace Doctrine\Common\Cache; + +use \Memcache; + +/** + * Memcache cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class MemcacheCache extends CacheProvider +{ + /** + * @var Memcache + */ + private $memcache; + + /** + * Sets the memcache instance to use. + * + * @param Memcache $memcache + */ + public function setMemcache(Memcache $memcache) + { + $this->memcache = $memcache; + } + + /** + * Gets the memcache instance used by the cache. + * + * @return Memcache + */ + public function getMemcache() + { + return $this->memcache; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcache->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (bool) $this->memcache->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + return $this->memcache->set($id, $data, 0, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->memcache->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcache->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcache->getStats(); + return array( + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php new file mode 100644 index 00000000..4675fae7 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php @@ -0,0 +1,124 @@ +. + */ + +namespace Doctrine\Common\Cache; + +use \Memcached; + +/** + * Memcached cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class MemcachedCache extends CacheProvider +{ + /** + * @var Memcached + */ + private $memcached; + + /** + * Sets the memcache instance to use. + * + * @param Memcached $memcached + */ + public function setMemcached(Memcached $memcached) + { + $this->memcached = $memcached; + } + + /** + * Gets the memcached instance used by the cache. + * + * @return Memcached + */ + public function getMemcached() + { + return $this->memcached; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcached->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (false !== $this->memcached->get($id)); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + return $this->memcached->set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->memcached->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcached->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcached->getStats(); + $servers = $this->memcached->getServerList(); + $key = $servers[0]['host'] . ':' . $servers[0]['port']; + $stats = $stats[$key]; + return array( + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php new file mode 100644 index 00000000..ed8ca74a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php @@ -0,0 +1,92 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * WinCache cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class WincacheCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return wincache_ucache_get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return wincache_ucache_exists($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return (bool) wincache_ucache_set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return wincache_ucache_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return wincache_ucache_clear(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = wincache_ucache_info(); + $meminfo= wincache_ucache_meminfo(); + return array( + Cache::STATS_HITS => $info['total_hit_count'], + Cache::STATS_MISSES => $info['total_miss_count'], + Cache::STATS_UPTIME => $info['total_cache_uptime'], + Cache::STATS_MEMORY_USAGE => $meminfo['memory_total'], + Cache::STATS_MEMORY_AVAILIABLE => $meminfo['memory_free'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php new file mode 100644 index 00000000..6e22d265 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php @@ -0,0 +1,110 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Xcache cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class XcacheCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->doContains($id) ? unserialize(xcache_get($id)) : false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return xcache_isset($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return xcache_set($id, serialize($data), (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return xcache_unset($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->checkAuthorization(); + + xcache_clear_cache(XC_TYPE_VAR, 0); + + return true; + } + + /** + * Checks that xcache.admin.enable_auth is Off + * + * @throws \BadMethodCallException When xcache.admin.enable_auth is On + * @return void + */ + protected function checkAuthorization() + { + if (ini_get('xcache.admin.enable_auth')) { + throw new \BadMethodCallException('To use all features of \Doctrine\Common\Cache\XcacheCache, you must set "xcache.admin.enable_auth" to "Off" in your php.ini.'); + } + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $this->checkAuthorization(); + + $info = xcache_info(XC_TYPE_VAR, 0); + return array( + Cache::STATS_HITS => $info['hits'], + Cache::STATS_MISSES => $info['misses'], + Cache::STATS_UPTIME => null, + Cache::STATS_MEMORY_USAGE => $info['size'], + Cache::STATS_MEMORY_AVAILIABLE => $info['avail'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php new file mode 100644 index 00000000..4e4dabe7 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php @@ -0,0 +1,84 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Zend Data Cache cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Ralph Schindler + * @author Guilherme Blanco + */ +class ZendDataCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return zend_shm_cache_fetch($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (false !== zend_shm_cache_fetch($id)); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return zend_shm_cache_store($id, $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return zend_shm_cache_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $namespace = $this->getNamespace(); + if (empty($namespace)) { + return zend_shm_cache_clear(); + } + return zend_shm_cache_clear($namespace); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php new file mode 100644 index 00000000..375b0d6b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php @@ -0,0 +1,262 @@ +. + */ + +namespace Doctrine\Common; + +/** + * A ClassLoader is an autoloader for class files that can be + * installed on the SPL autoload stack. It is a class loader that either loads only classes + * of a specific namespace or all namespaces and it is suitable for working together + * with other autoloaders in the SPL autoload stack. + * + * If no include path is configured through the constructor or {@link setIncludePath}, a ClassLoader + * relies on the PHP include_path. + * + * @author Roman Borschel + * @since 2.0 + */ +class ClassLoader +{ + /** + * @var string PHP file extension + */ + protected $fileExtension = '.php'; + + /** + * @var string Current namespace + */ + protected $namespace; + + /** + * @var string Current include path + */ + protected $includePath; + + /** + * @var string PHP namespace separator + */ + protected $namespaceSeparator = '\\'; + + /** + * Creates a new ClassLoader that loads classes of the + * specified namespace from the specified include path. + * + * If no include path is given, the ClassLoader relies on the PHP include_path. + * If neither a namespace nor an include path is given, the ClassLoader will + * be responsible for loading all classes, thereby relying on the PHP include_path. + * + * @param string $ns The namespace of the classes to load. + * @param string $includePath The base include path to use. + */ + public function __construct($ns = null, $includePath = null) + { + $this->namespace = $ns; + $this->includePath = $includePath; + } + + /** + * Sets the namespace separator used by classes in the namespace of this ClassLoader. + * + * @param string $sep The separator to use. + */ + public function setNamespaceSeparator($sep) + { + $this->namespaceSeparator = $sep; + } + + /** + * Gets the namespace separator used by classes in the namespace of this ClassLoader. + * + * @return string + */ + public function getNamespaceSeparator() + { + return $this->namespaceSeparator; + } + + /** + * Sets the base include path for all class files in the namespace of this ClassLoader. + * + * @param string $includePath + */ + public function setIncludePath($includePath) + { + $this->includePath = $includePath; + } + + /** + * Gets the base include path for all class files in the namespace of this ClassLoader. + * + * @return string + */ + public function getIncludePath() + { + return $this->includePath; + } + + /** + * Sets the file extension of class files in the namespace of this ClassLoader. + * + * @param string $fileExtension + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * Gets the file extension of class files in the namespace of this ClassLoader. + * + * @return string + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Registers this ClassLoader on the SPL autoload stack. + */ + public function register() + { + spl_autoload_register(array($this, 'loadClass')); + } + + /** + * Removes this ClassLoader from the SPL autoload stack. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $classname The name of the class to load. + * @return boolean TRUE if the class has been successfully loaded, FALSE otherwise. + */ + public function loadClass($className) + { + if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) { + return false; + } + + require ($this->includePath !== null ? $this->includePath . DIRECTORY_SEPARATOR : '') + . str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) + . $this->fileExtension; + + return true; + } + + /** + * Asks this ClassLoader whether it can potentially load the class (file) with + * the given name. + * + * @param string $className The fully-qualified name of the class. + * @return boolean TRUE if this ClassLoader can load the class, FALSE otherwise. + */ + public function canLoadClass($className) + { + if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) { + return false; + } + + $file = str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) . $this->fileExtension; + + if ($this->includePath !== null) { + return file_exists($this->includePath . DIRECTORY_SEPARATOR . $file); + } + + return (false !== stream_resolve_include_path($file)); + } + + /** + * Checks whether a class with a given name exists. A class "exists" if it is either + * already defined in the current request or if there is an autoloader on the SPL + * autoload stack that is a) responsible for the class in question and b) is able to + * load a class file in which the class definition resides. + * + * If the class is not already defined, each autoloader in the SPL autoload stack + * is asked whether it is able to tell if the class exists. If the autoloader is + * a ClassLoader, {@link canLoadClass} is used, otherwise the autoload + * function of the autoloader is invoked and expected to return a value that + * evaluates to TRUE if the class (file) exists. As soon as one autoloader reports + * that the class exists, TRUE is returned. + * + * Note that, depending on what kinds of autoloaders are installed on the SPL + * autoload stack, the class (file) might already be loaded as a result of checking + * for its existence. This is not the case with a ClassLoader, who separates + * these responsibilities. + * + * @param string $className The fully-qualified name of the class. + * @return boolean TRUE if the class exists as per the definition given above, FALSE otherwise. + */ + public static function classExists($className) + { + if (class_exists($className, false) || interface_exists($className, false)) { + return true; + } + + foreach (spl_autoload_functions() as $loader) { + if (is_array($loader)) { // array(???, ???) + if (is_object($loader[0])) { + if ($loader[0] instanceof ClassLoader) { // array($obj, 'methodName') + if ($loader[0]->canLoadClass($className)) { + return true; + } + } else if ($loader[0]->{$loader[1]}($className)) { + return true; + } + } else if ($loader[0]::$loader[1]($className)) { // array('ClassName', 'methodName') + return true; + } + } else if ($loader instanceof \Closure) { // function($className) {..} + if ($loader($className)) { + return true; + } + } else if (is_string($loader) && $loader($className)) { // "MyClass::loadClass" + return true; + } + } + + return class_exists($className, false) || interface_exists($className, false); + } + + /** + * Gets the ClassLoader from the SPL autoload stack that is responsible + * for (and is able to load) the class with the given name. + * + * @param string $className The name of the class. + * @return The ClassLoader for the class or NULL if no such ClassLoader exists. + */ + public static function getClassLoader($className) + { + foreach (spl_autoload_functions() as $loader) { + if (is_array($loader) + && $loader[0] instanceof ClassLoader + && $loader[0]->canLoadClass($className) + ) { + return $loader[0]; + } + } + + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php new file mode 100644 index 00000000..2a7d4eaf --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php @@ -0,0 +1,447 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Closure, ArrayIterator; + +/** + * An ArrayCollection is a Collection implementation that wraps a regular PHP array. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class ArrayCollection implements Collection +{ + /** + * An array containing the entries of this collection. + * + * @var array + */ + private $_elements; + + /** + * Initializes a new ArrayCollection. + * + * @param array $elements + */ + public function __construct(array $elements = array()) + { + $this->_elements = $elements; + } + + /** + * Gets the PHP array representation of this collection. + * + * @return array The PHP array representation of this collection. + */ + public function toArray() + { + return $this->_elements; + } + + /** + * Sets the internal iterator to the first element in the collection and + * returns this element. + * + * @return mixed + */ + public function first() + { + return reset($this->_elements); + } + + /** + * Sets the internal iterator to the last element in the collection and + * returns this element. + * + * @return mixed + */ + public function last() + { + return end($this->_elements); + } + + /** + * Gets the current key/index at the current internal iterator position. + * + * @return mixed + */ + public function key() + { + return key($this->_elements); + } + + /** + * Moves the internal iterator position to the next element. + * + * @return mixed + */ + public function next() + { + return next($this->_elements); + } + + /** + * Gets the element of the collection at the current internal iterator position. + * + * @return mixed + */ + public function current() + { + return current($this->_elements); + } + + /** + * Removes an element with a specific key/index from the collection. + * + * @param mixed $key + * @return mixed The removed element or NULL, if no element exists for the given key. + */ + public function remove($key) + { + if (isset($this->_elements[$key])) { + $removed = $this->_elements[$key]; + unset($this->_elements[$key]); + + return $removed; + } + + return null; + } + + /** + * Removes the specified element from the collection, if it is found. + * + * @param mixed $element The element to remove. + * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. + */ + public function removeElement($element) + { + $key = array_search($element, $this->_elements, true); + + if ($key !== false) { + unset($this->_elements[$key]); + + return true; + } + + return false; + } + + /** + * ArrayAccess implementation of offsetExists() + * + * @see containsKey() + */ + public function offsetExists($offset) + { + return $this->containsKey($offset); + } + + /** + * ArrayAccess implementation of offsetGet() + * + * @see get() + */ + public function offsetGet($offset) + { + return $this->get($offset); + } + + /** + * ArrayAccess implementation of offsetGet() + * + * @see add() + * @see set() + */ + public function offsetSet($offset, $value) + { + if ( ! isset($offset)) { + return $this->add($value); + } + return $this->set($offset, $value); + } + + /** + * ArrayAccess implementation of offsetUnset() + * + * @see remove() + */ + public function offsetUnset($offset) + { + return $this->remove($offset); + } + + /** + * Checks whether the collection contains a specific key/index. + * + * @param mixed $key The key to check for. + * @return boolean TRUE if the given key/index exists, FALSE otherwise. + */ + public function containsKey($key) + { + return isset($this->_elements[$key]); + } + + /** + * Checks whether the given element is contained in the collection. + * Only element values are compared, not keys. The comparison of two elements + * is strict, that means not only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element + * @return boolean TRUE if the given element is contained in the collection, + * FALSE otherwise. + */ + public function contains($element) + { + foreach ($this->_elements as $collectionElement) { + if ($element === $collectionElement) { + return true; + } + } + + return false; + } + + /** + * Tests for the existance of an element that satisfies the given predicate. + * + * @param Closure $p The predicate. + * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. + */ + public function exists(Closure $p) + { + foreach ($this->_elements as $key => $element) { + if ($p($key, $element)) { + return true; + } + } + return false; + } + + /** + * Searches for a given element and, if found, returns the corresponding key/index + * of that element. The comparison of two elements is strict, that means not + * only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element The element to search for. + * @return mixed The key/index of the element or FALSE if the element was not found. + */ + public function indexOf($element) + { + return array_search($element, $this->_elements, true); + } + + /** + * Gets the element with the given key/index. + * + * @param mixed $key The key. + * @return mixed The element or NULL, if no element exists for the given key. + */ + public function get($key) + { + if (isset($this->_elements[$key])) { + return $this->_elements[$key]; + } + return null; + } + + /** + * Gets all keys/indexes of the collection elements. + * + * @return array + */ + public function getKeys() + { + return array_keys($this->_elements); + } + + /** + * Gets all elements. + * + * @return array + */ + public function getValues() + { + return array_values($this->_elements); + } + + /** + * Returns the number of elements in the collection. + * + * Implementation of the Countable interface. + * + * @return integer The number of elements in the collection. + */ + public function count() + { + return count($this->_elements); + } + + /** + * Adds/sets an element in the collection at the index / with the specified key. + * + * When the collection is a Map this is like put(key,value)/add(key,value). + * When the collection is a List this is like add(position,value). + * + * @param mixed $key + * @param mixed $value + */ + public function set($key, $value) + { + $this->_elements[$key] = $value; + } + + /** + * Adds an element to the collection. + * + * @param mixed $value + * @return boolean Always TRUE. + */ + public function add($value) + { + $this->_elements[] = $value; + return true; + } + + /** + * Checks whether the collection is empty. + * + * Note: This is preferrable over count() == 0. + * + * @return boolean TRUE if the collection is empty, FALSE otherwise. + */ + public function isEmpty() + { + return ! $this->_elements; + } + + /** + * Gets an iterator for iterating over the elements in the collection. + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_elements); + } + + /** + * Applies the given function to each element in the collection and returns + * a new collection with the elements returned by the function. + * + * @param Closure $func + * @return Collection + */ + public function map(Closure $func) + { + return new static(array_map($func, $this->_elements)); + } + + /** + * Returns all the elements of this collection that satisfy the predicate p. + * The order of the elements is preserved. + * + * @param Closure $p The predicate used for filtering. + * @return Collection A collection with the results of the filter operation. + */ + public function filter(Closure $p) + { + return new static(array_filter($this->_elements, $p)); + } + + /** + * Applies the given predicate p to all elements of this collection, + * returning true, if the predicate yields true for all elements. + * + * @param Closure $p The predicate. + * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. + */ + public function forAll(Closure $p) + { + foreach ($this->_elements as $key => $element) { + if ( ! $p($key, $element)) { + return false; + } + } + + return true; + } + + /** + * Partitions this collection in two collections according to a predicate. + * Keys are preserved in the resulting collections. + * + * @param Closure $p The predicate on which to partition. + * @return array An array with two elements. The first element contains the collection + * of elements where the predicate returned TRUE, the second element + * contains the collection of elements where the predicate returned FALSE. + */ + public function partition(Closure $p) + { + $coll1 = $coll2 = array(); + foreach ($this->_elements as $key => $element) { + if ($p($key, $element)) { + $coll1[$key] = $element; + } else { + $coll2[$key] = $element; + } + } + return array(new static($coll1), new static($coll2)); + } + + /** + * Returns a string representation of this object. + * + * @return string + */ + public function __toString() + { + return __CLASS__ . '@' . spl_object_hash($this); + } + + /** + * Clears the collection. + */ + public function clear() + { + $this->_elements = array(); + } + + /** + * Extract a slice of $length elements starting at position $offset from the Collection. + * + * If $length is null it returns all elements from $offset to the end of the Collection. + * Keys have to be preserved by this method. Calling this method will only return the + * selected slice and NOT change the elements contained in the collection slice is called on. + * + * @param int $offset + * @param int $length + * @return array + */ + public function slice($offset, $length = null) + { + return array_slice($this->_elements, $offset, $length, true); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php new file mode 100644 index 00000000..9fca659c --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php @@ -0,0 +1,243 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Closure, Countable, IteratorAggregate, ArrayAccess; + +/** + * The missing (SPL) Collection/Array/OrderedMap interface. + * + * A Collection resembles the nature of a regular PHP array. That is, + * it is essentially an ordered map that can also be used + * like a list. + * + * A Collection has an internal iterator just like a PHP array. In addition, + * a Collection can be iterated with external iterators, which is preferrable. + * To use an external iterator simply use the foreach language construct to + * iterate over the collection (which calls {@link getIterator()} internally) or + * explicitly retrieve an iterator though {@link getIterator()} which can then be + * used to iterate over the collection. + * You can not rely on the internal iterator of the collection being at a certain + * position unless you explicitly positioned it before. Prefer iteration with + * external iterators. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface Collection extends Countable, IteratorAggregate, ArrayAccess +{ + /** + * Adds an element at the end of the collection. + * + * @param mixed $element The element to add. + * @return boolean Always TRUE. + */ + function add($element); + + /** + * Clears the collection, removing all elements. + */ + function clear(); + + /** + * Checks whether an element is contained in the collection. + * This is an O(n) operation, where n is the size of the collection. + * + * @param mixed $element The element to search for. + * @return boolean TRUE if the collection contains the element, FALSE otherwise. + */ + function contains($element); + + /** + * Checks whether the collection is empty (contains no elements). + * + * @return boolean TRUE if the collection is empty, FALSE otherwise. + */ + function isEmpty(); + + /** + * Removes the element at the specified index from the collection. + * + * @param string|integer $key The kex/index of the element to remove. + * @return mixed The removed element or NULL, if the collection did not contain the element. + */ + function remove($key); + + /** + * Removes the specified element from the collection, if it is found. + * + * @param mixed $element The element to remove. + * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. + */ + function removeElement($element); + + /** + * Checks whether the collection contains an element with the specified key/index. + * + * @param string|integer $key The key/index to check for. + * @return boolean TRUE if the collection contains an element with the specified key/index, + * FALSE otherwise. + */ + function containsKey($key); + + /** + * Gets the element at the specified key/index. + * + * @param string|integer $key The key/index of the element to retrieve. + * @return mixed + */ + function get($key); + + /** + * Gets all keys/indices of the collection. + * + * @return array The keys/indices of the collection, in the order of the corresponding + * elements in the collection. + */ + function getKeys(); + + /** + * Gets all values of the collection. + * + * @return array The values of all elements in the collection, in the order they + * appear in the collection. + */ + function getValues(); + + /** + * Sets an element in the collection at the specified key/index. + * + * @param string|integer $key The key/index of the element to set. + * @param mixed $value The element to set. + */ + function set($key, $value); + + /** + * Gets a native PHP array representation of the collection. + * + * @return array + */ + function toArray(); + + /** + * Sets the internal iterator to the first element in the collection and + * returns this element. + * + * @return mixed + */ + function first(); + + /** + * Sets the internal iterator to the last element in the collection and + * returns this element. + * + * @return mixed + */ + function last(); + + /** + * Gets the key/index of the element at the current iterator position. + * + */ + function key(); + + /** + * Gets the element of the collection at the current iterator position. + * + */ + function current(); + + /** + * Moves the internal iterator position to the next element. + * + */ + function next(); + + /** + * Tests for the existence of an element that satisfies the given predicate. + * + * @param Closure $p The predicate. + * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. + */ + function exists(Closure $p); + + /** + * Returns all the elements of this collection that satisfy the predicate p. + * The order of the elements is preserved. + * + * @param Closure $p The predicate used for filtering. + * @return Collection A collection with the results of the filter operation. + */ + function filter(Closure $p); + + /** + * Applies the given predicate p to all elements of this collection, + * returning true, if the predicate yields true for all elements. + * + * @param Closure $p The predicate. + * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. + */ + function forAll(Closure $p); + + /** + * Applies the given function to each element in the collection and returns + * a new collection with the elements returned by the function. + * + * @param Closure $func + * @return Collection + */ + function map(Closure $func); + + /** + * Partitions this collection in two collections according to a predicate. + * Keys are preserved in the resulting collections. + * + * @param Closure $p The predicate on which to partition. + * @return array An array with two elements. The first element contains the collection + * of elements where the predicate returned TRUE, the second element + * contains the collection of elements where the predicate returned FALSE. + */ + function partition(Closure $p); + + /** + * Gets the index/key of a given element. The comparison of two elements is strict, + * that means not only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element The element to search for. + * @return mixed The key/index of the element or FALSE if the element was not found. + */ + function indexOf($element); + + /** + * Extract a slice of $length elements starting at position $offset from the Collection. + * + * If $length is null it returns all elements from $offset to the end of the Collection. + * Keys have to be preserved by this method. Calling this method will only return the + * selected slice and NOT change the elements contained in the collection slice is called on. + * + * @param int $offset + * @param int $length + * @return array + */ + function slice($offset, $length = null); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php new file mode 100644 index 00000000..8c5669be --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php @@ -0,0 +1,28 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Base exception class for package Doctrine\Common + * @author heinrich + * + */ +class CommonException extends \Exception { +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php new file mode 100644 index 00000000..bc95d303 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php @@ -0,0 +1,47 @@ +. + */ + + +namespace Doctrine\Common; + +/** + * Comparable interface that allows to compare two value objects to each other for similarity. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.com + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + */ +interface Comparable +{ + /** + * Compare the current object to the passed $other. + * + * Returns 0 if they are semantically equal, 1 if the other object + * is less than the current one, or -1 if its more than the current one. + * + * This method should not check for identity using ===, only for semantical equality for example + * when two different DateTime instances point to the exact same Date + TZ. + * + * @return int + */ + public function compareTo($other); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php new file mode 100644 index 00000000..6a3c0699 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php @@ -0,0 +1,69 @@ +. + */ + +namespace Doctrine\Common; + +/** + * EventArgs is the base class for classes containing event data. + * + * This class contains no event data. It is used by events that do not pass state + * information to an event handler when an event is raised. The single empty EventArgs + * instance can be obtained through {@link getEmptyInstance}. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class EventArgs +{ + /** + * @var EventArgs Single instance of EventArgs + * @static + */ + private static $_emptyEventArgsInstance; + + /** + * Gets the single, empty and immutable EventArgs instance. + * + * This instance will be used when events are dispatched without any parameter, + * like this: EventManager::dispatchEvent('eventname'); + * + * The benefit from this is that only one empty instance is instantiated and shared + * (otherwise there would be instances for every dispatched in the abovementioned form) + * + * @see EventManager::dispatchEvent + * @link http://msdn.microsoft.com/en-us/library/system.eventargs.aspx + * @static + * @return EventArgs + */ + public static function getEmptyInstance() + { + if ( ! self::$_emptyEventArgsInstance) { + self::$_emptyEventArgsInstance = new EventArgs; + } + + return self::$_emptyEventArgsInstance; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php new file mode 100644 index 00000000..a1f11ed2 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php @@ -0,0 +1,136 @@ +. + */ + +namespace Doctrine\Common; + +/** + * The EventManager is the central point of Doctrine's event listener system. + * Listeners are registered on the manager and events are dispatched through the + * manager. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class EventManager +{ + /** + * Map of registered listeners. + * => + * + * @var array + */ + private $_listeners = array(); + + /** + * Dispatches an event to all registered listeners. + * + * @param string $eventName The name of the event to dispatch. The name of the event is + * the name of the method that is invoked on listeners. + * @param EventArgs $eventArgs The event arguments to pass to the event handlers/listeners. + * If not supplied, the single empty EventArgs instance is used. + * @return boolean + */ + public function dispatchEvent($eventName, EventArgs $eventArgs = null) + { + if (isset($this->_listeners[$eventName])) { + $eventArgs = $eventArgs === null ? EventArgs::getEmptyInstance() : $eventArgs; + + foreach ($this->_listeners[$eventName] as $listener) { + $listener->$eventName($eventArgs); + } + } + } + + /** + * Gets the listeners of a specific event or all listeners. + * + * @param string $event The name of the event. + * @return array The event listeners for the specified event, or all event listeners. + */ + public function getListeners($event = null) + { + return $event ? $this->_listeners[$event] : $this->_listeners; + } + + /** + * Checks whether an event has any registered listeners. + * + * @param string $event + * @return boolean TRUE if the specified event has any listeners, FALSE otherwise. + */ + public function hasListeners($event) + { + return isset($this->_listeners[$event]) && $this->_listeners[$event]; + } + + /** + * Adds an event listener that listens on the specified events. + * + * @param string|array $events The event(s) to listen on. + * @param object $listener The listener object. + */ + public function addEventListener($events, $listener) + { + // Picks the hash code related to that listener + $hash = spl_object_hash($listener); + + foreach ((array) $events as $event) { + // Overrides listener if a previous one was associated already + // Prevents duplicate listeners on same event (same instance only) + $this->_listeners[$event][$hash] = $listener; + } + } + + /** + * Removes an event listener from the specified events. + * + * @param string|array $events + * @param object $listener + */ + public function removeEventListener($events, $listener) + { + // Picks the hash code related to that listener + $hash = spl_object_hash($listener); + + foreach ((array) $events as $event) { + // Check if actually have this listener associated + if (isset($this->_listeners[$event][$hash])) { + unset($this->_listeners[$event][$hash]); + } + } + } + + /** + * Adds an EventSubscriber. The subscriber is asked for all the events he is + * interested in and added as a listener for these events. + * + * @param Doctrine\Common\EventSubscriber $subscriber The subscriber. + */ + public function addEventSubscriber(EventSubscriber $subscriber) + { + $this->addEventListener($subscriber->getSubscribedEvents(), $subscriber); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php new file mode 100644 index 00000000..ed3383fa --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php @@ -0,0 +1,45 @@ +. + */ + +namespace Doctrine\Common; + +/** + * An EventSubscriber knows himself what events he is interested in. + * If an EventSubscriber is added to an EventManager, the manager invokes + * {@link getSubscribedEvents} and registers the subscriber as a listener for all + * returned events. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface EventSubscriber +{ + /** + * Returns an array of events this subscriber wants to listen to. + * + * @return array + */ + function getSubscribedEvents(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php new file mode 100644 index 00000000..8df3b843 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php @@ -0,0 +1,266 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Base class for writing simple lexers, i.e. for creating small DSLs. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @todo Rename: AbstractLexer + */ +abstract class Lexer +{ + /** + * @var array Array of scanned tokens + */ + private $tokens = array(); + + /** + * @var integer Current lexer position in input string + */ + private $position = 0; + + /** + * @var integer Current peek of current lexer position + */ + private $peek = 0; + + /** + * @var array The next token in the input. + */ + public $lookahead; + + /** + * @var array The last matched/seen token. + */ + public $token; + + /** + * Sets the input data to be tokenized. + * + * The Lexer is immediately reset and the new input tokenized. + * Any unprocessed tokens from any previous input are lost. + * + * @param string $input The input to be tokenized. + */ + public function setInput($input) + { + $this->tokens = array(); + $this->reset(); + $this->scan($input); + } + + /** + * Resets the lexer. + */ + public function reset() + { + $this->lookahead = null; + $this->token = null; + $this->peek = 0; + $this->position = 0; + } + + /** + * Resets the peek pointer to 0. + */ + public function resetPeek() + { + $this->peek = 0; + } + + /** + * Resets the lexer position on the input to the given position. + * + * @param integer $position Position to place the lexical scanner + */ + public function resetPosition($position = 0) + { + $this->position = $position; + } + + /** + * Checks whether a given token matches the current lookahead. + * + * @param integer|string $token + * @return boolean + */ + public function isNextToken($token) + { + return null !== $this->lookahead && $this->lookahead['type'] === $token; + } + + /** + * Checks whether any of the given tokens matches the current lookahead + * + * @param array $tokens + * @return boolean + */ + public function isNextTokenAny(array $tokens) + { + return null !== $this->lookahead && in_array($this->lookahead['type'], $tokens, true); + } + + /** + * Moves to the next token in the input string. + * + * A token is an associative array containing three items: + * - 'value' : the string value of the token in the input string + * - 'type' : the type of the token (identifier, numeric, string, input + * parameter, none) + * - 'position' : the position of the token in the input string + * + * @return array|null the next token; null if there is no more tokens left + */ + public function moveNext() + { + $this->peek = 0; + $this->token = $this->lookahead; + $this->lookahead = (isset($this->tokens[$this->position])) + ? $this->tokens[$this->position++] : null; + + return $this->lookahead !== null; + } + + /** + * Tells the lexer to skip input tokens until it sees a token with the given value. + * + * @param $type The token type to skip until. + */ + public function skipUntil($type) + { + while ($this->lookahead !== null && $this->lookahead['type'] !== $type) { + $this->moveNext(); + } + } + + /** + * Checks if given value is identical to the given token + * + * @param mixed $value + * @param integer $token + * @return boolean + */ + public function isA($value, $token) + { + return $this->getType($value) === $token; + } + + /** + * Moves the lookahead token forward. + * + * @return array | null The next token or NULL if there are no more tokens ahead. + */ + public function peek() + { + if (isset($this->tokens[$this->position + $this->peek])) { + return $this->tokens[$this->position + $this->peek++]; + } else { + return null; + } + } + + /** + * Peeks at the next token, returns it and immediately resets the peek. + * + * @return array|null The next token or NULL if there are no more tokens ahead. + */ + public function glimpse() + { + $peek = $this->peek(); + $this->peek = 0; + return $peek; + } + + /** + * Scans the input string for tokens. + * + * @param string $input a query string + */ + protected function scan($input) + { + static $regex; + + if ( ! isset($regex)) { + $regex = '/(' . implode(')|(', $this->getCatchablePatterns()) . ')|' + . implode('|', $this->getNonCatchablePatterns()) . '/i'; + } + + $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE; + $matches = preg_split($regex, $input, -1, $flags); + + foreach ($matches as $match) { + // Must remain before 'value' assignment since it can change content + $type = $this->getType($match[0]); + + $this->tokens[] = array( + 'value' => $match[0], + 'type' => $type, + 'position' => $match[1], + ); + } + } + + /** + * Gets the literal for a given token. + * + * @param integer $token + * @return string + */ + public function getLiteral($token) + { + $className = get_class($this); + $reflClass = new \ReflectionClass($className); + $constants = $reflClass->getConstants(); + + foreach ($constants as $name => $value) { + if ($value === $token) { + return $className . '::' . $name; + } + } + + return $token; + } + + /** + * Lexical catchable patterns. + * + * @return array + */ + abstract protected function getCatchablePatterns(); + + /** + * Lexical non-catchable patterns. + * + * @return array + */ + abstract protected function getNonCatchablePatterns(); + + /** + * Retrieve token type. Also processes the token value if necessary. + * + * @param string $value + * @return integer + */ + abstract protected function getType(&$value); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php new file mode 100644 index 00000000..93e504ae --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php @@ -0,0 +1,45 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Contract for classes that provide the service of notifying listeners of + * changes to their properties. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface NotifyPropertyChanged +{ + /** + * Adds a listener that wants to be notified about property changes. + * + * @param PropertyChangedListener $listener + */ + function addPropertyChangedListener(PropertyChangedListener $listener); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php new file mode 100644 index 00000000..9fff343c --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php @@ -0,0 +1,224 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\ManagerRegistry; + +/** + * Abstract implementation of the ManagerRegistry contract. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +abstract class AbstractManagerRegistry implements ManagerRegistry +{ + private $name; + private $connections; + private $managers; + private $defaultConnection; + private $defaultManager; + private $proxyInterfaceName; + + public function __construct($name, array $connections, array $managers, $defaultConnection, $defaultManager, $proxyInterfaceName) + { + $this->name = $name; + $this->connections = $connections; + $this->managers = $managers; + $this->defaultConnection = $defaultConnection; + $this->defaultManager = $defaultManager; + $this->proxyInterfaceName = $proxyInterfaceName; + } + + /** + * Fetches/creates the given services + * + * A service in this context is connection or a manager instance + * + * @param string $name name of the service + * @return object instance of the given service + */ + abstract protected function getService($name); + + /** + * Resets the given services + * + * A service in this context is connection or a manager instance + * + * @param string $name name of the service + * @return void + */ + abstract protected function resetService($name); + + /** + * Get the name of the registry + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @inheritdoc + */ + public function getConnection($name = null) + { + if (null === $name) { + $name = $this->defaultConnection; + } + + if (!isset($this->connections[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Connection named "%s" does not exist.', $this->name, $name)); + } + + return $this->getService($this->connections[$name]); + } + + /** + * @inheritdoc + */ + public function getConnectionNames() + { + return $this->connections; + } + + /** + * @inheritdoc + */ + public function getConnections() + { + $connections = array(); + foreach ($this->connections as $name => $id) { + $connections[$name] = $this->getService($id); + } + + return $connections; + } + + /** + * @inheritdoc + */ + public function getDefaultConnectionName() + { + return $this->defaultConnection; + } + + /** + * @inheritdoc + */ + public function getDefaultManagerName() + { + return $this->defaultManager; + } + + /** + * @inheritdoc + */ + public function getManager($name = null) + { + if (null === $name) { + $name = $this->defaultManager; + } + + if (!isset($this->managers[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); + } + + return $this->getService($this->managers[$name]); + } + + /** + * @inheritdoc + */ + public function getManagerForClass($class) + { + // Check for namespace alias + if (strpos($class, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $class); + $class = $this->getAliasNamespace($namespaceAlias) . '\\' . $simpleClassName; + } + + $proxyClass = new \ReflectionClass($class); + if ($proxyClass->implementsInterface($this->proxyInterfaceName)) { + $class = $proxyClass->getParentClass()->getName(); + } + + foreach ($this->managers as $id) { + $manager = $this->getService($id); + + if (!$manager->getMetadataFactory()->isTransient($class)) { + return $manager; + } + } + } + + /** + * @inheritdoc + */ + public function getManagerNames() + { + return $this->managers; + } + + /** + * @inheritdoc + */ + public function getManagers() + { + $dms = array(); + foreach ($this->managers as $name => $id) { + $dms[$name] = $this->getService($id); + } + + return $dms; + } + + /** + * @inheritdoc + */ + public function getRepository($persistentObjectName, $persistentManagerName = null) + { + return $this->getManager($persistentManagerName)->getRepository($persistentObjectName); + } + + /** + * @inheritdoc + */ + public function resetManager($name = null) + { + if (null === $name) { + $name = $this->defaultManager; + } + + if (!isset($this->managers[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); + } + + // force the creation of a new document manager + // if the current one is closed + $this->resetService($this->managers[$name]); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php new file mode 100644 index 00000000..a47727fa --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php @@ -0,0 +1,63 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract covering connection for a Doctrine persistence layer ManagerRegistry class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +interface ConnectionRegistry +{ + /** + * Gets the default connection name. + * + * @return string The default connection name + */ + function getDefaultConnectionName(); + + /** + * Gets the named connection. + * + * @param string $name The connection name (null for the default one) + * + * @return Connection + */ + function getConnection($name = null); + + /** + * Gets an array of all registered connections + * + * @return array An array of Connection instances + */ + function getConnections(); + + /** + * Gets all connection names. + * + * @return array An array of connection names + */ + function getConnectionNames(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php new file mode 100644 index 00000000..8055b66d --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php @@ -0,0 +1,77 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs; +use Doctrine\Common\Persistence\ObjectManager; + +/** + * Lifecycle Events are triggered by the UnitOfWork during lifecycle transitions + * of entities. + * + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class LifecycleEventArgs extends EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var object + */ + private $entity; + + /** + * Constructor + * + * @param object $entity + * @param ObjectManager $objectManager + */ + public function __construct($entity, ObjectManager $objectManager) + { + $this->entity = $entity; + $this->objectManager = $objectManager; + } + + /** + * Retireve associated Entity. + * + * @return object + */ + public function getEntity() + { + return $this->entity; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php new file mode 100644 index 00000000..4a18d167 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php @@ -0,0 +1,76 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs; +use Doctrine\Common\Persistence\ObjectManager; +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Class that holds event arguments for a loadMetadata event. + * + * @author Jonathan H. Wage + * @since 2.2 + */ +class LoadClassMetadataEventArgs extends EventArgs +{ + /** + * @var ClassMetadata + */ + private $classMetadata; + + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * Constructor. + * + * @param ClasseMetadata $classMetadata + * @param ObjectManager $objectManager + */ + public function __construct(ClassMetadata $classMetadata, ObjectManager $objectManager) + { + $this->classMetadata = $classMetadata; + $this->objectManager = $objectManager; + } + + /** + * Retrieve associated ClassMetadata. + * + * @return ClassMetadata + */ + public function getClassMetadata() + { + return $this->classMetadata; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php new file mode 100644 index 00000000..33c4d796 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php @@ -0,0 +1,59 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\Persistence\ObjectManager; + +/** + * Provides event arguments for the preFlush event. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class ManagerEventArgs extends \Doctrine\Common\EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * Constructor. + * + * @param ObjectManager $objectManager + */ + public function __construct(ObjectManager $objectManager) + { + $this->objectManager = $objectManager; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php new file mode 100644 index 00000000..f67ab50e --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php @@ -0,0 +1,84 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +/** + * Provides event arguments for the onClear event. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class OnClearEventArgs extends \Doctrine\Common\EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var string + */ + private $entityClass; + + /** + * Constructor. + * + * @param ObjectManager $objectManager + * @param string $entityClass Optional entity class + */ + public function __construct($objectManager, $entityClass = null) + { + $this->objectManager = $objectManager; + $this->entityClass = $entityClass; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } + + /** + * Name of the entity class that is cleared, or empty if all are cleared. + * + * @return string + */ + public function getEntityClass() + { + return $this->entityClass; + } + + /** + * Check if event clears all entities. + * + * @return bool + */ + public function clearsAllEntities() + { + return ($this->entityClass === null); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php new file mode 100644 index 00000000..191d053a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php @@ -0,0 +1,129 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs, + Doctrine\Common\Persistence\ObjectManager; + +/** + * Class that holds event arguments for a preUpdate event. + * + * @author Guilherme Blanco + * @author Roman Borschel + * @author Benjamin Eberlei + * @since 2.2 + */ +class PreUpdateEventArgs extends LifecycleEventArgs +{ + /** + * @var array + */ + private $entityChangeSet; + + /** + * Constructor. + * + * @param object $entity + * @param ObjectManager $objectManager + * @param array $changeSet + */ + public function __construct($entity, ObjectManager $objectManager, array &$changeSet) + { + parent::__construct($entity, $objectManager); + + $this->entityChangeSet = &$changeSet; + } + + /** + * Retrieve entity changeset. + * + * @return array + */ + public function getEntityChangeSet() + { + return $this->entityChangeSet; + } + + /** + * Check if field has a changeset. + * + * @return boolean + */ + public function hasChangedField($field) + { + return isset($this->entityChangeSet[$field]); + } + + /** + * Get the old value of the changeset of the changed field. + * + * @param string $field + * @return mixed + */ + public function getOldValue($field) + { + $this->assertValidField($field); + + return $this->entityChangeSet[$field][0]; + } + + /** + * Get the new value of the changeset of the changed field. + * + * @param string $field + * @return mixed + */ + public function getNewValue($field) + { + $this->assertValidField($field); + + return $this->entityChangeSet[$field][1]; + } + + /** + * Set the new value of this field. + * + * @param string $field + * @param mixed $value + */ + public function setNewValue($field, $value) + { + $this->assertValidField($field); + + $this->entityChangeSet[$field][1] = $value; + } + + /** + * Assert the field exists in changeset. + * + * @param string $field + */ + private function assertValidField($field) + { + if ( ! isset($this->entityChangeSet[$field])) { + throw new \InvalidArgumentException(sprintf( + 'Field "%s" is not a valid field of the entity "%s" in PreUpdateEventArgs.', + $field, + get_class($this->getEntity()) + )); + } + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php new file mode 100644 index 00000000..4d92426b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php @@ -0,0 +1,112 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract covering object managers for a Doctrine persistence layer ManagerRegistry class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +interface ManagerRegistry extends ConnectionRegistry +{ + /** + * Gets the default object manager name. + * + * @return string The default object manager name + */ + function getDefaultManagerName(); + + /** + * Gets a named object manager. + * + * @param string $name The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectManager + */ + function getManager($name = null); + + /** + * Gets an array of all registered object managers + * + * @return array An array of ObjectManager instances + */ + function getManagers(); + + /** + * Resets a named object manager. + * + * This method is useful when an object manager has been closed + * because of a rollbacked transaction AND when you think that + * it makes sense to get a new one to replace the closed one. + * + * Be warned that you will get a brand new object manager as + * the existing one is not useable anymore. This means that any + * other object with a dependency on this object manager will + * hold an obsolete reference. You can inject the registry instead + * to avoid this problem. + * + * @param string $name The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectManager + */ + function resetManager($name = null); + + /** + * Resolves a registered namespace alias to the full namespace. + * + * This method looks for the alias in all registered object managers. + * + * @param string $alias The alias + * + * @return string The full namespace + */ + function getAliasNamespace($alias); + + /** + * Gets all connection names. + * + * @return array An array of connection names + */ + function getManagerNames(); + + /** + * Gets the ObjectRepository for an persistent object. + * + * @param string $persistentObject The name of the persistent object. + * @param string $persistentManagerName The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectRepository + */ + function getRepository($persistentObject, $persistentManagerName = null); + + /** + * Gets the object manager associated with a given class. + * + * @param string $class A persistent object class name + * + * @return \Doctrine\Common\Persistence\ObjectManager|null + */ + function getManagerForClass($class); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php new file mode 100644 index 00000000..a2a61850 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php @@ -0,0 +1,359 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use Doctrine\Common\Cache\Cache; + +/** + * The ClassMetadataFactory is used to create ClassMetadata objects that contain all the + * metadata mapping informations of a class which describes how a class should be mapped + * to a relational database. + * + * This class was abstracted from the ORM ClassMetadataFactory + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +abstract class AbstractClassMetadataFactory implements ClassMetadataFactory +{ + /** + * Salt used by specific Object Manager implementation. + * + * @var string + */ + protected $cacheSalt = "\$CLASSMETADATA"; + + /** + * @var \Doctrine\Common\Cache\Cache + */ + private $cacheDriver; + + /** + * @var array + */ + private $loadedMetadata = array(); + + /** + * @var bool + */ + protected $initialized = false; + + /** + * @var ReflectionService + */ + private $reflectionService; + + /** + * Sets the cache driver used by the factory to cache ClassMetadata instances. + * + * @param Doctrine\Common\Cache\Cache $cacheDriver + */ + public function setCacheDriver(Cache $cacheDriver = null) + { + $this->cacheDriver = $cacheDriver; + } + + /** + * Gets the cache driver used by the factory to cache ClassMetadata instances. + * + * @return Doctrine\Common\Cache\Cache + */ + public function getCacheDriver() + { + return $this->cacheDriver; + } + + /** + * Return an array of all the loaded metadata currently in memory. + * + * @return array + */ + public function getLoadedMetadata() + { + return $this->loadedMetadata; + } + + /** + * Forces the factory to load the metadata of all classes known to the underlying + * mapping driver. + * + * @return array The ClassMetadata instances of all mapped classes. + */ + public function getAllMetadata() + { + if ( ! $this->initialized) { + $this->initialize(); + } + + $driver = $this->getDriver(); + $metadata = array(); + foreach ($driver->getAllClassNames() as $className) { + $metadata[] = $this->getMetadataFor($className); + } + + return $metadata; + } + + /** + * Lazy initialization of this stuff, especially the metadata driver, + * since these are not needed at all when a metadata cache is active. + * + * @return void + */ + abstract protected function initialize(); + + /** + * Get the fully qualified class-name from the namespace alias. + * + * @param string $namespaceAlias + * @param string $simpleClassName + * @return string + */ + abstract protected function getFqcnFromAlias($namespaceAlias, $simpleClassName); + + /** + * Return the mapping driver implementation. + * + * @return MappingDriver + */ + abstract protected function getDriver(); + + /** + * Wakeup reflection after ClassMetadata gets unserialized from cache. + * + * @param ClassMetadata $class + * @param ReflectionService $reflService + * @return void + */ + abstract protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService); + + /** + * Initialize Reflection after ClassMetadata was constructed. + * + * @param ClassMetadata $class + * @param ReflectionSErvice $reflService + * @return void + */ + abstract protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService); + + /** + * Gets the class metadata descriptor for a class. + * + * @param string $className The name of the class. + * @return Doctrine\Common\Persistence\Mapping\ClassMetadata + */ + public function getMetadataFor($className) + { + if ( ! isset($this->loadedMetadata[$className])) { + $realClassName = $className; + + // Check for namespace alias + if (strpos($className, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $className); + $realClassName = $this->getFqcnFromAlias($namespaceAlias, $simpleClassName); + + if (isset($this->loadedMetadata[$realClassName])) { + // We do not have the alias name in the map, include it + $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; + + return $this->loadedMetadata[$realClassName]; + } + } + + if ($this->cacheDriver) { + if (($cached = $this->cacheDriver->fetch($realClassName . $this->cacheSalt)) !== false) { + $this->loadedMetadata[$realClassName] = $cached; + $this->wakeupReflection($cached, $this->getReflectionService()); + } else { + foreach ($this->loadMetadata($realClassName) as $loadedClassName) { + $this->cacheDriver->save( + $loadedClassName . $this->cacheSalt, $this->loadedMetadata[$loadedClassName], null + ); + } + } + } else { + $this->loadMetadata($realClassName); + } + + if ($className != $realClassName) { + // We do not have the alias name in the map, include it + $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; + } + } + + return $this->loadedMetadata[$className]; + } + + /** + * Checks whether the factory has the metadata for a class loaded already. + * + * @param string $className + * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. + */ + public function hasMetadataFor($className) + { + return isset($this->loadedMetadata[$className]); + } + + /** + * Sets the metadata descriptor for a specific class. + * + * NOTE: This is only useful in very special cases, like when generating proxy classes. + * + * @param string $className + * @param ClassMetadata $class + */ + public function setMetadataFor($className, $class) + { + $this->loadedMetadata[$className] = $class; + } + + /** + * Get array of parent classes for the given entity class + * + * @param string $name + * @return array $parentClasses + */ + protected function getParentClasses($name) + { + // Collect parent classes, ignoring transient (not-mapped) classes. + $parentClasses = array(); + foreach (array_reverse($this->getReflectionService()->getParentClasses($name)) as $parentClass) { + if ( ! $this->getDriver()->isTransient($parentClass)) { + $parentClasses[] = $parentClass; + } + } + return $parentClasses; + } + + /** + * Loads the metadata of the class in question and all it's ancestors whose metadata + * is still not loaded. + * + * @param string $name The name of the class for which the metadata should get loaded. + * @param array $tables The metadata collection to which the loaded metadata is added. + */ + protected function loadMetadata($name) + { + if ( ! $this->initialized) { + $this->initialize(); + } + + $loaded = array(); + + $parentClasses = $this->getParentClasses($name); + $parentClasses[] = $name; + + // Move down the hierarchy of parent classes, starting from the topmost class + $parent = null; + $rootEntityFound = false; + $visited = array(); + $reflService = $this->getReflectionService(); + foreach ($parentClasses as $className) { + if (isset($this->loadedMetadata[$className])) { + $parent = $this->loadedMetadata[$className]; + if (isset($parent->isMappedSuperclass) && $parent->isMappedSuperclass === false) { + $rootEntityFound = true; + array_unshift($visited, $className); + } + continue; + } + + $class = $this->newClassMetadataInstance($className); + $this->initializeReflection($class, $reflService); + + $this->doLoadMetadata($class, $parent, $rootEntityFound); + + $this->loadedMetadata[$className] = $class; + + $parent = $class; + + if (isset($parent->isMappedSuperclass) && $class->isMappedSuperclass === false) { + $rootEntityFound = true; + array_unshift($visited, $className); + } + + $this->wakeupReflection($class, $reflService); + + $loaded[] = $className; + } + + return $loaded; + } + + /** + * Actually load the metadata from the underlying metadata + * + * @param ClassMetadata $class + * @param ClassMetadata $parent + * @param bool $rootEntityFound + * @return void + */ + abstract protected function doLoadMetadata($class, $parent, $rootEntityFound); + + /** + * Creates a new ClassMetadata instance for the given class name. + * + * @param string $className + * @return ClassMetadata + */ + abstract protected function newClassMetadataInstance($className); + + /** + * Check if this class is mapped by this Object Manager + ClassMetadata configuration + * + * @param $class + * @return bool + */ + public function isTransient($class) + { + if ( ! $this->initialized) { + $this->initialize(); + } + + return $this->getDriver()->isTransient($class); + } + + /** + * Set reflectionService. + * + * @param ReflectionService $reflectionService + */ + public function setReflectionService(ReflectionService $reflectionService) + { + $this->reflectionService = $reflectionService; + } + + /** + * Get the reflection service associated with this metadata factory. + * + * @return ReflectionService + */ + public function getReflectionService() + { + if ($this->reflectionService === null) { + $this->reflectionService = new RuntimeReflectionService(); + } + return $this->reflectionService; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php new file mode 100644 index 00000000..705d59ac --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php @@ -0,0 +1,165 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ClassMetadata +{ + /** + * Get fully-qualified class name of this persistent class. + * + * @return string + */ + function getName(); + + /** + * Gets the mapped identifier field name. + * + * The returned structure is an array of the identifier field names. + * + * @return array + */ + function getIdentifier(); + + /** + * Gets the ReflectionClass instance for this mapped class. + * + * @return ReflectionClass + */ + function getReflectionClass(); + + /** + * Checks if the given field name is a mapped identifier for this class. + * + * @param string $fieldName + * @return boolean + */ + function isIdentifier($fieldName); + + /** + * Checks if the given field is a mapped property for this class. + * + * @param string $fieldName + * @return boolean + */ + function hasField($fieldName); + + /** + * Checks if the given field is a mapped association for this class. + * + * @param string $fieldName + * @return boolean + */ + function hasAssociation($fieldName); + + /** + * Checks if the given field is a mapped single valued association for this class. + * + * @param string $fieldName + * @return boolean + */ + function isSingleValuedAssociation($fieldName); + + /** + * Checks if the given field is a mapped collection valued association for this class. + * + * @param string $fieldName + * @return boolean + */ + function isCollectionValuedAssociation($fieldName); + + /** + * A numerically indexed list of field names of this persistent class. + * + * This array includes identifier fields if present on this class. + * + * @return array + */ + function getFieldNames(); + + /** + * Returns an array of identifier field names numerically indexed. + * + * @return array + */ + function getIdentifierFieldNames(); + + /** + * A numerically indexed list of association names of this persistent class. + * + * This array includes identifier associations if present on this class. + * + * @return array + */ + function getAssociationNames(); + + /** + * Returns a type name of this field. + * + * This type names can be implementation specific but should at least include the php types: + * integer, string, boolean, float/double, datetime. + * + * @param string $fieldName + * @return string + */ + function getTypeOfField($fieldName); + + /** + * Returns the target class name of the given association. + * + * @param string $assocName + * @return string + */ + function getAssociationTargetClass($assocName); + + /** + * Checks if the association is the inverse side of a bidirectional association + * + * @param string $assocName + * @return boolean + */ + function isAssociationInverseSide($assocName); + + /** + * Returns the target field of the owning side of the association + * + * @param string $assocName + * @return string + */ + function getAssociationMappedByTargetField($assocName); + + /** + * Return the identifier of this object as an array with field name as key. + * + * Has to return an empty array if no identifier isset. + * + * @param object $object + * @return array + */ + function getIdentifierValues($object); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php new file mode 100644 index 00000000..bf27ba9a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php @@ -0,0 +1,74 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ClassMetadataFactory +{ + /** + * Forces the factory to load the metadata of all classes known to the underlying + * mapping driver. + * + * @return array The ClassMetadata instances of all mapped classes. + */ + function getAllMetadata(); + + /** + * Gets the class metadata descriptor for a class. + * + * @param string $className The name of the class. + * @return ClassMetadata + */ + function getMetadataFor($className); + + /** + * Checks whether the factory has the metadata for a class loaded already. + * + * @param string $className + * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. + */ + function hasMetadataFor($className); + + /** + * Sets the metadata descriptor for a specific class. + * + * @param string $className + * @param ClassMetadata $class + */ + function setMetadataFor($className, $class); + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped directly or as a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + function isTransient($className); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php new file mode 100644 index 00000000..f52d37ee --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php @@ -0,0 +1,214 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Cache\ArrayCache, + Doctrine\Common\Annotations\AnnotationReader, + Doctrine\Common\Annotations\AnnotationRegistry, + Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The AnnotationDriver reads the mapping metadata from docblock annotations. + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +abstract class AnnotationDriver implements MappingDriver +{ + /** + * The AnnotationReader. + * + * @var AnnotationReader + */ + protected $reader; + + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * The file extension of mapping documents. + * + * @var string + */ + protected $fileExtension = '.php'; + + /** + * Cache for AnnotationDriver#getAllClassNames() + * + * @var array + */ + protected $classNames; + + /** + * Name of the entity annotations as keys + * + * @var array + */ + protected $entityAnnotationClasses = array(); + + /** + * Initializes a new AnnotationDriver that uses the given AnnotationReader for reading + * docblock annotations. + * + * @param AnnotationReader $reader The AnnotationReader to use, duck-typed. + * @param string|array $paths One or multiple paths where mapping classes can be found. + */ + public function __construct($reader, $paths = null) + { + $this->reader = $reader; + if ($paths) { + $this->addPaths((array) $paths); + } + } + + /** + * Append lookup paths to metadata driver. + * + * @param array $paths + */ + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * Retrieve the defined metadata lookup paths. + * + * @return array + */ + public function getPaths() + { + return $this->paths; + } + + /** + * Retrieve the current annotation reader + * + * @return AnnotationReader + */ + public function getReader() + { + return $this->reader; + } + + /** + * Get the file extension used to look for mapping files under + * + * @return void + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * Whether the class with the specified name is transient. Only non-transient + * classes, that is entities and mapped superclasses, should have their metadata loaded. + * + * A class is non-transient if it is annotated with an annotation + * from the {@see AnnotationDriver::entityAnnotationClasses}. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + $classAnnotations = $this->reader->getClassAnnotations(new \ReflectionClass($className)); + + foreach ($classAnnotations as $annot) { + if (isset($this->entityAnnotationClasses[get_class($annot)])) { + return false; + } + } + return true; + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames() + { + if ($this->classNames !== null) { + return $this->classNames; + } + + if (!$this->paths) { + throw MappingException::pathRequired(); + } + + $classes = array(); + $includedFiles = array(); + + foreach ($this->paths as $path) { + if ( ! is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RegexIterator( + new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS), + \RecursiveIteratorIterator::LEAVES_ONLY + ), + '/^.+' . str_replace('.', '\.', $this->fileExtension) . '$/i', + \RecursiveRegexIterator::GET_MATCH + ); + + foreach ($iterator as $file) { + $sourceFile = realpath($file[0]); + + require_once $sourceFile; + + $includedFiles[] = $sourceFile; + } + } + + $declared = get_declared_classes(); + + foreach ($declared as $className) { + $rc = new \ReflectionClass($className); + $sourceFile = $rc->getFileName(); + if (in_array($sourceFile, $includedFiles) && ! $this->isTransient($className)) { + $classes[] = $className; + } + } + + $this->classNames = $classes; + + return $classes; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php new file mode 100644 index 00000000..efaf545e --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php @@ -0,0 +1,169 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * Locate the file that contains the metadata information for a given class name. + * + * This behavior is inpependent of the actual content of the file. It just detects + * the file which is responsible for the given class name. + * + * @author Benjamin Eberlei + * @author Johannes M. Schmitt + */ +class DefaultFileLocator implements FileLocator +{ + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * The file extension of mapping documents. + * + * @var string + */ + protected $fileExtension; + + /** + * Initializes a new FileDriver that looks in the given path(s) for mapping + * documents and operates in the specified operating mode. + * + * @param string|array $paths One or multiple paths where mapping documents can be found. + */ + public function __construct($paths, $fileExtension = null) + { + $this->addPaths((array) $paths); + $this->fileExtension = $fileExtension; + } + + /** + * Append lookup paths to metadata driver. + * + * @param array $paths + */ + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * Retrieve the defined metadata lookup paths. + * + * @return array + */ + public function getPaths() + { + return $this->paths; + } + + /** + * Get the file extension used to look for mapping files under + * + * @return void + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * {@inheritDoc} + */ + public function findMappingFile($className) + { + $fileName = str_replace('\\', '.', $className) . $this->fileExtension; + + // Check whether file exists + foreach ($this->paths as $path) { + if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { + return $path . DIRECTORY_SEPARATOR . $fileName; + } + } + + throw MappingException::mappingFileNotFound($className, $fileName); + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames($globalBasename) + { + $classes = array(); + + if ($this->paths) { + foreach ($this->paths as $path) { + if ( ! is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + $fileName = $file->getBasename($this->fileExtension); + + if ($fileName == $file->getBasename() || $fileName == $globalBasename) { + continue; + } + + // NOTE: All files found here means classes are not transient! + $classes[] = str_replace('.', '\\', $fileName); + } + } + } + + return $classes; + } + + /** + * {@inheritDoc} + */ + public function fileExists($className) + { + $fileName = str_replace('\\', '.', $className) . $this->fileExtension; + + // Check whether file exists + foreach ((array) $this->paths as $path) { + if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php new file mode 100644 index 00000000..22cf117d --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php @@ -0,0 +1,178 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * Base driver for file-based metadata drivers. + * + * A file driver operates in a mode where it loads the mapping files of individual + * classes on demand. This requires the user to adhere to the convention of 1 mapping + * file per class and the file names of the mapping files must correspond to the full + * class name, including namespace, with the namespace delimiters '\', replaced by dots '.'. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.com + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +abstract class FileDriver implements MappingDriver +{ + /** + * @var FileLocator + */ + protected $locator; + + /** + * @var array + */ + protected $classCache; + + /** + * @var string + */ + protected $globalBasename; + + /** + * Initializes a new FileDriver that looks in the given path(s) for mapping + * documents and operates in the specified operating mode. + * + * @param string|array|FileLocator $paths A FileLocator or one/multiple paths where mapping documents can be found. + * @param string $fileExtension + */ + public function __construct($locator, $fileExtension = null) + { + if ($locator instanceof FileLocator) { + $this->locator = $locator; + } else { + $this->locator = new DefaultFileLocator((array)$locator, $fileExtension); + } + } + + public function setGlobalBasename($file) + { + $this->globalBasename = $file; + } + + public function getGlobalBasename() + { + return $this->globalBasename; + } + + /** + * Get the element of schema meta data for the class from the mapping file. + * This will lazily load the mapping file if it is not loaded yet + * + * @return array $element The element of schema meta data + */ + public function getElement($className) + { + if ($this->classCache === null) { + $this->initialize(); + } + + if (isset($this->classCache[$className])) { + return $this->classCache[$className]; + } + + $result = $this->loadMappingFile($this->locator->findMappingFile($className)); + + return $result[$className]; + } + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped as an Entity or a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + if ($this->classCache === null) { + $this->initialize(); + } + + if (isset($this->classCache[$className])) { + return false; + } + + return !$this->locator->fileExists($className); + } + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + public function getAllClassNames() + { + if ($this->classCache === null) { + $this->initialize(); + } + + $classNames = (array)$this->locator->getAllClassNames($this->globalBasename); + if ($this->classCache) { + $classNames = array_merge(array_keys($this->classCache), $classNames); + } + return $classNames; + } + + /** + * Loads a mapping file with the given name and returns a map + * from class/entity names to their corresponding file driver elements. + * + * @param string $file The mapping file to load. + * @return array + */ + abstract protected function loadMappingFile($file); + + /** + * Initialize the class cache from all the global files. + * + * Using this feature adds a substantial performance hit to file drivers as + * more metadata has to be loaded into memory than might actually be + * necessary. This may not be relevant to scenarios where caching of + * metadata is in place, however hits very hard in scenarios where no + * caching is used. + * + * @return void + */ + protected function initialize() + { + $this->classCache = array(); + if (null !== $this->globalBasename) { + foreach ($this->locator->getPaths() as $path) { + $file = $path.'/'.$this->globalBasename.$this->locator->getFileExtension(); + if (is_file($file)) { + $this->classCache = array_merge( + $this->classCache, + $this->loadMappingFile($file) + ); + } + } + } + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php new file mode 100644 index 00000000..a1019d71 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php @@ -0,0 +1,69 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +/** + * Locate the file that contains the metadata information for a given class name. + * + * This behavior is inpependent of the actual content of the file. It just detects + * the file which is responsible for the given class name. + * + * @author Benjamin Eberlei + * @author Johannes M. Schmitt + */ +interface FileLocator +{ + /** + * Locate mapping file for the given class name. + * + * @param string $className + * @return string + */ + function findMappingFile($className); + + /** + * Get all class names that are found with this file locator. + * + * @param string $globalBasename Passed to allow excluding the basename + * @return array + */ + function getAllClassNames($globalBasename); + + /** + * Check if a file can be found for this class name. + * + * @return bool + */ + function fileExists($className); + + /** + * Get all the paths that this file locator looks for mapping files. + * + * @return array + */ + function getPaths(); + + /** + * Get the file extension that mapping files are suffixed with. + * + * @return string + */ + function getFileExtension(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php new file mode 100644 index 00000000..c050d323 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php @@ -0,0 +1,56 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Contract for metadata drivers. + * + * @since 2.2 + * @author Jonathan H. Wage + */ +interface MappingDriver +{ + /** + * Loads the metadata for the specified class into the provided container. + * + * @param string $className + * @param ClassMetadata $metadata + */ + function loadMetadataForClass($className, ClassMetadata $metadata); + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + function getAllClassNames(); + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped as an Entity or a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + function isTransient($className); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php new file mode 100644 index 00000000..c7c14527 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php @@ -0,0 +1,125 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\Driver\MappingDriver, + Doctrine\Common\Persistence\Mapping\ClassMetadata, + Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The DriverChain allows you to add multiple other mapping drivers for + * certain namespaces + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class MappingDriverChain implements MappingDriver +{ + /** + * @var array + */ + private $drivers = array(); + + /** + * Add a nested driver. + * + * @param Driver $nestedDriver + * @param string $namespace + */ + public function addDriver(MappingDriver $nestedDriver, $namespace) + { + $this->drivers[$namespace] = $nestedDriver; + } + + /** + * Get the array of nested drivers. + * + * @return array $drivers + */ + public function getDrivers() + { + return $this->drivers; + } + + /** + * Loads the metadata for the specified class into the provided container. + * + * @param string $className + * @param ClassMetadataInfo $metadata + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + foreach ($this->drivers as $namespace => $driver) { + if (strpos($className, $namespace) === 0) { + $driver->loadMetadataForClass($className, $metadata); + return; + } + } + + throw MappingException::classNotFoundInNamespaces($className, array_keys($this->drivers)); + } + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + public function getAllClassNames() + { + $classNames = array(); + $driverClasses = array(); + foreach ($this->drivers AS $namespace => $driver) { + $oid = spl_object_hash($driver); + if (!isset($driverClasses[$oid])) { + $driverClasses[$oid] = $driver->getAllClassNames(); + } + + foreach ($driverClasses[$oid] AS $className) { + if (strpos($className, $namespace) === 0) { + $classNames[$className] = true; + } + } + } + return array_keys($classNames); + } + + /** + * Whether the class with the specified name should have its metadata loaded. + * + * This is only the case for non-transient classes either mapped as an Entity or MappedSuperclass. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + foreach ($this->drivers AS $namespace => $driver) { + if (strpos($className, $namespace) === 0) { + return $driver->isTransient($className); + } + } + + // class isTransient, i.e. not an entity or mapped superclass + return true; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php new file mode 100644 index 00000000..7751dae3 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * The PHPDriver includes php files which just populate ClassMetadataInfo + * instances with plain php code + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class PHPDriver extends FileDriver +{ + /** + * {@inheritdoc} + */ + protected $metadata; + + /** + * {@inheritDoc} + */ + public function __construct($locator, $fileExtension = null) + { + $fileExtension = ".php"; + parent::__construct($locator, $fileExtension); + } + + /** + * {@inheritdoc} + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + $this->metadata = $metadata; + $this->loadMappingFile($this->locator->findMappingFile($className)); + } + + /** + * {@inheritdoc} + */ + protected function loadMappingFile($file) + { + $metadata = $this->metadata; + include $file; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php new file mode 100644 index 00000000..9103ed86 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php @@ -0,0 +1,131 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The StaticPHPDriver calls a static loadMetadata() method on your entity + * classes where you can manually populate the ClassMetadata instance. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class StaticPHPDriver implements MappingDriver +{ + /** + * Paths of entity directories. + * + * @var array + */ + private $paths = array(); + + /** + * Map of all class names. + * + * @var array + */ + private $classNames; + + public function __construct($paths) + { + $this->addPaths((array) $paths); + } + + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * {@inheritdoc} + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + $className::loadMetadata($metadata); + } + + /** + * {@inheritDoc} + * @todo Same code exists in AnnotationDriver, should we re-use it somehow or not worry about it? + */ + public function getAllClassNames() + { + if ($this->classNames !== null) { + return $this->classNames; + } + + if (!$this->paths) { + throw MappingException::pathRequired(); + } + + $classes = array(); + $includedFiles = array(); + + foreach ($this->paths as $path) { + if (!is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + if ($file->getBasename('.php') == $file->getBasename()) { + continue; + } + + $sourceFile = realpath($file->getPathName()); + require_once $sourceFile; + $includedFiles[] = $sourceFile; + } + } + + $declared = get_declared_classes(); + + foreach ($declared as $className) { + $rc = new \ReflectionClass($className); + $sourceFile = $rc->getFileName(); + if (in_array($sourceFile, $includedFiles) && !$this->isTransient($className)) { + $classes[] = $className; + } + } + + $this->classNames = $classes; + + return $classes; + } + + /** + * {@inheritdoc} + */ + public function isTransient($className) + { + return ! method_exists($className, 'loadMetadata'); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php new file mode 100644 index 00000000..d338cf60 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php @@ -0,0 +1,198 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The Symfony File Locator makes a simplifying assumptions compared + * to the DefaultFileLocator. By assuming paths only contain entities of a certain + * namespace the mapping files consists of the short classname only. + * + * @author Fabien Potencier + * @author Benjamin Eberlei + * @license MIT + */ +class SymfonyFileLocator implements FileLocator +{ + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * A map of mapping directory path to namespace prefix used to expand class shortnames. + * + * @var array + */ + protected $prefixes = array(); + + /** + * File extension that is searched for. + * + * @var string + */ + protected $fileExtension; + + public function __construct(array $prefixes, $fileExtension = null) + { + $this->addNamespacePrefixes($prefixes); + $this->fileExtension = $fileExtension; + } + + public function addNamespacePrefixes(array $prefixes) + { + $this->prefixes = array_merge($this->prefixes, $prefixes); + $this->paths = array_merge($this->paths, array_keys($prefixes)); + } + + public function getNamespacePrefixes() + { + return $this->prefixes; + } + + /** + * {@inheritDoc} + */ + public function getPaths() + { + return $this->paths; + } + + /** + * {@inheritDoc} + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * {@inheritDoc} + */ + public function fileExists($className) + { + $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; + foreach ($this->paths as $path) { + if (!isset($this->prefixes[$path])) { + // global namespace class + if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { + return true; + } + + continue; + } + + $prefix = $this->prefixes[$path]; + + if (0 !== strpos($className, $prefix.'\\')) { + continue; + } + + $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; + return is_file($filename); + } + + return false; + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames($globalBasename = null) + { + $classes = array(); + + if ($this->paths) { + foreach ((array) $this->paths as $path) { + if (!is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + $fileName = $file->getBasename($this->fileExtension); + + if ($fileName == $file->getBasename() || $fileName == $globalBasename) { + continue; + } + + // NOTE: All files found here means classes are not transient! + if (isset($this->prefixes[$path])) { + $classes[] = $this->prefixes[$path].'\\'.str_replace('.', '\\', $fileName); + } else { + $classes[] = str_replace('.', '\\', $fileName); + } + } + } + } + + return $classes; + } + + /** + * {@inheritDoc} + */ + public function findMappingFile($className) + { + $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; + foreach ($this->paths as $path) { + if (!isset($this->prefixes[$path])) { + if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { + return $path.DIRECTORY_SEPARATOR.$defaultFileName; + } + + continue; + } + + $prefix = $this->prefixes[$path]; + + if (0 !== strpos($className, $prefix.'\\')) { + continue; + } + + $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; + if (is_file($filename)) { + return $filename; + } + + throw MappingException::mappingFileNotFound($className, $filename); + } + + throw MappingException::mappingFileNotFound($className, substr($className, strrpos($className, '\\') + 1).$this->fileExtension); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php new file mode 100644 index 00000000..4ecd2ad5 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php @@ -0,0 +1,57 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * A MappingException indicates that something is wrong with the mapping setup. + * + * @since 2.2 + */ +class MappingException extends \Exception +{ + public static function classNotFoundInNamespaces($className, $namespaces) + { + return new self("The class '" . $className . "' was not found in the ". + "chain configured namespaces " . implode(", ", $namespaces)); + } + + public static function pathRequired() + { + return new self("Specifying the paths to your entities is required ". + "in the AnnotationDriver to retrieve all class names."); + } + + public static function fileMappingDriversRequireConfiguredDirectoryPath($path = null) + { + if ( ! empty($path)) { + $path = '[' . $path . ']'; + } + + return new self( + 'File mapping drivers must have a valid directory path, ' . + 'however the given path ' . $path . ' seems to be incorrect!' + ); + } + + public static function mappingFileNotFound($entityName, $fileName) + { + return new self("No mapping file found named '$fileName' for class '$entityName'."); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php new file mode 100644 index 00000000..4e0e312f --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php @@ -0,0 +1,80 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Very simple reflection service abstraction. + * + * This is required inside metadata layers that may require either + * static or runtime reflection. + * + * @author Benjamin Eberlei + */ +interface ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + function getParentClasses($class); + + /** + * Return the shortname of a class. + * + * @param string $class + * @return string + */ + function getClassShortName($class); + + /** + * @param string $class + * @return string + */ + function getClassNamespace($class); + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + function getClass($class); + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + function getAccessibleProperty($class, $property); + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + function hasPublicMethod($class, $method); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php new file mode 100644 index 00000000..abcff581 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php @@ -0,0 +1,102 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use ReflectionClass; +use ReflectionProperty; + +/** + * PHP Runtime Reflection Service + * + * @author Benjamin Eberlei + */ +class RuntimeReflectionService implements ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + public function getParentClasses($class) + { + return class_parents($class); + } + + /** + * Return the shortname of a class. + * + * @param string $class + * @return string + */ + public function getClassShortName($class) + { + $r = new ReflectionClass($class); + return $r->getShortName(); + } + + /** + * @param string $class + * @return string + */ + public function getClassNamespace($class) + { + $r = new ReflectionClass($class); + return $r->getNamespaceName(); + } + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + public function getClass($class) + { + return new ReflectionClass($class); + } + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + public function getAccessibleProperty($class, $property) + { + $property = new ReflectionProperty($class, $property); + $property->setAccessible(true); + return $property; + } + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + public function hasPublicMethod($class, $method) + { + return method_exists($class, $method) && is_callable(array($class, $method)); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php new file mode 100644 index 00000000..2de6e761 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php @@ -0,0 +1,107 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use ReflectionClass; +use ReflectionProperty; + +/** + * PHP Runtime Reflection Service + * + * @author Benjamin Eberlei + */ +class StaticReflectionService implements ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + public function getParentClasses($class) + { + return array(); + } + + /** + * Return the shortname of a class. + * + * @param string $className + * @return string + */ + public function getClassShortName($className) + { + if (strpos($className, '\\') !== false) { + $className = substr($className, strrpos($className, "\\")+1); + } + return $className; + } + + /** + * Return the namespace of a class. + * + * @param string $className + * @return string + */ + public function getClassNamespace($className) + { + $namespace = ''; + if (strpos($className, '\\') !== false) { + $namespace = strrev(substr( strrev($className), strpos(strrev($className), '\\')+1 )); + } + return $namespace; + } + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + public function getClass($class) + { + return null; + } + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + public function getAccessibleProperty($class, $property) + { + return null; + } + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + public function hasPublicMethod($class, $method) + { + return method_exists($class, $method) && is_callable(array($class, $method)); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php new file mode 100644 index 00000000..6d70fc12 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php @@ -0,0 +1,143 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract for a Doctrine persistence layer ObjectManager class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ObjectManager +{ + /** + * Finds a object by its identifier. + * + * This is just a convenient shortcut for getRepository($className)->find($id). + * + * @param string + * @param mixed + * @return object + */ + function find($className, $id); + + /** + * Tells the ObjectManager to make an instance managed and persistent. + * + * The object will be entered into the database as a result of the flush operation. + * + * NOTE: The persist operation always considers objects that are not yet known to + * this ObjectManager as NEW. Do not pass detached objects to the persist operation. + * + * @param object $object The instance to make managed and persistent. + */ + function persist($object); + + /** + * Removes an object instance. + * + * A removed object will be removed from the database as a result of the flush operation. + * + * @param object $object The object instance to remove. + */ + function remove($object); + + /** + * Merges the state of a detached object into the persistence context + * of this ObjectManager and returns the managed copy of the object. + * The object passed to merge will not become associated/managed with this ObjectManager. + * + * @param object $object + */ + function merge($object); + + /** + * Detaches an object from the ObjectManager, causing a managed object to + * become detached. Unflushed changes made to the object if any + * (including removal of the object), will not be synchronized to the database. + * Objects which previously referenced the detached object will continue to + * reference it. + * + * @param object $object The object to detach. + */ + function detach($object); + + /** + * Refreshes the persistent state of an object from the database, + * overriding any local changes that have not yet been persisted. + * + * @param object $object The object to refresh. + */ + function refresh($object); + + /** + * Flushes all changes to objects that have been queued up to now to the database. + * This effectively synchronizes the in-memory state of managed objects with the + * database. + */ + function flush(); + + /** + * Gets the repository for a class. + * + * @param string $className + * @return \Doctrine\Common\Persistence\ObjectRepository + */ + function getRepository($className); + + /** + * Returns the ClassMetadata descriptor for a class. + * + * The class name must be the fully-qualified class name without a leading backslash + * (as it is returned by get_class($obj)). + * + * @param string $className + * @return \Doctrine\Common\Persistence\Mapping\ClassMetadata + */ + function getClassMetadata($className); + + /** + * Gets the metadata factory used to gather the metadata of classes. + * + * @return Doctrine\Common\Persistence\Mapping\ClassMetadataFactory + */ + function getMetadataFactory(); + + /** + * Helper method to initialize a lazy loading proxy or persistent collection. + * + * This method is a no-op for other objects. + * + * @param object $obj + */ + function initializeObject($obj); + + /** + * Check if the object is part of the current UnitOfWork and therefore + * managed. + * + * @param object $object + * @return bool + */ + function contains($object); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php new file mode 100644 index 00000000..015dd3dd --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php @@ -0,0 +1,49 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Makes a Persistent Objects aware of its own object-manager. + * + * Using this interface the managing object manager and class metadata instances + * are injected into the persistent object after construction. This allows + * you to implement ActiveRecord functionality on top of the persistance-ignorance + * that Doctrine propagates. + * + * Word of Warning: This is a very powerful hook to change how you can work with your domain models. + * Using this hook will break the Single Responsibility Principle inside your Domain Objects + * and increase the coupling of database and objects. + * + * Every ObjectManager has to implement this functionality itself. + * + * @author Benjamin Eberlei + */ +interface ObjectManagerAware +{ + /** + * Injects responsible ObjectManager and the ClassMetadata into this persistent object. + * + * @param ObjectManager $objectManager + * @param ClassMetadata $classMetadata + */ + public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php new file mode 100644 index 00000000..22633288 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php @@ -0,0 +1,78 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract for a Doctrine persistence layer ObjectRepository class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ObjectRepository +{ + /** + * Finds an object by its primary key / identifier. + * + * @param $id The identifier. + * @return object The object. + */ + function find($id); + + /** + * Finds all objects in the repository. + * + * @return mixed The objects. + */ + function findAll(); + + /** + * Finds objects by a set of criteria. + * + * Optionally sorting and limiting details can be passed. An implementation may throw + * an UnexpectedValueException if certain values of the sorting or limiting details are + * not supported. + * + * @throws UnexpectedValueException + * @param array $criteria + * @param array|null $orderBy + * @param int|null $limit + * @param int|null $offset + * @return mixed The objects. + */ + function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null); + + /** + * Finds a single object by a set of criteria. + * + * @param array $criteria + * @return object The object. + */ + function findOneBy(array $criteria); + + /** + * Returns the class name of the object managed by the repository + * + * @return string + */ + function getClassName(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php new file mode 100644 index 00000000..4274af62 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php @@ -0,0 +1,233 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; + +/** + * PersistentObject base class that implements getter/setter methods for all mapped fields and associations + * by overriding __call. + * + * This class is a forward compatible implementation of the PersistentObject trait. + * + * + * Limitations: + * + * 1. All persistent objects have to be associated with a single ObjectManager, multiple + * ObjectManagers are not supported. You can set the ObjectManager with `PersistentObject#setObjectManager()`. + * 2. Setters and getters only work if a ClassMetadata instance was injected into the PersistentObject. + * This is either done on `postLoad` of an object or by accessing the global object manager. + * 3. There are no hooks for setters/getters. Just implement the method yourself instead of relying on __call(). + * 4. Slower than handcoded implementations: An average of 7 method calls per access to a field and 11 for an association. + * 5. Only the inverse side associations get autoset on the owning side aswell. Setting objects on the owning side + * will not set the inverse side associations. + * + * @example + * + * PersistentObject::setObjectManager($em); + * + * class Foo extends PersistentObject + * { + * private $id; + * } + * + * $foo = new Foo(); + * $foo->getId(); // method exists through __call + * + * @author Benjamin Eberlei + */ +abstract class PersistentObject implements ObjectManagerAware +{ + /** + * @var ObjectManager + */ + private static $objectManager; + + /** + * @var ClassMetadata + */ + private $cm; + + /** + * Set the object manager responsible for all persistent object base classes. + * + * @param ObjectManager $objectManager + */ + static public function setObjectManager(ObjectManager $objectManager = null) + { + self::$objectManager = $objectManager; + } + + /** + * @return ObjectManager + */ + static public function getObjectManager() + { + return self::$objectManager; + } + + /** + * Inject Doctrine Object Manager + * + * @param ObjectManager $objectManager + * @param ClassMetadata $classMetadata + */ + public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata) + { + if ($objectManager !== self::$objectManager) { + throw new \RuntimeException("Trying to use PersistentObject with different ObjectManager instances. " . + "Was PersistentObject::setObjectManager() called?"); + } + + $this->cm = $classMetadata; + } + + /** + * Sets a persistent fields value. + * + * @throws InvalidArgumentException - When the wrong target object type is passed to an association + * @throws BadMethodCallException - When no persistent field exists by that name. + * @param string $field + * @param array $args + * @return void + */ + private function set($field, $args) + { + $this->initializeDoctrine(); + + if ($this->cm->hasField($field) && !$this->cm->isIdentifier($field)) { + $this->$field = $args[0]; + } else if ($this->cm->hasAssociation($field) && $this->cm->isSingleValuedAssociation($field)) { + $targetClass = $this->cm->getAssociationTargetClass($field); + if (!($args[0] instanceof $targetClass) && $args[0] !== null) { + throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); + } + $this->$field = $args[0]; + $this->completeOwningSide($field, $targetClass, $args[0]); + } else { + throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); + } + } + + /** + * Get persistent field value. + * + * @throws BadMethodCallException - When no persistent field exists by that name. + * @param string $field + * @return mixed + */ + private function get($field) + { + $this->initializeDoctrine(); + + if ( $this->cm->hasField($field) || $this->cm->hasAssociation($field) ) { + return $this->$field; + } else { + throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); + } + } + + /** + * If this is an inverse side association complete the owning side. + * + * @param string $field + * @param ClassMetadata $targetClass + * @param object $targetObject + */ + private function completeOwningSide($field, $targetClass, $targetObject) + { + // add this object on the owning side aswell, for obvious infinite recursion + // reasons this is only done when called on the inverse side. + if ($this->cm->isAssociationInverseSide($field)) { + $mappedByField = $this->cm->getAssociationMappedByTargetField($field); + $targetMetadata = self::$objectManager->getClassMetadata($targetClass); + + $setter = ($targetMetadata->isCollectionValuedAssociation($mappedByField) ? "add" : "set").$mappedByField; + $targetObject->$setter($this); + } + } + + /** + * Add an object to a collection + * + * @param type $field + * @param assoc $args + */ + private function add($field, $args) + { + $this->initializeDoctrine(); + + if ($this->cm->hasAssociation($field) && $this->cm->isCollectionValuedAssociation($field)) { + $targetClass = $this->cm->getAssociationTargetClass($field); + if (!($args[0] instanceof $targetClass)) { + throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); + } + if (!($this->$field instanceof Collection)) { + $this->$field = new ArrayCollection($this->$field ?: array()); + } + $this->$field->add($args[0]); + $this->completeOwningSide($field, $targetClass, $args[0]); + } else { + throw new \BadMethodCallException("There is no method add".$field."() on ".$this->cm->getName()); + } + } + + /** + * Initialize Doctrine Metadata for this class. + * + * @return void + */ + private function initializeDoctrine() + { + if ($this->cm !== null) { + return; + } + + if (!self::$objectManager) { + throw new \RuntimeException("No runtime object manager set. Call PersistentObject#setObjectManager()."); + } + + $this->cm = self::$objectManager->getClassMetadata(get_class($this)); + } + + /** + * Magic method that implements + * + * @param string $method + * @param array $args + * @return mixed + */ + public function __call($method, $args) + { + $command = substr($method, 0, 3); + $field = lcfirst(substr($method, 3)); + if ($command == "set") { + $this->set($field, $args); + } else if ($command == "get") { + return $this->get($field); + } else if ($command == "add") { + $this->add($field, $args); + } else { + throw new \BadMethodCallException("There is no method ".$method." on ".$this->cm->getName()); + } + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php new file mode 100644 index 00000000..726979fc --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php @@ -0,0 +1,60 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Interface for proxy classes. + * + * @author Roman Borschel + * @since 2.2 + */ +interface Proxy +{ + /** + * Marker for Proxy class names. + * + * @var string + */ + const MARKER = '__CG__'; + + /** + * Length of the proxy marker + * + * @var int + */ + const MARKER_LENGTH = 6; + + /** + * Initialize this proxy if its not yet initialized. + * + * Acts as a no-op if already initialized. + * + * @return void + */ + public function __load(); + + /** + * Is this proxy initialized or not. + * + * @return bool + */ + public function __isInitialized(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php b/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php new file mode 100644 index 00000000..87c5b413 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php @@ -0,0 +1,48 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Contract for classes that are potential listeners of a NotifyPropertyChanged + * implementor. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface PropertyChangedListener +{ + /** + * Notifies the listener of a property change. + * + * @param object $sender The object on which the property changed. + * @param string $propertyName The name of the property that changed. + * @param mixed $oldValue The old value of the property that changed. + * @param mixed $newValue The new value of the property that changed. + */ + function propertyChanged($sender, $propertyName, $oldValue, $newValue); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php new file mode 100644 index 00000000..c3462782 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php @@ -0,0 +1,103 @@ +. + */ + +namespace Doctrine\Common\Util; + +use Doctrine\Common\Persistence\Proxy; + +/** + * Class and reflection related functionality for objects that + * might or not be proxy objects at the moment. + * + * @author Benjamin Eberlei + * @author Johannes Schmitt + */ +class ClassUtils +{ + /** + * Get the real class name of a class name that could be a proxy. + * + * @param string + * @return string + */ + public static function getRealClass($class) + { + if (false === $pos = strrpos($class, '\\'.Proxy::MARKER.'\\')) { + return $class; + } + + return substr($class, $pos + Proxy::MARKER_LENGTH + 2); + } + + /** + * Get the real class name of an object (even if its a proxy) + * + * @param object + * @return string + */ + public static function getClass($object) + { + return self::getRealClass(get_class($object)); + } + + /** + * Get the real parent class name of a class or object + * + * @param string + * @return string + */ + public static function getParentClass($className) + { + return get_parent_class( self::getRealClass( $className ) ); + } + + /** + * Create a new reflection class + * + * @param string + * @return ReflectionClass + */ + public static function newReflectionClass($class) + { + return new \ReflectionClass( self::getRealClass( $class ) ); + } + + /** + * Create a new reflection object + * + * @param object + * @return ReflectionObject + */ + public static function newReflectionObject($object) + { + return self::newReflectionClass( self::getClass( $object ) ); + } + + /** + * Given a class name and a proxy namespace return the proxy name. + * + * @param string $className + * @param string $proxyNamespace + * @return string + */ + public static function generateProxyClassName($className, $proxyNamespace) + { + return rtrim($proxyNamespace, '\\') . '\\'.Proxy::MARKER.'\\' . ltrim($className, '\\'); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php new file mode 100644 index 00000000..57ae3120 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php @@ -0,0 +1,123 @@ +. + */ + +namespace Doctrine\Common\Util; + +/** + * Static class containing most used debug methods. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Giorgio Sironi + */ +final class Debug +{ + /** + * Private constructor (prevents from instantiation) + * + */ + private function __construct() {} + + /** + * Prints a dump of the public, protected and private properties of $var. + * + * @static + * @link http://xdebug.org/ + * @param mixed $var + * @param integer $maxDepth Maximum nesting level for object properties + * @param boolean $stripTags Flag that indicate if output should strip HTML tags + */ + public static function dump($var, $maxDepth = 2, $stripTags = true) + { + ini_set('html_errors', 'On'); + + if (extension_loaded('xdebug')) { + ini_set('xdebug.var_display_max_depth', $maxDepth); + } + + $var = self::export($var, $maxDepth++); + + ob_start(); + var_dump($var); + $dump = ob_get_contents(); + ob_end_clean(); + + echo ($stripTags ? strip_tags(html_entity_decode($dump)) : $dump); + + ini_set('html_errors', 'Off'); + } + + public static function export($var, $maxDepth) + { + $return = null; + $isObj = is_object($var); + + if ($isObj && in_array('Doctrine\Common\Collections\Collection', class_implements($var))) { + $var = $var->toArray(); + } + + if ($maxDepth) { + if (is_array($var)) { + $return = array(); + + foreach ($var as $k => $v) { + $return[$k] = self::export($v, $maxDepth - 1); + } + } else if ($isObj) { + $return = new \stdclass(); + if ($var instanceof \DateTime) { + $return->__CLASS__ = "DateTime"; + $return->date = $var->format('c'); + $return->timezone = $var->getTimeZone()->getName(); + } else { + $reflClass = ClassUtils::newReflectionObject($var); + $return->__CLASS__ = ClassUtils::getClass($var); + + if ($var instanceof \Doctrine\Common\Persistence\Proxy) { + $return->__IS_PROXY__ = true; + $return->__PROXY_INITIALIZED__ = $var->__isInitialized(); + } + + foreach ($reflClass->getProperties() as $reflProperty) { + $name = $reflProperty->getName(); + + $reflProperty->setAccessible(true); + $return->$name = self::export($reflProperty->getValue($var), $maxDepth - 1); + } + } + } else { + $return = $var; + } + } else { + $return = is_object($var) ? get_class($var) + : (is_array($var) ? 'Array(' . count($var) . ')' : $var); + } + + return $return; + } + + public static function toString($obj) + { + return method_exists('__toString', $obj) ? (string) $obj : get_class($obj) . '@' . spl_object_hash($obj); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php new file mode 100644 index 00000000..ba1eb17b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php @@ -0,0 +1,72 @@ +. + */ + +namespace Doctrine\Common\Util; + +/** + * Doctrine inflector has static methods for inflecting text + * + * The methods in these classes are from several different sources collected + * across several different php projects and several different authors. The + * original author names and emails are not known + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 1.0 + * @version $Revision: 3189 $ + * @author Konsta Vesterinen + * @author Jonathan H. Wage + */ +class Inflector +{ + /** + * Convert word in to the format for a Doctrine table name. Converts 'ModelName' to 'model_name' + * + * @param string $word Word to tableize + * @return string $word Tableized word + */ + public static function tableize($word) + { + return strtolower(preg_replace('~(?<=\\w)([A-Z])~', '_$1', $word)); + } + + /** + * Convert a word in to the format for a Doctrine class name. Converts 'table_name' to 'TableName' + * + * @param string $word Word to classify + * @return string $word Classified word + */ + public static function classify($word) + { + return str_replace(" ", "", ucwords(strtr($word, "_-", " "))); + } + + /** + * Camelize a word. This uses the classify() method and turns the first character to lowercase + * + * @param string $word + * @return string $word + */ + public static function camelize($word) + { + return lcfirst(self::classify($word)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Version.php b/vendor/doctrine/common/lib/Doctrine/Common/Version.php new file mode 100644 index 00000000..7a87311f --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Version.php @@ -0,0 +1,55 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Class to store and retrieve the version of Doctrine + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class Version +{ + /** + * Current Doctrine Version + */ + const VERSION = '2.2.3'; + + /** + * Compares a Doctrine version with the current one. + * + * @param string $version Doctrine version to compare. + * @return int Returns -1 if older, 0 if it is the same, 1 if version + * passed as argument is newer. + */ + public static function compare($version) + { + $currentVersion = str_replace(' ', '', strtolower(self::VERSION)); + $version = str_replace(' ', '', $version); + + return version_compare($version, $currentVersion); + } +} diff --git a/vendor/doctrine/common/phpunit.xml.dist b/vendor/doctrine/common/phpunit.xml.dist new file mode 100644 index 00000000..b9d3b340 --- /dev/null +++ b/vendor/doctrine/common/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + ./tests/Doctrine/ + + + + + + ./lib/Doctrine/ + + + + + + performance + + + diff --git a/vendor/doctrine/common/tests/.gitignore b/vendor/doctrine/common/tests/.gitignore new file mode 100644 index 00000000..72104052 --- /dev/null +++ b/vendor/doctrine/common/tests/.gitignore @@ -0,0 +1,3 @@ +Doctrine/Tests/Proxies/ +Doctrine/Tests/ORM/Proxy/generated/ +Doctrine/Tests/ORM/Tools/Export/export diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php new file mode 100644 index 00000000..0a329a3c --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php @@ -0,0 +1,538 @@ +getReader(); + + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\DummyClass'); + $this->assertEquals(1, count($reader->getClassAnnotations($class))); + $this->assertInstanceOf($annotName = 'Doctrine\Tests\Common\Annotations\DummyAnnotation', $annot = $reader->getClassAnnotation($class, $annotName)); + $this->assertEquals("hello", $annot->dummyValue); + + $field1Prop = $class->getProperty('field1'); + $propAnnots = $reader->getPropertyAnnotations($field1Prop); + $this->assertEquals(1, count($propAnnots)); + $this->assertInstanceOf($annotName, $annot = $reader->getPropertyAnnotation($field1Prop, $annotName)); + $this->assertEquals("fieldHello", $annot->dummyValue); + + $getField1Method = $class->getMethod('getField1'); + $methodAnnots = $reader->getMethodAnnotations($getField1Method); + $this->assertEquals(1, count($methodAnnots)); + $this->assertInstanceOf($annotName, $annot = $reader->getMethodAnnotation($getField1Method, $annotName)); + $this->assertEquals(array(1, 2, "three"), $annot->value); + + $field2Prop = $class->getProperty('field2'); + $propAnnots = $reader->getPropertyAnnotations($field2Prop); + $this->assertEquals(1, count($propAnnots)); + $this->assertInstanceOf($annotName = 'Doctrine\Tests\Common\Annotations\DummyJoinTable', $joinTableAnnot = $reader->getPropertyAnnotation($field2Prop, $annotName)); + $this->assertEquals(1, count($joinTableAnnot->joinColumns)); + $this->assertEquals(1, count($joinTableAnnot->inverseJoinColumns)); + $this->assertTrue($joinTableAnnot->joinColumns[0] instanceof DummyJoinColumn); + $this->assertTrue($joinTableAnnot->inverseJoinColumns[0] instanceof DummyJoinColumn); + $this->assertEquals('col1', $joinTableAnnot->joinColumns[0]->name); + $this->assertEquals('col2', $joinTableAnnot->joinColumns[0]->referencedColumnName); + $this->assertEquals('col3', $joinTableAnnot->inverseJoinColumns[0]->name); + $this->assertEquals('col4', $joinTableAnnot->inverseJoinColumns[0]->referencedColumnName); + + $dummyAnnot = $reader->getMethodAnnotation($class->getMethod('getField1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('', $dummyAnnot->dummyValue); + $this->assertEquals(array(1, 2, 'three'), $dummyAnnot->value); + + $dummyAnnot = $reader->getPropertyAnnotation($class->getProperty('field1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('fieldHello', $dummyAnnot->dummyValue); + + $classAnnot = $reader->getClassAnnotation($class, 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('hello', $classAnnot->dummyValue); + } + + public function testAnnotationsWithValidTargets() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithValidAnnotationTarget'); + + $this->assertEquals(1,count($reader->getClassAnnotations($class))); + $this->assertEquals(1,count($reader->getPropertyAnnotations($class->getProperty('foo')))); + $this->assertEquals(1,count($reader->getMethodAnnotations($class->getMethod('someFunction')))); + $this->assertEquals(1,count($reader->getPropertyAnnotations($class->getProperty('nested')))); + } + + public function testAnnotationsWithVarType() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $this->assertEquals(1,count($fooAnnot = $reader->getPropertyAnnotations($class->getProperty('foo')))); + $this->assertEquals(1,count($barAnnot = $reader->getMethodAnnotations($class->getMethod('bar')))); + + $this->assertInternalType('string', $fooAnnot[0]->string); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', $barAnnot[0]->annotation); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetPropertyMethod is not allowed to be declared on class Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass. You may only use this annotation on these code elements: METHOD, PROPERTY + */ + public function testClassWithInvalidAnnotationTargetAtClassDocBlock() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetClass is not allowed to be declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty::$foo. You may only use this annotation on these code elements: CLASS + */ + public function testClassWithInvalidAnnotationTargetAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty', 'foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetAnnotation is not allowed to be declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty::$bar. You may only use this annotation on these code elements: ANNOTATION + */ + public function testClassWithInvalidNestedAnnotationTargetAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty', 'bar')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetClass is not allowed to be declared on method Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod::functionName(). You may only use this annotation on these code elements: CLASS + */ + public function testClassWithInvalidAnnotationTargetAtMethodDocBlock() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod', 'functionName')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtClassDocBlock() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError','foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtMethodDocBlock() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError','bar')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Type Error] Attribute "string" of @AnnotationWithVarType declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType::$invalidProperty expects a(n) string, but got integer. + */ + public function testClassWithPropertyInvalidVarTypeError() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $reader->getPropertyAnnotations($class->getProperty('invalidProperty')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Type Error] Attribute "annotation" of @AnnotationWithVarType declared on method Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType::invalidMethod() expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll, but got an instance of Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. + */ + public function testClassWithMethodInvalidVarTypeError() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $reader->getMethodAnnotations($class->getMethod('invalidMethod')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in class Doctrine\Tests\Common\Annotations\DummyClassSyntaxError. + */ + public function testClassSyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\DummyClassSyntaxError')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in method Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError::foo(). + */ + public function testMethodSyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError', 'foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in property Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError::$foo. + */ + public function testPropertySyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError', 'foo')); + } + + /** + * @group regression + */ + public function testMultipleAnnotationsOnSameLine() + { + $reader = $this->getReader(); + $annots = $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClass2', 'id')); + $this->assertEquals(3, count($annots)); + } + + public function testNonAnnotationProblem() + { + $reader = $this->getReader(); + + $this->assertNotNull($annot = $reader->getPropertyAnnotation(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClassNonAnnotationProblem', 'foo'), $name = 'Doctrine\Tests\Common\Annotations\DummyAnnotation')); + $this->assertInstanceOf($name, $annot); + } + + public function testImportWithConcreteAnnotation() + { + $reader = $this->getReader(); + $property = new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestImportWithConcreteAnnotation', 'field'); + $annotations = $reader->getPropertyAnnotations($property); + $this->assertEquals(1, count($annotations)); + $this->assertNotNull($reader->getPropertyAnnotation($property, 'Doctrine\Tests\Common\Annotations\DummyAnnotation')); + } + + public function testImportWithInheritance() + { + $reader = $this->getReader(); + + $class = new TestParentClass(); + $ref = new \ReflectionClass($class); + + $childAnnotations = $reader->getPropertyAnnotations($ref->getProperty('child')); + $this->assertEquals(1, count($childAnnotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Foo\Name', reset($childAnnotations)); + + $parentAnnotations = $reader->getPropertyAnnotations($ref->getProperty('parent')); + $this->assertEquals(1, count($parentAnnotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Bar\Name', reset($parentAnnotations)); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation "@NameFoo" in property Doctrine\Tests\Common\Annotations\TestAnnotationNotImportedClass::$field was never imported. + */ + public function testImportDetectsNotImportedAnnotation() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestAnnotationNotImportedClass', 'field')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation "@Foo\Bar\Name" in property Doctrine\Tests\Common\Annotations\TestNonExistentAnnotationClass::$field was never imported. + */ + public function testImportDetectsNonExistentAnnotation() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestNonExistentAnnotationClass', 'field')); + } + + public function testTopLevelAnnotation() + { + $reader = $this->getReader(); + $annotations = $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestTopLevelAnnotationClass', 'field')); + + $this->assertEquals(1, count($annotations)); + $this->assertInstanceOf('\TopLevelAnnotation', reset($annotations)); + } + + public function testIgnoresAnnotationsNotPrefixedWithWhitespace() + { + $reader = $this->getReader(); + + $annotation = $reader->getClassAnnotation(new \ReflectionClass(new TestIgnoresNonAnnotationsClass()), 'Doctrine\Tests\Common\Annotations\Name'); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Name', $annotation); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The class "Doctrine\Tests\Common\Annotations\Fixtures\NoAnnotation" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "Doctrine\Tests\Common\Annotations\Fixtures\NoAnnotation". If it is indeed no annotation, then you need to add @IgnoreAnnotation("NoAnnotation") to the _class_ doc comment of class Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageClass. + */ + public function testErrorWhenInvalidAnnotationIsUsed() + { + $reader = $this->getReader(); + $ref = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageClass'); + $reader->getClassAnnotations($ref); + } + + public function testInvalidAnnotationUsageButIgnoredClass() + { + $reader = $this->getReader(); + $ref = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageButIgnoredClass'); + $annots = $reader->getClassAnnotations($ref); + + $this->assertEquals(2, count($annots)); + } + + /** + * @group DDC-1660 + * @group regression + */ + public function testInvalidAnnotationButIgnored() + { + $reader = $this->getReader(); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassDDC1660'); + + $this->assertTrue(class_exists('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Version')); + $this->assertCount(0, $reader->getClassAnnotations($class)); + $this->assertCount(0, $reader->getMethodAnnotations($class->getMethod('bar'))); + $this->assertCount(0, $reader->getPropertyAnnotations($class->getProperty('foo'))); + } + + abstract protected function getReader(); +} + +/** + * @parseAnnotation("var") + * @author Johannes M. Schmitt + * + */ +class TestParseAnnotationClass +{ + /** + * @var + */ + private $field; +} + +/** + * @Name + * @author Johannes M. Schmitt + */ +class TestIgnoresNonAnnotationsClass +{ +} + +class TestTopLevelAnnotationClass +{ + /** + * @\TopLevelAnnotation + */ + private $field; +} + +class TestNonExistentAnnotationClass +{ + /** + * @Foo\Bar\Name + */ + private $field; +} + +class TestAnnotationNotImportedClass +{ + /** + * @NameFoo + */ + private $field; +} + +class TestChildClass +{ + /** + * @\Doctrine\Tests\Common\Annotations\Foo\Name(name = "foo") + */ + protected $child; +} + +class TestParentClass extends TestChildClass +{ + /** + * @\Doctrine\Tests\Common\Annotations\Bar\Name(name = "bar") + */ + private $parent; +} + +class TestImportWithConcreteAnnotation +{ + /** + * @DummyAnnotation(dummyValue = "bar") + */ + private $field; +} + +/** + * A description of this class. + * + * Let's see if the parser recognizes that this @ is not really referring to an + * annotation. Also make sure that @var \ is not concated to "@var\is". + * + * @author robo + * @since 2.0 + * @DummyAnnotation(dummyValue="hello") + */ +class DummyClass { + /** + * A nice property. + * + * @var mixed + * @DummyAnnotation(dummyValue="fieldHello") + */ + private $field1; + + /** + * @DummyJoinTable(name="join_table", + * joinColumns={@DummyJoinColumn(name="col1", referencedColumnName="col2")}, + * inverseJoinColumns={ + * @DummyJoinColumn(name="col3", referencedColumnName="col4") + * }) + */ + private $field2; + + /** + * Gets the value of field1. + * + * @return mixed + * @DummyAnnotation({1,2,"three"}) + */ + public function getField1() { + } +} + +/** + * @ignoreAnnotation("var") + */ +class DummyClass2 { + /** + * @DummyId @DummyColumn(type="integer") @DummyGeneratedValue + * @var integer + */ + private $id; +} + +/** @Annotation */ +class DummyId extends \Doctrine\Common\Annotations\Annotation {} +/** @Annotation */ +class DummyColumn extends \Doctrine\Common\Annotations\Annotation { + public $type; +} +/** @Annotation */ +class DummyGeneratedValue extends \Doctrine\Common\Annotations\Annotation {} +/** @Annotation */ +class DummyAnnotation extends \Doctrine\Common\Annotations\Annotation { + public $dummyValue; +} +/** @Annotation */ +class DummyJoinColumn extends \Doctrine\Common\Annotations\Annotation { + public $name; + public $referencedColumnName; +} +/** @Annotation */ +class DummyJoinTable extends \Doctrine\Common\Annotations\Annotation { + public $name; + public $joinColumns; + public $inverseJoinColumns; +} + +/** + * @DummyAnnotation(@) + */ +class DummyClassSyntaxError +{ + +} + +class DummyClassMethodSyntaxError +{ + /** + * @DummyAnnotation(@) + */ + public function foo() + { + + } +} + +class DummyClassPropertySyntaxError +{ + /** + * @DummyAnnotation(@) + */ + public $foo; +} + +/** + * @ignoreAnnotation({"since", "var"}) + */ +class DummyClassNonAnnotationProblem +{ + /** + * @DummyAnnotation + * + * @var \Test + * @since 0.1 + */ + public $foo; +} + + +/** +* @DummyAnnotation Foo bar +*/ +class DummyClassWithEmail +{ + +} + +namespace Doctrine\Tests\Common\Annotations\Foo; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation +{ + public $name; +} + +namespace Doctrine\Tests\Common\Annotations\Bar; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation +{ + public $name; +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php new file mode 100644 index 00000000..d2cc6678 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php @@ -0,0 +1,13 @@ +getMock('Doctrine\Common\Cache\Cache'); + $cache + ->expects($this->at(0)) + ->method('fetch') + ->with($this->equalTo($cacheKey)) + ->will($this->returnValue(array())) + ; + $cache + ->expects($this->at(1)) + ->method('fetch') + ->with($this->equalTo('[C]'.$cacheKey)) + ->will($this->returnValue(time() - 10)) + ; + $cache + ->expects($this->at(2)) + ->method('save') + ->with($this->equalTo($cacheKey)) + ; + $cache + ->expects($this->at(3)) + ->method('save') + ->with($this->equalTo('[C]'.$cacheKey)) + ; + + $reader = new CachedReader(new AnnotationReader(), $cache, true); + $route = new Route(); + $route->pattern = '/someprefix'; + $this->assertEquals(array($route), $reader->getClassAnnotations(new \ReflectionClass($name))); + } + + protected function getReader() + { + $this->cache = new ArrayCache(); + return new CachedReader(new AnnotationReader(), $this->cache); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php new file mode 100644 index 00000000..cb080f08 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php @@ -0,0 +1,27 @@ +setInput("@Name"); + $this->assertNull($lexer->token); + $this->assertNull($lexer->lookahead); + + $this->assertTrue($lexer->moveNext()); + $this->assertNull($lexer->token); + $this->assertEquals('@', $lexer->lookahead['value']); + + $this->assertTrue($lexer->moveNext()); + $this->assertEquals('@', $lexer->token['value']); + $this->assertEquals('Name', $lexer->lookahead['value']); + + $this->assertFalse($lexer->moveNext()); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php new file mode 100644 index 00000000..56cae7fd --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php @@ -0,0 +1,1118 @@ +createTestParser(); + + // Nested arrays with nested annotations + $result = $parser->parse('@Name(foo={1,2, {"key"=@Name}})'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertNull($annot->value); + $this->assertEquals(3, count($annot->foo)); + $this->assertEquals(1, $annot->foo[0]); + $this->assertEquals(2, $annot->foo[1]); + $this->assertTrue(is_array($annot->foo[2])); + + $nestedArray = $annot->foo[2]; + $this->assertTrue(isset($nestedArray['key'])); + $this->assertTrue($nestedArray['key'] instanceof Name); + } + + public function testBasicAnnotations() + { + $parser = $this->createTestParser(); + + // Marker annotation + $result = $parser->parse("@Name"); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertNull($annot->value); + $this->assertNull($annot->foo); + + // Associative arrays + $result = $parser->parse('@Name(foo={"key1" = "value1"})'); + $annot = $result[0]; + $this->assertNull($annot->value); + $this->assertTrue(is_array($annot->foo)); + $this->assertTrue(isset($annot->foo['key1'])); + + // Numerical arrays + $result = $parser->parse('@Name({2="foo", 4="bar"})'); + $annot = $result[0]; + $this->assertTrue(is_array($annot->value)); + $this->assertEquals('foo', $annot->value[2]); + $this->assertEquals('bar', $annot->value[4]); + $this->assertFalse(isset($annot->value[0])); + $this->assertFalse(isset($annot->value[1])); + $this->assertFalse(isset($annot->value[3])); + + // Multiple values + $result = $parser->parse('@Name(@Name, @Name)'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertTrue(is_array($annot->value)); + $this->assertTrue($annot->value[0] instanceof Name); + $this->assertTrue($annot->value[1] instanceof Name); + + // Multiple types as values + $result = $parser->parse('@Name(foo="Bar", @Name, {"key1"="value1", "key2"="value2"})'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertTrue(is_array($annot->value)); + $this->assertTrue($annot->value[0] instanceof Name); + $this->assertTrue(is_array($annot->value[1])); + $this->assertEquals('value1', $annot->value[1]['key1']); + $this->assertEquals('value2', $annot->value[1]['key2']); + + // Complete docblock + $docblock = <<parse($docblock); + $this->assertEquals(1, count($result)); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + $this->assertNull($annot->value); + } + + public function testNamespacedAnnotations() + { + $parser = new DocParser; + $parser->setIgnoreNotImportedAnnotations(true); + + $docblock = << + * @Doctrine\Tests\Common\Annotations\Name(foo="bar") + * @ignore + */ +DOCBLOCK; + + $result = $parser->parse($docblock); + $this->assertEquals(1, count($result)); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + } + + /** + * @group debug + */ + public function testTypicalMethodDocBlock() + { + $parser = $this->createTestParser(); + + $docblock = <<parse($docblock); + $this->assertEquals(2, count($result)); + $this->assertTrue(isset($result[0])); + $this->assertTrue(isset($result[1])); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + $marker = $result[1]; + $this->assertTrue($marker instanceof Marker); + } + + + public function testAnnotationWithoutConstructor() + { + $parser = $this->createTestParser(); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertNotNull($annot); + $this->assertTrue($annot instanceof SomeAnnotationClassNameWithoutConstructor); + + $this->assertNull($annot->name); + $this->assertNotNull($annot->data); + $this->assertEquals($annot->data, "Some data"); + + + + +$docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertNotNull($annot); + $this->assertTrue($annot instanceof SomeAnnotationClassNameWithoutConstructor); + + $this->assertEquals($annot->name, "Some Name"); + $this->assertEquals($annot->data, "Some data"); + + + + +$docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->data, "Some data"); + $this->assertNull($annot->name); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertNull($annot->data); + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->data, "Some data"); + $this->assertNull($annot->name); + + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertEquals($annot->data, "Some data"); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertEquals($annot->data, "Some data"); + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $this->assertTrue($result[0] instanceof SomeAnnotationClassNameWithoutConstructorAndProperties); + } + + public function testAnnotationTarget() + { + + $parser = new DocParser; + $parser->setImports(array( + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations\Fixtures', + )); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithValidAnnotationTarget'); + + + $context = 'class ' . $class->getName(); + $docComment = $class->getDocComment(); + + $parser->setTarget(Target::TARGET_CLASS); + $this->assertNotNull($parser->parse($docComment,$context)); + + + $property = $class->getProperty('foo'); + $docComment = $property->getDocComment(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + + $parser->setTarget(Target::TARGET_PROPERTY); + $this->assertNotNull($parser->parse($docComment,$context)); + + + + $method = $class->getMethod('someFunction'); + $docComment = $property->getDocComment(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + + $parser->setTarget(Target::TARGET_METHOD); + $this->assertNotNull($parser->parse($docComment,$context)); + + + try { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass'); + $context = 'class ' . $class->getName(); + $docComment = $class->getDocComment(); + + $parser->setTarget(Target::TARGET_CLASS); + $parser->parse($class->getDocComment(),$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + + try { + + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod'); + $method = $class->getMethod('functionName'); + $docComment = $method->getDocComment(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + + $parser->setTarget(Target::TARGET_METHOD); + $parser->parse($docComment,$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + + try { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty'); + $property = $class->getProperty('foo'); + $docComment = $property->getDocComment(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + + $parser->setTarget(Target::TARGET_PROPERTY); + $parser->parse($docComment,$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + } + + public function getAnnotationVarTypeProviderValid() + { + //({attribute name}, {attribute value}) + return array( + // mixed type + array('mixed', '"String Value"'), + array('mixed', 'true'), + array('mixed', 'false'), + array('mixed', '1'), + array('mixed', '1.2'), + array('mixed', '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll'), + + // boolean type + array('boolean', 'true'), + array('boolean', 'false'), + + // alias for internal type boolean + array('bool', 'true'), + array('bool', 'false'), + + // integer type + array('integer', '0'), + array('integer', '1'), + array('integer', '123456789'), + array('integer', '9223372036854775807'), + + // alias for internal type double + array('float', '0.1'), + array('float', '1.2'), + array('float', '123.456'), + + // string type + array('string', '"String Value"'), + array('string', '"true"'), + array('string', '"123"'), + + // array type + array('array', '{@AnnotationExtendsAnnotationTargetAll}'), + array('array', '{@AnnotationExtendsAnnotationTargetAll,@AnnotationExtendsAnnotationTargetAll}'), + + array('arrayOfIntegers', '1'), + array('arrayOfIntegers', '{1}'), + array('arrayOfIntegers', '{1,2,3,4}'), + array('arrayOfAnnotations', '@AnnotationExtendsAnnotationTargetAll'), + array('arrayOfAnnotations', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll}'), + array('arrayOfAnnotations', '{@AnnotationExtendsAnnotationTargetAll, @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll}'), + + // annotation instance + array('annotation', '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll'), + array('annotation', '@AnnotationExtendsAnnotationTargetAll'), + ); + } + + public function getAnnotationVarTypeProviderInvalid() + { + //({attribute name}, {type declared type}, {attribute value} , {given type or class}) + return array( + // boolean type + array('boolean','boolean','1','integer'), + array('boolean','boolean','1.2','double'), + array('boolean','boolean','"str"','string'), + array('boolean','boolean','{1,2,3}','array'), + array('boolean','boolean','@Name', 'an instance of Doctrine\Tests\Common\Annotations\Name'), + + // alias for internal type boolean + array('bool','bool', '1','integer'), + array('bool','bool', '1.2','double'), + array('bool','bool', '"str"','string'), + array('bool','bool', '{"str"}','array'), + + // integer type + array('integer','integer', 'true','boolean'), + array('integer','integer', 'false','boolean'), + array('integer','integer', '1.2','double'), + array('integer','integer', '"str"','string'), + array('integer','integer', '{"str"}','array'), + array('integer','integer', '{1,2,3,4}','array'), + + // alias for internal type double + array('float','float', 'true','boolean'), + array('float','float', 'false','boolean'), + array('float','float', '123','integer'), + array('float','float', '"str"','string'), + array('float','float', '{"str"}','array'), + array('float','float', '{12.34}','array'), + array('float','float', '{1,2,3}','array'), + + // string type + array('string','string', 'true','boolean'), + array('string','string', 'false','boolean'), + array('string','string', '12','integer'), + array('string','string', '1.2','double'), + array('string','string', '{"str"}','array'), + array('string','string', '{1,2,3,4}','array'), + + // annotation instance + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'true','boolean'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'false','boolean'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '12','integer'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '1.2','double'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{"str"}','array'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{1,2,3,4}','array'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '@Name','an instance of Doctrine\Tests\Common\Annotations\Name'), + ); + } + + public function getAnnotationVarTypeArrayProviderInvalid() + { + //({attribute name}, {type declared type}, {attribute value} , {given type or class}) + return array( + array('arrayOfIntegers','integer', 'true','boolean'), + array('arrayOfIntegers','integer', 'false','boolean'), + array('arrayOfIntegers','integer', '{true,true}','boolean'), + array('arrayOfIntegers','integer', '{1,true}','boolean'), + array('arrayOfIntegers','integer', '{1,2,1.2}','double'), + array('arrayOfIntegers','integer', '{1,2,"str"}','string'), + + + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'true','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'false','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,true}','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,true}','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,1.2}','double'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,@AnnotationExtendsAnnotationTargetAll,"str"}','string'), + ); + } + + /** + * @dataProvider getAnnotationVarTypeProviderValid + */ + public function testAnnotationWithVarType($attribute, $value) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::$invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + $result = $parser->parse($docblock, $context); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType', $result[0]); + $this->assertNotNull($result[0]->$attribute); + } + + /** + * @dataProvider getAnnotationVarTypeProviderInvalid + */ + public function testAnnotationWithVarTypeError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType declared on property SomeClassName::invalidProperty. expects a(n) $type, but got $given.", $exc->getMessage()); + } + } + + + /** + * @dataProvider getAnnotationVarTypeArrayProviderInvalid + */ + public function testAnnotationWithVarTypeArrayError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType declared on property SomeClassName::invalidProperty. expects either a(n) $type, or an array of {$type}s, but got $given.", $exc->getMessage()); + } + } + + /** + * @dataProvider getAnnotationVarTypeProviderValid + */ + public function testAnnotationWithAttributes($attribute, $value) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::$invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + $result = $parser->parse($docblock, $context); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes', $result[0]); + $getter = "get".ucfirst($attribute); + $this->assertNotNull($result[0]->$getter()); + } + + /** + * @dataProvider getAnnotationVarTypeProviderInvalid + */ + public function testAnnotationWithAttributesError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes declared on property SomeClassName::invalidProperty. expects a(n) $type, but got $given.", $exc->getMessage()); + } + } + + + /** + * @dataProvider getAnnotationVarTypeArrayProviderInvalid + */ + public function testAnnotationWithAttributesWithVarTypeArrayError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes declared on property SomeClassName::invalidProperty. expects either a(n) $type, or an array of {$type}s, but got $given.", $exc->getMessage()); + } + } + + public function testAnnotationWithRequiredAttributes() + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $parser->setTarget(Target::TARGET_PROPERTY); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes("Some Value", annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + $result = $parser->parse($docblock); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes', $result[0]); + $this->assertEquals("Some Value",$result[0]->getValue()); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation', $result[0]->getAnnot()); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes("Some Value")'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "annot" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes declared on property SomeClassName::invalidProperty. expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. This value should not be null.', $exc->getMessage()); + } + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes(annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "value" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes declared on property SomeClassName::invalidProperty. expects a(n) string. This value should not be null.', $exc->getMessage()); + } + + } + + public function testAnnotationWithRequiredAttributesWithoutContructor() + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $parser->setTarget(Target::TARGET_PROPERTY); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor("Some Value", annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + $result = $parser->parse($docblock); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor', $result[0]); + $this->assertEquals("Some Value", $result[0]->value); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation', $result[0]->annot); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor("Some Value")'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "annot" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor declared on property SomeClassName::invalidProperty. expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. This value should not be null.', $exc->getMessage()); + } + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor(annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "value" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor declared on property SomeClassName::invalidProperty. expects a(n) string. This value should not be null.', $exc->getMessage()); + } + + } + + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation @SomeAnnotationClassNameWithoutConstructorAndProperties declared on does not accept any values, but got {"value":"Foo"}. + */ + public function testWithoutConstructorWhenIsNotDefaultValue() + { + $parser = $this->createTestParser(); + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation @SomeAnnotationClassNameWithoutConstructorAndProperties declared on does not accept any values, but got {"value":"Foo"}. + */ + public function testWithoutConstructorWhenHasNoProperties() + { + $parser = $this->createTestParser(); + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testAnnotationTargetSyntaxError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Invalid Target "Foo". Available targets: [ALL, CLASS, METHOD, PROPERTY, ANNOTATION] + */ + public function testAnnotationWithInvalidTargetDeclarationError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage @Target expects either a string value, or an array of strings, "NULL" given. + */ + public function testAnnotationWithTargetEmptyError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @group DDC-575 + */ + public function testRegressionDDC575() + { + $parser = $this->createTestParser(); + + $docblock = <<parse($docblock); + + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Name", $result[0]); + + $docblock = <<parse($docblock); + + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Name", $result[0]); + } + + /** + * @group DDC-77 + */ + public function testAnnotationWithoutClassIsIgnoredWithoutWarning() + { + $parser = new DocParser(); + $parser->setIgnoreNotImportedAnnotations(true); + $result = $parser->parse("@param"); + + $this->assertEquals(0, count($result)); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected PlainValue, got ''' at position 10. + */ + public function testAnnotationDontAcceptSingleQuotes() + { + $parser = $this->createTestParser(); + $parser->parse("@Name(foo='bar')"); + } + + /** + * @group DCOM-41 + */ + public function testAnnotationDoesntThrowExceptionWhenAtSignIsNotFollowedByIdentifier() + { + $parser = new DocParser(); + $result = $parser->parse("'@'"); + + $this->assertEquals(0, count($result)); + } + + /** + * @group DCOM-41 + * @expectedException Doctrine\Common\Annotations\AnnotationException + */ + public function testAnnotationThrowsExceptionWhenAtSignIsNotFollowedByIdentifierInNestedAnnotation() + { + $parser = new DocParser(); + $result = $parser->parse("@Doctrine\Tests\Common\Annotations\Name(@')"); + } + + /** + * @group DCOM-56 + */ + public function testAutoloadAnnotation() + { + $this->assertFalse(class_exists('Doctrine\Tests\Common\Annotations\Fixture\Annotation\Autoload', false), 'Pre-condition: Doctrine\Tests\Common\Annotations\Fixture\Annotation\Autoload not allowed to be loaded.'); + + $parser = new DocParser(); + + AnnotationRegistry::registerAutoloadNamespace('Doctrine\Tests\Common\Annotations\Fixtures\Annotation', __DIR__ . '/../../../../'); + + $parser->setImports(array( + 'autoload' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Autoload', + )); + $annotations = $parser->parse('@Autoload'); + + $this->assertEquals(1, count($annotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Autoload', $annotations[0]); + } + + public function createTestParser() + { + $parser = new DocParser(); + $parser->setIgnoreNotImportedAnnotations(true); + $parser->setImports(array( + 'name' => 'Doctrine\Tests\Common\Annotations\Name', + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations', + )); + + return $parser; + } + + /** + * @group DDC-78 + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected PlainValue, got ''' at position 10 in class \Doctrine\Tests\Common\Annotations\Name + */ + public function testSyntaxErrorWithContextDescription() + { + $parser = $this->createTestParser(); + $parser->parse("@Name(foo='bar')", "class \Doctrine\Tests\Common\Annotations\Name"); + } + + /** + * @group DDC-183 + */ + public function testSyntaxErrorWithUnknownCharacters() + { + $docblock = <<setInput(trim($docblock, '/ *')); + //var_dump($lexer); + + try { + $parser = $this->createTestParser(); + $result = $parser->parse($docblock); + } catch (Exception $e) { + $this->fail($e->getMessage()); + } + } + + /** + * @group DCOM-14 + */ + public function testIgnorePHPDocThrowTag() + { + $docblock = <<createTestParser(); + $result = $parser->parse($docblock); + } catch (Exception $e) { + $this->fail($e->getMessage()); + } + } + + /** + * @group DCOM-38 + */ + public function testCastInt() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=1234)"); + $annot = $result[0]; + $this->assertInternalType('int', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastNegativeInt() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=-1234)"); + $annot = $result[0]; + $this->assertInternalType('int', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastFloat() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastNegativeFloat() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=-1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->foo); + + $result = $parser->parse("@Marker(-1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->value); + } + + public function testReservedKeywordsInAnnotations() + { + $parser = $this->createTestParser(); + + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\True'); + $this->assertTrue($result[0] instanceof True); + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\False'); + $this->assertTrue($result[0] instanceof False); + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\Null'); + $this->assertTrue($result[0] instanceof Null); + + $result = $parser->parse('@True'); + $this->assertTrue($result[0] instanceof True); + $result = $parser->parse('@False'); + $this->assertTrue($result[0] instanceof False); + $result = $parser->parse('@Null'); + $this->assertTrue($result[0] instanceof Null); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Creation Error] The annotation @SomeAnnotationClassNameWithoutConstructor declared on some class does not have a property named "invalidaProperty". Available properties: data, name + */ + public function testSetValuesExeption() + { + $docblock = <<createTestParser()->parse($docblock, 'some class'); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Syntax Error] Expected Doctrine\Common\Annotations\DocLexer::T_IDENTIFIER or Doctrine\Common\Annotations\DocLexer::T_TRUE or Doctrine\Common\Annotations\DocLexer::T_FALSE or Doctrine\Common\Annotations\DocLexer::T_NULL, got '3.42' at position 5. + */ + public function testInvalidIdentifierInAnnotation() + { + $parser = $this->createTestParser(); + $parser->parse('@Foo\3.42'); + } + + public function testTrailingCommaIsAllowed() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Name({ + "Foo", + "Bar", + })'); + $this->assertEquals(1, count($annots)); + $this->assertEquals(array('Foo', 'Bar'), $annots[0]->value); + } + + public function testDefaultAnnotationValueIsNotOverwritten() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Doctrine\Tests\Common\Annotations\Fixtures\Annotation\AnnotWithDefaultValue'); + $this->assertEquals(1, count($annots)); + $this->assertEquals('bar', $annots[0]->foo); + } + + public function testArrayWithColon() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Name({"foo": "bar"})'); + $this->assertEquals(1, count($annots)); + $this->assertEquals(array('foo' => 'bar'), $annots[0]->value); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Syntax Error] Expected PlainValue, got 'foo:' at position 6. + */ + public function testColonNotAllowedOnTopLevel() + { + $parser = $this->createTestParser(); + $parser->parse('@Name(foo: "bar")'); + } +} + +/** @Annotation */ +class SomeAnnotationClassNameWithoutConstructor +{ + public $data; + public $name; +} + +/** @Annotation */ +class SomeAnnotationWithConstructorWithoutParams +{ + function __construct() + { + $this->data = "Some data"; + } + public $data; + public $name; +} + +/** @Annotation */ +class SomeAnnotationClassNameWithoutConstructorAndProperties{} + +/** + * @Annotation + * @Target("Foo") + */ +class AnnotationWithInvalidTargetDeclaration{} + +/** + * @Annotation + * @Target + */ +class AnnotationWithTargetEmpty{} + +/** @Annotation */ +class AnnotationExtendsAnnotationTargetAll extends \Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll +{ +} + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation { + public $foo; +} + +/** @Annotation */ +class Marker { + public $value; +} + +/** @Annotation */ +class True {} + +/** @Annotation */ +class False {} + +/** @Annotation */ +class Null {} + +namespace Doctrine\Tests\Common\Annotations\FooBar; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation { +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php new file mode 100644 index 00000000..c84344d8 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php @@ -0,0 +1,40 @@ +cacheDir = sys_get_temp_dir() . "/annotations_". uniqid(); + @mkdir($this->cacheDir); + return new FileCacheReader(new AnnotationReader(), $this->cacheDir); + } + + public function tearDown() + { + foreach (glob($this->cacheDir.'/*.php') AS $file) { + unlink($file); + } + rmdir($this->cacheDir); + } + + /** + * @group DCOM-81 + */ + public function testAttemptToCreateAnnotationCacheDir() + { + $this->cacheDir = sys_get_temp_dir() . "/not_existed_dir_". uniqid(); + + $this->assertFalse(is_dir($this->cacheDir)); + + $cache = new FileCacheReader(new AnnotationReader(), $this->cacheDir); + + $this->assertTrue(is_dir($this->cacheDir)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php new file mode 100644 index 00000000..44108e19 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php @@ -0,0 +1,10 @@ +roles = $values['value']; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php new file mode 100644 index 00000000..b507e602 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php @@ -0,0 +1,14 @@ +name = isset($values['value']) ? $values['value'] : null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php new file mode 100644 index 00000000..09ef0317 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php @@ -0,0 +1,11 @@ +"), + @Attribute("annotation", type = "Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll"), + @Attribute("arrayOfAnnotations", type = "array"), + }) + */ +final class AnnotationWithAttributes +{ + + public final function __construct(array $data) + { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + private $mixed; + private $boolean; + private $bool; + private $float; + private $string; + private $integer; + private $array; + private $annotation; + private $arrayOfIntegers; + private $arrayOfAnnotations; + + /** + * @return mixed + */ + public function getMixed() + { + return $this->mixed; + } + + /** + * @return boolean + */ + public function getBoolean() + { + return $this->boolean; + } + + /** + * @return bool + */ + public function getBool() + { + return $this->bool; + } + + /** + * @return float + */ + public function getFloat() + { + return $this->float; + } + + /** + * @return string + */ + public function getString() + { + return $this->string; + } + + public function getInteger() + { + return $this->integer; + } + + /** + * @return array + */ + public function getArray() + { + return $this->array; + } + + /** + * @return Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll + */ + public function getAnnotation() + { + return $this->annotation; + } + + /** + * @return array + */ + public function getArrayOfIntegers() + { + return $this->arrayOfIntegers; + } + + /** + * @return array + */ + public function getArrayOfAnnotations() + { + return $this->arrayOfAnnotations; + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php new file mode 100644 index 00000000..6eb1bc5a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php @@ -0,0 +1,50 @@ + $value) { + $this->$key = $value; + } + } + + /** + * @var string + */ + private $value; + + /** + * + * @var Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation + */ + private $annot; + + /** + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * @return Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation + */ + public function getAnnot() + { + return $this->annot; + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php new file mode 100644 index 00000000..bf458ee7 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php @@ -0,0 +1,24 @@ + + */ + public $arrayOfIntegers; + + /** + * @var array + */ + public $arrayOfAnnotations; + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php new file mode 100644 index 00000000..4e652e13 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php @@ -0,0 +1,30 @@ + + */ +class Controller +{ + /** + * @Route("/", name="_demo") + * @Template() + */ + public function indexAction() + { + return array(); + } + + /** + * @Route("/hello/{name}", name="_demo_hello") + * @Template() + */ + public function helloAction($name) + { + return array('name' => $name); + } + + /** + * @Route("/contact", name="_demo_contact") + * @Template() + */ + public function contactAction() + { + $form = ContactForm::create($this->get('form.context'), 'contact'); + + $form->bind($this->container->get('request'), $form); + if ($form->isValid()) { + $form->send($this->get('mailer')); + + $this->get('session')->setFlash('notice', 'Message sent!'); + + return new RedirectResponse($this->generateUrl('_demo')); + } + + return array('form' => $form); + } + + /** + * Creates the ACL for the passed object identity + * + * @param ObjectIdentityInterface $oid + * @return void + */ + private function createObjectIdentity(ObjectIdentityInterface $oid) + { + $classId = $this->createOrRetrieveClassId($oid->getType()); + + $this->connection->executeQuery($this->getInsertObjectIdentitySql($oid->getIdentifier(), $classId, true)); + } + + /** + * Returns the primary key for the passed class type. + * + * If the type does not yet exist in the database, it will be created. + * + * @param string $classType + * @return integer + */ + private function createOrRetrieveClassId($classType) + { + if (false !== $id = $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn()) { + return $id; + } + + $this->connection->executeQuery($this->getInsertClassSql($classType)); + + return $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn(); + } + + /** + * Returns the primary key for the passed security identity. + * + * If the security identity does not yet exist in the database, it will be + * created. + * + * @param SecurityIdentityInterface $sid + * @return integer + */ + private function createOrRetrieveSecurityIdentityId(SecurityIdentityInterface $sid) + { + if (false !== $id = $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn()) { + return $id; + } + + $this->connection->executeQuery($this->getInsertSecurityIdentitySql($sid)); + + return $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn(); + } + + /** + * Deletes all ACEs for the given object identity primary key. + * + * @param integer $oidPK + * @return void + */ + private function deleteAccessControlEntries($oidPK) + { + $this->connection->executeQuery($this->getDeleteAccessControlEntriesSql($oidPK)); + } + + /** + * Deletes the object identity from the database. + * + * @param integer $pk + * @return void + */ + private function deleteObjectIdentity($pk) + { + $this->connection->executeQuery($this->getDeleteObjectIdentitySql($pk)); + } + + /** + * Deletes all entries from the relations table from the database. + * + * @param integer $pk + * @return void + */ + private function deleteObjectIdentityRelations($pk) + { + $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk)); + } + + /** + * This regenerates the ancestor table which is used for fast read access. + * + * @param AclInterface $acl + * @return void + */ + private function regenerateAncestorRelations(AclInterface $acl) + { + $pk = $acl->getId(); + $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk)); + $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $pk)); + + $parentAcl = $acl->getParentAcl(); + while (null !== $parentAcl) { + $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $parentAcl->getId())); + + $parentAcl = $parentAcl->getParentAcl(); + } + } + + /** + * This processes changes on an ACE related property (classFieldAces, or objectFieldAces). + * + * @param string $name + * @param array $changes + * @return void + */ + private function updateFieldAceProperty($name, array $changes) + { + $sids = new \SplObjectStorage(); + $classIds = new \SplObjectStorage(); + $currentIds = array(); + foreach ($changes[1] as $field => $new) { + for ($i=0,$c=count($new); $i<$c; $i++) { + $ace = $new[$i]; + + if (null === $ace->getId()) { + if ($sids->contains($ace->getSecurityIdentity())) { + $sid = $sids->offsetGet($ace->getSecurityIdentity()); + } else { + $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity()); + } + + $oid = $ace->getAcl()->getObjectIdentity(); + if ($classIds->contains($oid)) { + $classId = $classIds->offsetGet($oid); + } else { + $classId = $this->createOrRetrieveClassId($oid->getType()); + } + + $objectIdentityId = $name === 'classFieldAces' ? null : $ace->getAcl()->getId(); + + $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, $field, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure())); + $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, $field, $i))->fetchColumn(); + $this->loadedAces[$aceId] = $ace; + + $aceIdProperty = new \ReflectionProperty('Symfony\Component\Security\Acl\Domain\Entry', 'id'); + $aceIdProperty->setAccessible(true); + $aceIdProperty->setValue($ace, intval($aceId)); + } else { + $currentIds[$ace->getId()] = true; + } + } + } + + foreach ($changes[0] as $old) { + for ($i=0,$c=count($old); $i<$c; $i++) { + $ace = $old[$i]; + + if (!isset($currentIds[$ace->getId()])) { + $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId())); + unset($this->loadedAces[$ace->getId()]); + } + } + } + } + + /** + * This processes changes on an ACE related property (classAces, or objectAces). + * + * @param string $name + * @param array $changes + * @return void + */ + private function updateAceProperty($name, array $changes) + { + list($old, $new) = $changes; + + $sids = new \SplObjectStorage(); + $classIds = new \SplObjectStorage(); + $currentIds = array(); + for ($i=0,$c=count($new); $i<$c; $i++) { + $ace = $new[$i]; + + if (null === $ace->getId()) { + if ($sids->contains($ace->getSecurityIdentity())) { + $sid = $sids->offsetGet($ace->getSecurityIdentity()); + } else { + $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity()); + } + + $oid = $ace->getAcl()->getObjectIdentity(); + if ($classIds->contains($oid)) { + $classId = $classIds->offsetGet($oid); + } else { + $classId = $this->createOrRetrieveClassId($oid->getType()); + } + + $objectIdentityId = $name === 'classAces' ? null : $ace->getAcl()->getId(); + + $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, null, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure())); + $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, null, $i))->fetchColumn(); + $this->loadedAces[$aceId] = $ace; + + $aceIdProperty = new \ReflectionProperty($ace, 'id'); + $aceIdProperty->setAccessible(true); + $aceIdProperty->setValue($ace, intval($aceId)); + } else { + $currentIds[$ace->getId()] = true; + } + } + + for ($i=0,$c=count($old); $i<$c; $i++) { + $ace = $old[$i]; + + if (!isset($currentIds[$ace->getId()])) { + $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId())); + unset($this->loadedAces[$ace->getId()]); + } + } + } + + /** + * Persists the changes which were made to ACEs to the database. + * + * @param \SplObjectStorage $aces + * @return void + */ + private function updateAces(\SplObjectStorage $aces) + { + foreach ($aces as $ace) { + $propertyChanges = $aces->offsetGet($ace); + $sets = array(); + + if (isset($propertyChanges['mask'])) { + $sets[] = sprintf('mask = %d', $propertyChanges['mask'][1]); + } + if (isset($propertyChanges['strategy'])) { + $sets[] = sprintf('granting_strategy = %s', $this->connection->quote($propertyChanges['strategy'])); + } + if (isset($propertyChanges['aceOrder'])) { + $sets[] = sprintf('ace_order = %d', $propertyChanges['aceOrder'][1]); + } + if (isset($propertyChanges['auditSuccess'])) { + $sets[] = sprintf('audit_success = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditSuccess'][1])); + } + if (isset($propertyChanges['auditFailure'])) { + $sets[] = sprintf('audit_failure = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditFailure'][1])); + } + + $this->connection->executeQuery($this->getUpdateAccessControlEntrySql($ace->getId(), $sets)); + } + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php new file mode 100644 index 00000000..bda2cc21 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php @@ -0,0 +1,15 @@ +test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test2() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test3() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test4() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test5() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test6() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test7() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test8() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test9() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test10() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test11() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test12() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test13() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test14() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test15() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test16() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test17() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test18() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test19() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test20() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test21() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test22() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test23() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test24() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test25() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test26() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test27() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test28() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test29() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test30() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test31() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test32() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test33() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test34() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test35() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test36() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test37() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test38() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test39() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php new file mode 100644 index 00000000..1dae104a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php @@ -0,0 +1,5 @@ +test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test2() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test3() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test4() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test5() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test6() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test7() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test8() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test9() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test10() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test11() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test12() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test13() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test14() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test15() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test16() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test17() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test18() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test19() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test20() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test21() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test22() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test23() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test24() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test25() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test26() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test27() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test28() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test29() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test30() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test31() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test32() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test33() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test34() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test35() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test36() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test37() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test38() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test39() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php new file mode 100644 index 00000000..58c5e6af --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php @@ -0,0 +1,13 @@ +getMethod(); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $reader->getMethodAnnotations($method); + } + $time = microtime(true) - $time; + + $this->printResults('cached reader (in-memory)', $time, $c); + } + + /** + * @group performance + */ + public function testCachedReadPerformanceWithFileCache() + { + $method = $this->getMethod(); + + // prime cache + $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir()); + $reader->getMethodAnnotations($method); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir()); + $reader->getMethodAnnotations($method); + clearstatcache(); + } + $time = microtime(true) - $time; + + $this->printResults('cached reader (file)', $time, $c); + } + + /** + * @group performance + */ + public function testReadPerformance() + { + $method = $this->getMethod(); + + $time = microtime(true); + for ($i=0,$c=150; $i<$c; $i++) { + $reader = new AnnotationReader(); + $reader->getMethodAnnotations($method); + } + $time = microtime(true) - $time; + + $this->printResults('reader', $time, $c); + } + + /** + * @group performance + */ + public function testDocParsePerformance() + { + $imports = array( + 'ignorephpdoc' => 'Annotations\Annotation\IgnorePhpDoc', + 'ignoreannotation' => 'Annotations\Annotation\IgnoreAnnotation', + 'route' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Route', + 'template' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Template', + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations\Fixtures', + ); + $ignored = array( + 'access', 'author', 'copyright', 'deprecated', 'example', 'ignore', + 'internal', 'link', 'see', 'since', 'tutorial', 'version', 'package', + 'subpackage', 'name', 'global', 'param', 'return', 'staticvar', + 'static', 'var', 'throws', 'inheritdoc', + ); + + $method = $this->getMethod(); + $methodComment = $method->getDocComment(); + $classComment = $method->getDeclaringClass()->getDocComment(); + + $time = microtime(true); + for ($i=0,$c=200; $i<$c; $i++) { + $parser = new DocParser(); + $parser->setImports($imports); + $parser->setIgnoredAnnotationNames($ignored); + $parser->setIgnoreNotImportedAnnotations(true); + + $parser->parse($methodComment); + $parser->parse($classComment); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser', $time, $c); + } + + /** + * @group performance + */ + public function testDocLexerPerformance() + { + $method = $this->getMethod(); + $methodComment = $method->getDocComment(); + $classComment = $method->getDeclaringClass()->getDocComment(); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $lexer = new DocLexer(); + $lexer->setInput($methodComment); + $lexer->setInput($classComment); + } + $time = microtime(true) - $time; + + $this->printResults('doc-lexer', $time, $c); + } + + /** + * @group performance + */ + public function testPhpParserPerformanceWithShortCut() + { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\NamespacedSingleClassLOC1000'); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $parser = new PhpParser(); + $parser->parseClass($class); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser-with-short-cut', $time, $c); + } + + /** + * @group performance + */ + public function testPhpParserPerformanceWithoutShortCut() + { + $class = new \ReflectionClass('SingleClassLOC1000'); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $parser = new PhpParser(); + $parser->parseClass($class); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser-without-short-cut', $time, $c); + } + + private function getMethod() + { + return new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\Controller', 'helloAction'); + } + + private function printResults($test, $time, $iterations) + { + if (0 == $iterations) { + throw new \InvalidArgumentException('$iterations cannot be zero.'); + } + + $title = $test." results:\n"; + $iterationsText = sprintf("Iterations: %d\n", $iterations); + $totalTime = sprintf("Total Time: %.3f s\n", $time); + $iterationTime = sprintf("Time per iteration: %.3f ms\n", $time/$iterations * 1000); + + $max = max(strlen($title), strlen($iterationTime)) - 1; + + echo "\n".str_repeat('-', $max)."\n"; + echo $title; + echo str_repeat('=', $max)."\n"; + echo $iterationsText; + echo $totalTime; + echo $iterationTime; + echo str_repeat('-', $max)."\n"; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php new file mode 100644 index 00000000..8de4aabf --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php @@ -0,0 +1,179 @@ +assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testParseClassWithMultipleImportsInUseStatement() + { + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\MultipleImportsInUseStatement'); + $parser = new PhpParser(); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testParseClassWhenNotUserDefined() + { + $parser = new PhpParser(); + $this->assertEquals(array(), $parser->parseClass(new \ReflectionClass('\stdClass'))); + } + + public function testParseClassWhenClassIsNotNamespaced() + { + $parser = new PhpParser(); + $class = new ReflectionClass('\AnnotationsTestsFixturesNonNamespacedClass'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testParseClassWhenClassIsInterface() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\TestInterface'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testClassWithFullyQualifiedUseStatements() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\ClassWithFullyQualifiedUseStatements'); + + $this->assertEquals(array( + 'secure' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testNamespaceAndClassCommentedOut() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceAndClassCommentedOut'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testEqualNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\EqualNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + ), $parser->parseClass($class)); + } + + public function testEqualNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\EqualNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testDifferentNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\DifferentNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testDifferentNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\DifferentNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testGlobalNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new \ReflectionClass('\GlobalNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + ), $parser->parseClass($class)); + } + + public function testGlobalNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass('\GlobalNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testNamespaceWithClosureDeclaration() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceWithClosureDeclaration'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testIfPointerResetsOnMultipleParsingTries() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceWithClosureDeclaration'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php new file mode 100644 index 00000000..376539ff --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php @@ -0,0 +1,97 @@ +getReader(); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassDDC1660'); + + $this->assertTrue(class_exists('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Version')); + $this->assertCount(1, $reader->getClassAnnotations($class)); + $this->assertCount(1, $reader->getMethodAnnotations($class->getMethod('bar'))); + $this->assertCount(1, $reader->getPropertyAnnotations($class->getProperty('foo'))); + } + + protected function getReader() + { + $reader = new SimpleAnnotationReader(); + $reader->addNamespace(__NAMESPACE__); + $reader->addNamespace(__NAMESPACE__ . '\Fixtures'); + $reader->addNamespace(__NAMESPACE__ . '\Fixtures\Annotation'); + + return $reader; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php new file mode 100644 index 00000000..a7b9e2f2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php @@ -0,0 +1,65 @@ +getClassAnnotations($class); + } + + public function testAnnotation() + { + $class = new \ReflectionClass(__NAMESPACE__ . '\\DCOM55Consumer'); + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $annots = $reader->getClassAnnotations($class); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf(__NAMESPACE__.'\\DCOM55Annotation', $annots[0]); + } + + public function testParseAnnotationDocblocks() + { + $class = new \ReflectionClass(__NAMESPACE__ . '\\DCOM55Annotation'); + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $annots = $reader->getClassAnnotations($class); + + $this->assertEquals(0, count($annots)); + } +} + +/** + * @Controller + */ +class Dummy +{ + +} + +/** + * @Annotation + */ +class DCOM55Annotation +{ + +} + +/** + * @DCOM55Annotation + */ +class DCOM55Consumer +{ + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php new file mode 100644 index 00000000..708bcc99 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php @@ -0,0 +1,8 @@ +getClassAnnotations(new \ReflectionClass(__NAMESPACE__."\MappedClass")); + + foreach ($result as $annot) { + $classAnnotations[get_class($annot)] = $annot; + } + + $this->assertTrue(!isset($classAnnotations['']), 'Class "xxx" is not a valid entity or mapped super class.'); + } + + public function testIssueGlobalNamespace() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->setImports(array( + "__NAMESPACE__" =>"Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping" + )); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + + public function testIssueNamespaces() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM"); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Entity", $annots[0]); + } + + public function testIssueMultipleNamespaces() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping"); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM"); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + + public function testIssueWithNamespacesOrImports() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Entity", $annots[0]); + $this->assertEquals(1, count($annots)); + } + + + public function testIssueSimpleAnnotationReader() + { + $reader = new \Doctrine\Common\Annotations\SimpleAnnotationReader(); + $reader->addNamespace('Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping'); + $annots = $reader->getClassAnnotations(new \ReflectionClass(__NAMESPACE__."\MappedClass")); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + +} + +/** + * @Entity + */ +class MappedClass +{ + +} + + +namespace Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping; +/** +* @Annotation +*/ +class Entity +{ + +} + +namespace Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM; +/** +* @Annotation +*/ +class Entity +{ + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php new file mode 100644 index 00000000..ff3ca376 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php @@ -0,0 +1,8 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of APC'); + } + } + + protected function _getCacheDriver() + { + return new ApcCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php new file mode 100644 index 00000000..71927174 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php @@ -0,0 +1,13 @@ +_getCacheDriver(); + + // Test save + $cache->save('test_key', 'testing this out'); + + // Test contains to test that save() worked + $this->assertTrue($cache->contains('test_key')); + + // Test fetch + $this->assertEquals('testing this out', $cache->fetch('test_key')); + + // Test delete + $cache->save('test_key2', 'test2'); + $cache->delete('test_key2'); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testDeleteAll() + { + $cache = $this->_getCacheDriver(); + $cache->save('test_key1', '1'); + $cache->save('test_key2', '2'); + $cache->deleteAll(); + + $this->assertFalse($cache->contains('test_key1')); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testFlushAll() + { + $cache = $this->_getCacheDriver(); + $cache->save('test_key1', '1'); + $cache->save('test_key2', '2'); + $cache->flushAll(); + + $this->assertFalse($cache->contains('test_key1')); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testNamespace() + { + $cache = $this->_getCacheDriver(); + $cache->setNamespace('test_'); + $cache->save('key1', 'test'); + + $this->assertTrue($cache->contains('key1')); + + $cache->setNamespace('test2_'); + + $this->assertFalse($cache->contains('key1')); + } + + /** + * @group DCOM-43 + */ + public function testGetStats() + { + if ($this instanceof ArrayCacheTest || $this instanceof ZendDataCacheTest ) { + $this->markTestSkipped("Statistics are not available for this driver"); + } + + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + + $this->assertArrayHasKey(Cache::STATS_HITS, $stats); + $this->assertArrayHasKey(Cache::STATS_MISSES, $stats); + $this->assertArrayHasKey(Cache::STATS_UPTIME, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_USAGE, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_AVAILIABLE, $stats); + } + + /** + * @return \Doctrine\Common\Cache\CacheProvider + */ + abstract protected function _getCacheDriver(); +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php new file mode 100644 index 00000000..362ff69a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php @@ -0,0 +1,38 @@ +_memcache = new \Memcache; + $ok = @$this->_memcache->connect('localhost', 11211); + if (!$ok) { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } else { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } + + public function testNoExpire() { + $cache = $this->_getCacheDriver(); + $cache->save('noexpire', 'value', 0); + sleep(1); + $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire'); + } + + protected function _getCacheDriver() + { + $driver = new MemcacheCache(); + $driver->setMemcache($this->_memcache); + return $driver; + } + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php new file mode 100644 index 00000000..947ba752 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php @@ -0,0 +1,40 @@ +memcached = new \Memcached(); + $this->memcached->setOption(\Memcached::OPT_COMPRESSION, false); + $this->memcached->addServer('127.0.0.1', 11211); + + $fh = @fsockopen('127.0.0.1', 11211); + if (!$fh) { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } else { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } + + public function testNoExpire() { + $cache = $this->_getCacheDriver(); + $cache->save('noexpire', 'value', 0); + sleep(1); + $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire'); + } + + protected function _getCacheDriver() + { + $driver = new MemcachedCache(); + $driver->setMemcached($this->memcached); + return $driver; + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php new file mode 100644 index 00000000..cb363df9 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of Wincache'); + } + } + + protected function _getCacheDriver() + { + return new WincacheCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php new file mode 100644 index 00000000..62598487 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of xcache'); + } + } + + protected function _getCacheDriver() + { + return new XcacheCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php new file mode 100644 index 00000000..27dcf359 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of Zend Data Cache which only works in apache2handler SAPI'); + } + } + + protected function _getCacheDriver() + { + return new ZendDataCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php new file mode 100644 index 00000000..567cf918 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php @@ -0,0 +1,45 @@ +setIncludePath(__DIR__); + $classLoader->setFileExtension('.class.php'); + $classLoader->setNamespaceSeparator('_'); + + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassA')); + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassB')); + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassC')); + $this->assertFalse($classLoader->canLoadClass('OtherClass')); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassA'), true); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassB'), true); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassC'), true); + } + + public function testClassExists() + { + $this->assertFalse(ClassLoader::classExists('ClassLoaderTest\ClassD')); + $badLoader = function($className) { + require __DIR__ . '/ClassLoaderTest/ClassD.php'; + return true; + }; + spl_autoload_register($badLoader); + $this->assertTrue(ClassLoader::classExists('ClassLoaderTest\ClassD')); + spl_autoload_unregister($badLoader); + } + + public function testGetClassLoader() + { + $cl = new ClassLoader('ClassLoaderTest', __DIR__); + $cl->register(); + $this->assertTrue(ClassLoader::getClassLoader('ClassLoaderTest\ClassD') instanceof \Doctrine\Common\ClassLoader); + $this->assertNull(ClassLoader::getClassLoader('This\Class\Does\Not\Exist')); + $cl->unregister(); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php new file mode 100644 index 00000000..85546547 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php @@ -0,0 +1,6 @@ +_coll = new \Doctrine\Common\Collections\ArrayCollection; + } + + public function testIssetAndUnset() + { + $this->assertFalse(isset($this->_coll[0])); + $this->_coll->add('testing'); + $this->assertTrue(isset($this->_coll[0])); + unset($this->_coll[0]); + $this->assertFalse(isset($this->_coll[0])); + } + + public function testToString() + { + $this->_coll->add('testing'); + $this->assertTrue(is_string((string) $this->_coll)); + } + + public function testRemovingNonExistentEntryReturnsNull() + { + $this->assertEquals(null, $this->_coll->remove('testing_does_not_exist')); + } + + public function testExists() + { + $this->_coll->add("one"); + $this->_coll->add("two"); + $exists = $this->_coll->exists(function($k, $e) { return $e == "one"; }); + $this->assertTrue($exists); + $exists = $this->_coll->exists(function($k, $e) { return $e == "other"; }); + $this->assertFalse($exists); + } + + public function testMap() + { + $this->_coll->add(1); + $this->_coll->add(2); + $res = $this->_coll->map(function($e) { return $e * 2; }); + $this->assertEquals(array(2, 4), $res->toArray()); + } + + public function testFilter() + { + $this->_coll->add(1); + $this->_coll->add("foo"); + $this->_coll->add(3); + $res = $this->_coll->filter(function($e) { return is_numeric($e); }); + $this->assertEquals(array(0 => 1, 2 => 3), $res->toArray()); + } + + public function testFirstAndLast() + { + $this->_coll->add('one'); + $this->_coll->add('two'); + + $this->assertEquals($this->_coll->first(), 'one'); + $this->assertEquals($this->_coll->last(), 'two'); + } + + public function testArrayAccess() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + + $this->assertEquals($this->_coll[0], 'one'); + $this->assertEquals($this->_coll[1], 'two'); + + unset($this->_coll[0]); + $this->assertEquals($this->_coll->count(), 1); + } + + public function testContainsKey() + { + $this->_coll[5] = 'five'; + $this->assertTrue($this->_coll->containsKey(5)); + } + + public function testContains() + { + $this->_coll[0] = 'test'; + $this->assertTrue($this->_coll->contains('test')); + } + + public function testSearch() + { + $this->_coll[0] = 'test'; + $this->assertEquals(0, $this->_coll->indexOf('test')); + } + + public function testGet() + { + $this->_coll[0] = 'test'; + $this->assertEquals('test', $this->_coll->get(0)); + } + + public function testGetKeys() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals(array(0, 1), $this->_coll->getKeys()); + } + + public function testGetValues() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals(array('one', 'two'), $this->_coll->getValues()); + } + + public function testCount() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals($this->_coll->count(), 2); + $this->assertEquals(count($this->_coll), 2); + } + + public function testForAll() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_string($e); }), true); + $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_array($e); }), false); + } + + public function testPartition() + { + $this->_coll[] = true; + $this->_coll[] = false; + $partition = $this->_coll->partition(function($k, $e) { return $e == true; }); + $this->assertEquals($partition[0][0], true); + $this->assertEquals($partition[1][0], false); + } + + public function testClear() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->_coll->clear(); + $this->assertEquals($this->_coll->isEmpty(), true); + } + + public function testRemove() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $el = $this->_coll->remove(0); + + $this->assertEquals('one', $el); + $this->assertEquals($this->_coll->contains('one'), false); + $this->assertNull($this->_coll->remove(0)); + } + + public function testRemoveElement() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + + $this->assertTrue($this->_coll->removeElement('two')); + $this->assertFalse($this->_coll->contains('two')); + $this->assertFalse($this->_coll->removeElement('two')); + } + + public function testSlice() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->_coll[] = 'three'; + + $slice = $this->_coll->slice(0, 1); + $this->assertInternalType('array', $slice); + $this->assertEquals(array('one'), $slice); + + $slice = $this->_coll->slice(1); + $this->assertEquals(array(1 => 'two', 2 => 'three'), $slice); + + $slice = $this->_coll->slice(1, 1); + $this->assertEquals(array(1 => 'two'), $slice); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php new file mode 100644 index 00000000..e69de29b diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php new file mode 100644 index 00000000..2b11b20e --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php @@ -0,0 +1,88 @@ +_eventManager = new EventManager; + $this->_preFooInvoked = false; + $this->_postFooInvoked = false; + } + + public function testInitialState() + { + $this->assertEquals(array(), $this->_eventManager->getListeners()); + $this->assertFalse($this->_eventManager->hasListeners(self::preFoo)); + $this->assertFalse($this->_eventManager->hasListeners(self::postFoo)); + } + + public function testAddEventListener() + { + $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); + $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); + $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); + $this->assertEquals(1, count($this->_eventManager->getListeners(self::preFoo))); + $this->assertEquals(1, count($this->_eventManager->getListeners(self::postFoo))); + $this->assertEquals(2, count($this->_eventManager->getListeners())); + } + + public function testDispatchEvent() + { + $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); + $this->_eventManager->dispatchEvent(self::preFoo); + $this->assertTrue($this->_preFooInvoked); + $this->assertFalse($this->_postFooInvoked); + } + + public function testRemoveEventListener() + { + $this->_eventManager->addEventListener(array('preBar'), $this); + $this->assertTrue($this->_eventManager->hasListeners(self::preBar)); + $this->_eventManager->removeEventListener(array('preBar'), $this); + $this->assertFalse($this->_eventManager->hasListeners(self::preBar)); + } + + public function testAddEventSubscriber() + { + $eventSubscriber = new TestEventSubscriber(); + $this->_eventManager->addEventSubscriber($eventSubscriber); + $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); + $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); + } + + /* Listener methods */ + + public function preFoo(EventArgs $e) + { + $this->_preFooInvoked = true; + } + + public function postFoo(EventArgs $e) + { + $this->_postFooInvoked = true; + } +} + +class TestEventSubscriber implements \Doctrine\Common\EventSubscriber +{ + public function getSubscribedEvents() + { + return array('preFoo', 'postFoo'); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php new file mode 100644 index 00000000..e1825ae2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php @@ -0,0 +1,94 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver1->expects($this->never()) + ->method('loadMetadataForClass'); + $driver1->expectS($this->never()) + ->method('isTransient'); + + $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver2->expects($this->at(0)) + ->method('loadMetadataForClass') + ->with($this->equalTo($className), $this->equalTo($classMetadata)); + $driver2->expects($this->at(1)) + ->method('isTransient') + ->with($this->equalTo($className)) + ->will($this->returnValue( true )); + + $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); + $chain->addDriver($driver2, 'Doctrine\Tests\Common\Persistence\Mapping'); + + $chain->loadMetadataForClass($className, $classMetadata); + + $this->assertTrue( $chain->isTransient($className) ); + } + + public function testLoadMetadata_NoDelegatorFound_ThrowsMappingException() + { + $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; + $classMetadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $this->setExpectedException('Doctrine\Common\Persistence\Mapping\MappingException'); + $chain->loadMetadataForClass($className, $classMetadata); + } + + public function testGatherAllClassNames() + { + $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; + $classMetadata = $this->getMock('Doctrine\Common\Peristence\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver1->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Doctrine\Tests\Models\Company\Foo'))); + + $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver2->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Doctrine\Tests\ORM\Mapping\Bar', 'Doctrine\Tests\ORM\Mapping\Baz', 'FooBarBaz'))); + + $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); + $chain->addDriver($driver2, 'Doctrine\Tests\ORM\Mapping'); + + $this->assertEquals(array( + 'Doctrine\Tests\Models\Company\Foo', + 'Doctrine\Tests\ORM\Mapping\Bar', + 'Doctrine\Tests\ORM\Mapping\Baz' + ), $chain->getAllClassNames()); + } + + /** + * @group DDC-706 + */ + public function testIsTransient() + { + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $chain = new MappingDriverChain(); + $chain->addDriver($driver1, 'Doctrine\Tests\Models\CMS'); + + $this->assertTrue($chain->isTransient('stdClass'), "stdClass isTransient"); + } +} + +class DriverChainEntity +{ + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php new file mode 100644 index 00000000..9fe32994 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php @@ -0,0 +1,134 @@ +getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $this->cmf = new TestClassMetadataFactory($driver, $metadata); + } + + public function testGetCacheDriver() + { + $this->assertNull($this->cmf->getCacheDriver()); + $cache = new ArrayCache(); + $this->cmf->setCacheDriver($cache); + $this->assertSame($cache, $this->cmf->getCacheDriver()); + } + + public function testGetMetadataFor() + { + $metadata = $this->cmf->getMetadataFor('stdClass'); + + $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); + $this->assertTrue($this->cmf->hasMetadataFor('stdClass')); + } + + public function testGetParentMetadata() + { + $metadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + + $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\RootEntity')); + } + + public function testGetCachedMetadata() + { + $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $cache = new ArrayCache(); + $cache->save(__NAMESPACE__. '\ChildEntity$CLASSMETADATA', $metadata); + + $this->cmf->setCacheDriver($cache); + + $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + $this->assertSame($loadedMetadata, $metadata); + } + + public function testCacheGetMetadataFor() + { + $cache = new ArrayCache(); + $this->cmf->setCacheDriver($cache); + + $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + + $this->assertSame($loadedMetadata, $cache->fetch(__NAMESPACE__. '\ChildEntity$CLASSMETADATA')); + } + + public function testGetAliasedMetadata() + { + $loadedMetadata = $this->cmf->getMetadataFor('prefix:ChildEntity'); + + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); + $this->assertTrue($this->cmf->hasMetadataFor('prefix:ChildEntity')); + } +} + +class TestClassMetadataFactory extends AbstractClassMetadataFactory +{ + public $driver; + public $metadata; + + public function __construct($driver, $metadata) + { + $this->driver = $driver; + $this->metadata = $metadata; + } + + protected function doLoadMetadata($class, $parent, $rootEntityFound) + { + + } + + protected function getFqcnFromAlias($namespaceAlias, $simpleClassName) + { + return __NAMESPACE__ . '\\' . $simpleClassName; + } + + protected function initialize() + { + + } + + protected function newClassMetadataInstance($className) + { + return $this->metadata; + } + + protected function getDriver() + { + return $this->driver; + } + protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService) + { + } + + protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService) + { + } +} + +class RootEntity +{ + +} + +class ChildEntity extends RootEntity +{ + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php new file mode 100644 index 00000000..3c600c40 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php @@ -0,0 +1,90 @@ +assertEquals(array($path), $locator->getPaths()); + + $locator = new DefaultFileLocator($path); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testGetFileExtension() + { + $locator = new DefaultFileLocator(array(), ".yml"); + $this->assertEquals(".yml", $locator->getFileExtension()); + $locator->setFileExtension(".xml"); + $this->assertEquals(".xml", $locator->getFileExtension()); + } + + public function testUniquePaths() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path, $path)); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testFindMappingFile() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->assertEquals(__DIR__ . '/_files/stdClass.yml', $locator->findMappingFile('stdClass')); + } + + public function testFindMappingFileNotFound() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->setExpectedException( + 'Doctrine\Common\Persistence\Mapping\MappingException', + "No mapping file found named 'stdClass2.yml' for class 'stdClass2'" + ); + $locator->findMappingFile('stdClass2'); + } + + public function testGetAllClassNames() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + $classes = $locator->getAllClassNames(null); + sort($classes); + + $this->assertEquals(array('global', 'stdClass'), $classes); + $this->assertEquals(array('stdClass'), $locator->getAllClassNames("global")); + } + + public function testGetAllClassNamesNonMatchingFileExtension() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".xml"); + $this->assertEquals(array(), $locator->getAllClassNames("global")); + } + + public function testFileExists() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->assertTrue($locator->fileExists("stdClass")); + $this->assertFalse($locator->fileExists("stdClass2")); + $this->assertTrue($locator->fileExists("global")); + $this->assertFalse($locator->fileExists("global2")); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php new file mode 100644 index 00000000..020c2424 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php @@ -0,0 +1,142 @@ +assertNull($driver->getGlobalBasename()); + + $driver->setGlobalBasename("global"); + $this->assertEquals("global", $driver->getGlobalBasename()); + } + + public function testGetElementFromGlobalFile() + { + $driver = new TestFileDriver($this->newLocator()); + $driver->setGlobalBasename("global"); + + $element = $driver->getElement('stdGlobal'); + + $this->assertEquals('stdGlobal', $element); + } + + public function testGetElementFromFile() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('findMappingFile') + ->with($this->equalTo('stdClass')) + ->will($this->returnValue(__DIR__ . '/_files/stdClass.yml')); + + $driver = new TestFileDriver($locator); + + $this->assertEquals('stdClass', $driver->getElement('stdClass')); + } + + public function testGetAllClassNamesGlobalBasename() + { + $driver = new TestFileDriver($this->newLocator()); + $driver->setGlobalBasename("global"); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdGlobal', 'stdGlobal2'), $classNames); + } + + public function testGetAllClassNamesFromMappingFile() + { + $locator = $this->newLocator(); + $locator->expects($this->any()) + ->method('getAllClassNames') + ->with($this->equalTo(null)) + ->will($this->returnValue(array('stdClass'))); + $driver = new TestFileDriver($locator); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdClass'), $classNames); + } + + public function testGetAllClassNamesBothSources() + { + $locator = $this->newLocator(); + $locator->expects($this->any()) + ->method('getAllClassNames') + ->with($this->equalTo('global')) + ->will($this->returnValue(array('stdClass'))); + $driver = new TestFileDriver($locator); + $driver->setGlobalBasename("global"); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdGlobal', 'stdGlobal2', 'stdClass'), $classNames); + } + + public function testIsNotTransient() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('fileExists') + ->with($this->equalTo('stdClass')) + ->will($this->returnValue( true )); + + $driver = new TestFileDriver($locator); + $driver->setGlobalBasename("global"); + + $this->assertFalse($driver->isTransient('stdClass')); + $this->assertFalse($driver->isTransient('stdGlobal')); + $this->assertFalse($driver->isTransient('stdGlobal2')); + } + + public function testIsTransient() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('fileExists') + ->with($this->equalTo('stdClass2')) + ->will($this->returnValue( false )); + + $driver = new TestFileDriver($locator); + + $this->assertTrue($driver->isTransient('stdClass2')); + } + + public function testNonLocatorFallback() + { + $driver = new TestFileDriver(__DIR__ . '/_files', '.yml'); + $this->assertTrue($driver->isTransient('stdClass2')); + $this->assertFalse($driver->isTransient('stdClass')); + } + + private function newLocator() + { + $locator = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\FileLocator'); + $locator->expects($this->any())->method('getFileExtension')->will($this->returnValue('.yml')); + $locator->expects($this->any())->method('getPaths')->will($this->returnValue(array(__DIR__ . "/_files"))); + return $locator; + } +} + +class TestFileDriver extends FileDriver +{ + protected function loadMappingFile($file) + { + if (strpos($file, "global.yml") !== false) { + return array('stdGlobal' => 'stdGlobal', 'stdGlobal2' => 'stdGlobal2'); + } + return array('stdClass' => 'stdClass'); + } + + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php new file mode 100644 index 00000000..8fc4d807 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php @@ -0,0 +1,18 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $metadata->expects($this->once())->method('getFieldNames'); + + $driver = new PHPDriver(array(__DIR__ . "/_files")); + $driver->loadMetadataForClass('TestEntity', $metadata); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php new file mode 100644 index 00000000..5f06cad9 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Tests\Common\Persistence\Mapping; + +use Doctrine\Common\Persistence\Mapping\RuntimeReflectionService; + +/** + * @group DCOM-93 + */ +class RuntimeReflectionServiceTest extends \PHPUnit_Framework_TestCase +{ + private $reflectionService; + + public function setUp() + { + $this->reflectionService = new RuntimeReflectionService(); + } + + public function testShortname() + { + $this->assertEquals("RuntimeReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); + } + + public function testClassNamespaceName() + { + $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); + } + + public function testGetParentClasses() + { + $classes = $this->reflectionService->getParentClasses(__CLASS__); + $this->assertTrue(count($classes) >= 1, "The test class ".__CLASS__." should have at least one parent."); + } + + public function testGetReflectionClass() + { + $class = $this->reflectionService->getClass(__CLASS__); + $this->assertInstanceOf("ReflectionClass", $class); + } + + public function testGetMethods() + { + $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); + $this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); + } + + public function testGetAccessibleProperty() + { + $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); + $this->assertInstanceOf("ReflectionProperty", $reflProp); + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php new file mode 100644 index 00000000..9f1c5684 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php @@ -0,0 +1,35 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $metadata->expects($this->once())->method('getFieldNames'); + + $driver = new StaticPHPDriver(array(__DIR__)); + $driver->loadMetadataForClass(__NAMESPACE__ . '\\TestEntity', $metadata); + } + + public function testGetAllClassNames() + { + $driver = new StaticPHPDriver(array(__DIR__)); + $classNames = $driver->getAllClassNames(); + + $this->assertContains( + 'Doctrine\Tests\Common\Persistence\Mapping\TestEntity', $classNames); + } +} + +class TestEntity +{ + static public function loadMetadata($metadata) + { + $metadata->getFieldNames(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php new file mode 100644 index 00000000..ffce6d40 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Tests\Common\Persistence\Mapping; + +use Doctrine\Common\Persistence\Mapping\StaticReflectionService; + +/** + * @group DCOM-93 + */ +class StaticReflectionServiceTest extends \PHPUnit_Framework_TestCase +{ + private $reflectionService; + + public function setUp() + { + $this->reflectionService = new StaticReflectionService(); + } + + public function testShortname() + { + $this->assertEquals("StaticReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); + } + + public function testClassNamespaceName() + { + $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); + } + + public function testGetParentClasses() + { + $classes = $this->reflectionService->getParentClasses(__CLASS__); + $this->assertTrue(count($classes) == 0, "The test class ".__CLASS__." should have no parents according to static reflection."); + } + + public function testGetReflectionClass() + { + $class = $this->reflectionService->getClass(__CLASS__); + $this->assertNull($class); + } + + public function testGetMethods() + { + $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); + $this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); + } + + public function testGetAccessibleProperty() + { + $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); + $this->assertNull($reflProp); + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php new file mode 100644 index 00000000..b51162e6 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php @@ -0,0 +1,88 @@ + $prefix)); + $this->assertEquals(array($path), $locator->getPaths()); + + $locator = new SymfonyFileLocator(array($path => $prefix)); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testGetPrefixes() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix)); + $this->assertEquals(array($path => $prefix), $locator->getNamespacePrefixes()); + } + + public function testGetFileExtension() + { + $locator = new SymfonyFileLocator(array(), ".yml"); + $this->assertEquals(".yml", $locator->getFileExtension()); + $locator->setFileExtension(".xml"); + $this->assertEquals(".xml", $locator->getFileExtension()); + } + + public function testFileExists() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->assertTrue($locator->fileExists("Foo\stdClass")); + $this->assertTrue($locator->fileExists("Foo\global")); + $this->assertFalse($locator->fileExists("Foo\stdClass2")); + $this->assertFalse($locator->fileExists("Foo\global2")); + } + + public function testGetAllClassNames() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + $classes = $locator->getAllClassNames(null); + sort($classes); + + $this->assertEquals(array("Foo\\global", "Foo\\stdClass"), $classes); + $this->assertEquals(array("Foo\\stdClass"), $locator->getAllClassNames("global")); + } + + public function testFindMappingFile() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->assertEquals(__DIR__ . "/_files/stdClass.yml", $locator->findMappingFile("Foo\\stdClass")); + } + + public function testFindMappingFileNotFound() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->setExpectedException( + "Doctrine\Common\Persistence\Mapping\MappingException", + "No mapping file found named '".__DIR__."/_files/stdClass2.yml' for class 'Foo\stdClass2'." + ); + $locator->findMappingFile("Foo\\stdClass2"); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php new file mode 100644 index 00000000..d0e9976a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php @@ -0,0 +1,3 @@ +getFieldNames(); \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php new file mode 100644 index 00000000..a0f77b50 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php @@ -0,0 +1,247 @@ +cm = new TestObjectMetadata; + $this->om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); + $this->om->expects($this->any())->method('getClassMetadata') + ->will($this->returnValue($this->cm)); + $this->object = new TestObject; + PersistentObject::setObjectManager($this->om); + $this->object->injectObjectManager($this->om, $this->cm); + } + + public function testGetObjectManager() + { + $this->assertSame($this->om, PersistentObject::getObjectManager()); + } + + public function testNonMatchingObjectManager() + { + $this->setExpectedException('RuntimeException'); + $om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); + $this->object->injectObjectManager($om, $this->cm); + } + + public function testGetField() + { + $this->assertEquals('beberlei', $this->object->getName()); + } + + public function testSetField() + { + $this->object->setName("test"); + $this->assertEquals("test", $this->object->getName()); + } + + public function testGetIdentifier() + { + $this->assertEquals(1, $this->object->getId()); + } + + public function testSetIdentifier() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->setId(2); + } + + public function testSetUnknownField() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->setUnknown("test"); + } + + public function testGetUnknownField() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->getUnknown(); + } + + public function testGetToOneAssociation() + { + $this->assertNull($this->object->getParent()); + } + + public function testSetToOneAssociation() + { + $parent = new TestObject(); + $this->object->setParent($parent); + $this->assertSame($parent, $this->object->getParent($parent)); + } + + public function testSetInvalidToOneAssocation() + { + $parent = new \stdClass(); + + $this->setExpectedException('InvalidArgumentException'); + $this->object->setParent($parent); + } + + public function testSetToOneAssociationNull() + { + $parent = new TestObject(); + $this->object->setParent($parent); + $this->object->setParent(null); + $this->assertNull($this->object->getParent()); + } + + public function testAddToManyAssocation() + { + $child = new TestObject(); + $this->object->addChildren($child); + + $this->assertSame($this->object, $child->getParent()); + $this->assertEquals(1, count($this->object->getChildren())); + + $child = new TestObject(); + $this->object->addChildren($child); + + $this->assertEquals(2, count($this->object->getChildren())); + } + + public function testAddInvalidToManyAssocation() + { + $this->setExpectedException('InvalidArgumentException'); + $this->object->addChildren(new \stdClass()); + } + + public function testNoObjectManagerSet() + { + PersistentObject::setObjectManager(null); + $child = new TestObject(); + + $this->setExpectedException('RuntimeException'); + $child->setName("test"); + } + + public function testInvalidMethod() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->asdf(); + } + + public function testAddInvalidCollection() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->addAsdf(new \stdClass()); + } +} + +class TestObject extends PersistentObject +{ + protected $id = 1; + protected $name = 'beberlei'; + protected $parent; + protected $children; +} + +class TestObjectMetadata implements ClassMetadata +{ + + public function getAssociationMappedByTargetField($assocName) + { + $assoc = array('children' => 'parent'); + return $assoc[$assocName]; + } + + public function getAssociationNames() + { + return array('parent', 'children'); + } + + public function getAssociationTargetClass($assocName) + { + return __NAMESPACE__ . '\TestObject'; + } + + public function getFieldNames() + { + return array('id', 'name'); + } + + public function getIdentifier() + { + return array('id'); + } + + public function getName() + { + return __NAMESPACE__ . '\TestObject'; + } + + public function getReflectionClass() + { + return new \ReflectionClass($this->getName()); + } + + public function getTypeOfField($fieldName) + { + $types = array('id' => 'integer', 'name' => 'string'); + return $types[$fieldName]; + } + + public function hasAssociation($fieldName) + { + return in_array($fieldName, array('parent', 'children')); + } + + public function hasField($fieldName) + { + return in_array($fieldName, array('id', 'name')); + } + + public function isAssociationInverseSide($assocName) + { + return ($assocName === 'children'); + } + + public function isCollectionValuedAssociation($fieldName) + { + return ($fieldName === 'children'); + } + + public function isIdentifier($fieldName) + { + return $fieldName === 'id'; + } + + public function isSingleValuedAssociation($fieldName) + { + return $fieldName === 'parent'; + } + + public function getIdentifierValues($entity) + { + + } + + public function getIdentifierFieldNames() + { + + } + + public function initializeReflection(ReflectionService $reflService) + { + + } + + public function wakeupReflection(ReflectionService $reflService) + { + + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php new file mode 100644 index 00000000..a2814500 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php @@ -0,0 +1,100 @@ +assertEquals($expectedClassName, ClassUtils::getRealClass($className)); + } + + /** + * @dataProvider dataGetClass + */ + public function testGetClass( $className, $expectedClassName ) + { + $object = new $className(); + $this->assertEquals($expectedClassName, ClassUtils::getClass($object)); + } + + public function testGetParentClass() + { + $parentClass = ClassUtils::getParentClass( 'MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject' ); + $this->assertEquals('stdClass', $parentClass); + } + + public function testGenerateProxyClassName() + { + $this->assertEquals( 'Proxies\__CG__\stdClass', ClassUtils::generateProxyClassName( 'stdClass', 'Proxies' ) ); + } + + /** + * @dataProvider dataGetClass + */ + public function testNewReflectionClass( $className, $expectedClassName ) + { + $reflClass = ClassUtils::newReflectionClass( $className ); + $this->assertEquals( $expectedClassName, $reflClass->getName() ); + } + + /** + * @dataProvider dataGetClass + */ + public function testNewReflectionObject( $className, $expectedClassName ) + { + $object = new $className; + $reflClass = ClassUtils::newReflectionObject( $object ); + $this->assertEquals( $expectedClassName, $reflClass->getName() ); + } + } + + class ChildObject extends \stdClass + { + } +} + +namespace MyProject\Proxies\__CG__ +{ + class stdClass extends \stdClass + { + } +} + +namespace MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util +{ + class ChildObject extends \Doctrine\Tests\Common\Util\ChildObject + { + } +} + +namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__ +{ + class stdClass extends \MyProject\Proxies\__CG__\stdClass + { + } +} + +namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util +{ + class ChildObject extends \MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject + { + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php new file mode 100644 index 00000000..b4e9eed2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php @@ -0,0 +1,27 @@ +foo = "bar"; + $obj->bar = 1234; + + $var = Debug::export($obj, 2); + $this->assertEquals( "stdClass", $var->__CLASS__ ); + } + + public function testExportDateTime() + { + $obj = new \DateTime( "2010-10-10 10:10:10" ); + + $var = Debug::export( $obj, 2 ); + $this->assertEquals( "DateTime", $var->__CLASS__ ); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php b/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php new file mode 100644 index 00000000..e8323d29 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php @@ -0,0 +1,10 @@ + + */ +class NativePhpunitTask extends Task +{ + private $test; + private $testfile; + private $testdirectory; + private $configuration = null; + private $coverageClover = null; + private $junitlogfile = null; + private $haltonfailure = true; + private $haltonerror = true; + + public function setTestdirectory($directory) { + $this->testdirectory = $directory; + } + + public function setTest($test) { + $this->test = $test; + } + + public function setTestfile($testfile) { + $this->testfile = $testfile; + } + + public function setJunitlogfile($junitlogfile) { + if (strlen($junitlogfile) == 0) { + $junitlogfile = NULL; + } + + $this->junitlogfile = $junitlogfile; + } + + public function setConfiguration($configuration) { + if (strlen($configuration) == 0) { + $configuration = NULL; + } + + $this->configuration = $configuration; + } + + public function setCoverageClover($coverageClover) { + if (strlen($coverageClover) == 0) { + $coverageClover = NULL; + } + + $this->coverageClover = $coverageClover; + } + + public function setHaltonfailure($haltonfailures) { + $this->haltonfailure = $haltonfailures; + } + + public function setHaltonerror($haltonerrors) { + $this->haltonerror = $haltonerrors; + } + + public function init() + { + require_once "PHPUnit/Runner/Version.php"; + $version = PHPUnit_Runner_Version::id(); + + if (version_compare($version, '3.4.0') < 0) { + throw new BuildException("NativePHPUnitTask requires PHPUnit version >= 3.2.0", $this->getLocation()); + } + + require_once 'PHPUnit/Util/Filter.php'; + + // point PHPUnit_MAIN_METHOD define to non-existing method + if (!defined('PHPUnit_MAIN_METHOD')) { + define('PHPUnit_MAIN_METHOD', 'PHPUnitTask::undefined'); + } + } + + public function main() + { + if (!is_dir(realpath($this->testdirectory))) { + throw new BuildException("NativePHPUnitTask requires a Test Directory path given, '".$this->testdirectory."' given."); + } + set_include_path(realpath($this->testdirectory) . PATH_SEPARATOR . get_include_path()); + + $printer = new NativePhpunitPrinter(); + + $arguments = array( + 'configuration' => $this->configuration, + 'coverageClover' => $this->coverageClover, + 'junitLogfile' => $this->junitlogfile, + 'printer' => $printer, + ); + + $runner = new PHPUnit_TextUI_TestRunner(); + $suite = $runner->getTest($this->test, $this->testfile, true); + + try { + $result = $runner->doRun($suite, $arguments); + /* @var $result PHPUnit_Framework_TestResult */ + + if ( ($this->haltonfailure && $result->failureCount() > 0) || ($this->haltonerror && $result->errorCount() > 0) ) { + throw new BuildException("PHPUnit: ".$result->failureCount()." Failures and ".$result->errorCount()." Errors, ". + "last failure message: ".$printer->getMessages()); + } + + $this->log("PHPUnit Success: ".count($result->passed())." tests passed, no ". + "failures (".$result->skippedCount()." skipped, ".$result->notImplementedCount()." not implemented)"); + + // Hudson for example doesn't like the backslash in class names + if (file_exists($this->coverageClover)) { + $this->log("Generated Clover Coverage XML to: ".$this->coverageClover); + $content = file_get_contents($this->coverageClover); + $content = str_replace("\\", ".", $content); + file_put_contents($this->coverageClover, $content); + unset($content); + } + + } catch(\Exception $e) { + throw new BuildException("NativePhpunitTask failed: ".$e->getMessage()); + } + } +} + +class NativePhpunitPrinter extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener +{ + private $_messages = array(); + + public function write($buffer) + { + // do nothing + } + + public function getMessages() + { + return $this->_messages; + } + + /** + * An error occurred. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + */ + public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) + { + $this->_messages[] = "Test ERROR: ".$test->getName().": ".$e->getMessage(); + } + + /** + * A failure occurred. + * + * @param PHPUnit_Framework_Test $test + * @param PHPUnit_Framework_AssertionFailedError $e + * @param float $time + */ + public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) + { + $this->_messages[] = "Test FAILED: ".$test->getName().": ".$e->getMessage(); + } + + /** + * Incomplete test. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + */ + public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) + { + + } + + /** + * Skipped test. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + * @since Method available since Release 3.0.0 + */ + public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) + { + + } + + /** + * A test suite started. + * + * @param PHPUnit_Framework_TestSuite $suite + * @since Method available since Release 2.2.0 + */ + public function startTestSuite(PHPUnit_Framework_TestSuite $suite) + { + + } + + /** + * A test suite ended. + * + * @param PHPUnit_Framework_TestSuite $suite + * @since Method available since Release 2.2.0 + */ + public function endTestSuite(PHPUnit_Framework_TestSuite $suite) + { + + } + + /** + * A test started. + * + * @param PHPUnit_Framework_Test $test + */ + public function startTest(PHPUnit_Framework_Test $test) + { + + } + + /** + * A test ended. + * + * @param PHPUnit_Framework_Test $test + * @param float $time + */ + public function endTest(PHPUnit_Framework_Test $test, $time) + { + + } +} diff --git a/vendor/doctrine/common/tests/README.markdown b/vendor/doctrine/common/tests/README.markdown new file mode 100644 index 00000000..e6f1703d --- /dev/null +++ b/vendor/doctrine/common/tests/README.markdown @@ -0,0 +1,27 @@ +# Running the Doctrine 2 Testsuite + +## Running tests + +Execute PHPUnit in the root folder of your doctrine-common clone. + + phpunit + +## Testing Lock-Support + +The Lock support in Doctrine 2 is tested using Gearman, which allows to run concurrent tasks in parallel. +Install Gearman with PHP as follows: + +1. Go to http://www.gearman.org and download the latest Gearman Server +2. Compile it and then call ldconfig +3. Start it up "gearmand -vvvv" +4. Install pecl/gearman by calling "gearman-beta" + +You can then go into tests/ and start up two workers: + + php Doctrine/Tests/ORM/Functional/Locking/LockAgentWorker.php + +Then run the locking test-suite: + + phpunit --configuration Doctrine/Tests/ORM/Functional/Locking/GearmanLockTest.php + +This can run considerable time, because it is using sleep() to test for the timing ranges of locks. \ No newline at end of file From 009aa52b7fafb7ab0c2fd1bcf389dcc219a52845 Mon Sep 17 00:00:00 2001 From: gzekiii Date: Fri, 15 Feb 2013 10:12:00 +0200 Subject: [PATCH 131/180] upstream --- index.php | 27 --------------------------- index.php~ | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 27 deletions(-) create mode 100644 index.php~ diff --git a/index.php b/index.php index f214320c..95d7e610 100644 --- a/index.php +++ b/index.php @@ -3,35 +3,8 @@ Hello World -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD - Hello World

'; ?> -======= Hello World from FMI

'; ?> Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> Hello World, Aleksander Aleksandrov


email:aleksaander_aleksandrov@abv.bg'; ?> - Hello World, Elena Chavdarova


email:elenachavdarova91@gmail.com'; ?> - ->>>>>>> refs/heads/master -======= - Hello World from FMI

'; ?> - Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> - Hello World, Aleksander Aleksandrov


email:aleksaander_aleksandrov@abv.bg'; ?> - ->>>>>>> refs/remotes/git hub remote/master -======= - Hello World from FMI

'; ?> - Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> - Hello World, Aleksander Aleksandrov


email:aleksaander_aleksandrov@abv.bg'; ?> - ->>>>>>> refs/heads/master -======= - Hello World from FMI

'; ?> - Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> - Hello World, Aleksander Aleksandrov


email:aleksaander_aleksandrov@abv.bg'; ?> - ->>>>>>> refs/heads/master diff --git a/index.php~ b/index.php~ new file mode 100644 index 00000000..f214320c --- /dev/null +++ b/index.php~ @@ -0,0 +1,37 @@ + + + Hello World + + +<<<<<<< HEAD +<<<<<<< HEAD +<<<<<<< HEAD +<<<<<<< HEAD + Hello World

'; ?> +======= + Hello World from FMI

'; ?> + Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> + Hello World, Aleksander Aleksandrov


email:aleksaander_aleksandrov@abv.bg'; ?> + Hello World, Elena Chavdarova


email:elenachavdarova91@gmail.com'; ?> + +>>>>>>> refs/heads/master +======= + Hello World from FMI

'; ?> + Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> + Hello World, Aleksander Aleksandrov


email:aleksaander_aleksandrov@abv.bg'; ?> + +>>>>>>> refs/remotes/git hub remote/master +======= + Hello World from FMI

'; ?> + Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> + Hello World, Aleksander Aleksandrov


email:aleksaander_aleksandrov@abv.bg'; ?> + +>>>>>>> refs/heads/master +======= + Hello World from FMI

'; ?> + Hello World from Mihail Kopuschu! meshko1989@mail.ru

'; ?> + Hello World, Aleksander Aleksandrov


email:aleksaander_aleksandrov@abv.bg'; ?> + +>>>>>>> refs/heads/master + + From fd2cd677cd07169358e82699800d7a1894ea4dd9 Mon Sep 17 00:00:00 2001 From: OpenShift guest Date: Fri, 15 Feb 2013 03:41:14 -0500 Subject: [PATCH 132/180] Added Alexander --- .c9revisions/README.md.c9save | 1 + .../config/autoload/global.php.c9save | 1 + .../config/module.config.php.c9save | 8 +++++++ .../Controller/AlexanderAlexandrov.php.c9save | 5 +++++ .../Controller/IndexController.php.c9save | 1 + .../alexander-alexandrov/index.phtml.c9save | 6 ++++++ module/Application/config/module.config.php | 3 ++- .../Controller/AlexanderAlexandrov.php | 21 +++++++++++++++++++ .../alexander-alexandrov/index.phtml | 1 + 9 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 .c9revisions/README.md.c9save create mode 100644 .c9revisions/config/autoload/global.php.c9save create mode 100644 .c9revisions/module/Application/config/module.config.php.c9save create mode 100644 .c9revisions/module/Application/src/Application/Controller/AlexanderAlexandrov.php.c9save create mode 100644 .c9revisions/module/Application/src/Application/Controller/IndexController.php.c9save create mode 100644 .c9revisions/module/Application/view/application/alexander-alexandrov/index.phtml.c9save create mode 100644 module/Application/src/Application/Controller/AlexanderAlexandrov.php create mode 100644 module/Application/view/application/alexander-alexandrov/index.phtml diff --git a/.c9revisions/README.md.c9save b/.c9revisions/README.md.c9save new file mode 100644 index 00000000..d511303e --- /dev/null +++ b/.c9revisions/README.md.c9save @@ -0,0 +1 @@ +{"ts":1360917272605,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1,"This is a sample PHP project\n\nZendSkeletonApplication\n=======================\n\nIntroduction\n------------\nThis is a simple, skeleton application using the ZF2 MVC layer and module\nsystems. This application is meant to be used as a starting place for those\nlooking to get their feet wet with ZF2.\n\n\nInstallation\n------------\n\nUsing Composer (recommended)\n----------------------------\nThe recommended way to get a working copy of this project is to clone the repository\nand use composer to install dependencies:\n\n cd my/project/dir\n git clone git://github.com/zendframework/ZendSkeletonApplication.git\n cd ZendSkeletonApplication\n php composer.phar install\n\nUsing Git submodules\n--------------------\nAlternatively, you can install using native git submodules:\n\n git clone git://github.com/zendframework/ZendSkeletonApplication.git --recursive\n\nVirtual Host\n------------\nAfterwards, set up a virtual host to point to the public/ directory of the\nproject and you should be ready to go!\n\n"]],"start1":0,"start2":0,"length1":0,"length2":997}]],"length":997} diff --git a/.c9revisions/config/autoload/global.php.c9save b/.c9revisions/config/autoload/global.php.c9save new file mode 100644 index 00000000..27de44c8 --- /dev/null +++ b/.c9revisions/config/autoload/global.php.c9save @@ -0,0 +1 @@ +{"ts":1360917264585,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1," array(\n 'driver' => 'Pdo',\n// 'dsn' => 'mysql:dbname=zf2tutorial;host=localhost',\n 'driver_options' => array(\n PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \\'UTF8\\''\n ),\n ),\n 'service_manager' => array(\n 'factories' => array(\n 'Zend\\Db\\Adapter\\Adapter'\n => 'Zend\\Db\\Adapter\\AdapterServiceFactory',\n ),\n ),\n);"]],"start1":0,"start2":0,"length1":0,"length2":880}]],"length":880} diff --git a/.c9revisions/module/Application/config/module.config.php.c9save b/.c9revisions/module/Application/config/module.config.php.c9save new file mode 100644 index 00000000..617d045e --- /dev/null +++ b/.c9revisions/module/Application/config/module.config.php.c9save @@ -0,0 +1,8 @@ +{"ts":1360917439952,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1," array(\n 'routes' => array(\n 'home' => array(\n 'type' => 'Zend\\Mvc\\Router\\Http\\Literal',\n 'options' => array(\n 'route' => '/',\n 'defaults' => array(\n 'controller' => 'Application\\Controller\\Index',\n 'action' => 'index',\n ),\n ),\n ),\n // The following is a route to simplify getting started creating\n // new controllers and actions without needing to create a new\n // module. Simply drop new controllers in, and you can access them\n // using the path /application/:controller/:action\n 'application' => array(\n 'type' => 'Literal',\n 'options' => array(\n 'route' => '/application',\n 'defaults' => array(\n '__NAMESPACE__' => 'Application\\Controller',\n 'controller' => 'Index',\n 'action' => 'index',\n ),\n ),\n 'may_terminate' => true,\n 'child_routes' => array(\n 'default' => array(\n 'type' => 'Segment',\n 'options' => array(\n 'route' => '/[:controller[/:action]]',\n 'constraints' => array(\n 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',\n 'action' => '[a-zA-Z][a-zA-Z0-9_-]*',\n ),\n 'defaults' => array(\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n 'service_manager' => array(\n 'factories' => array(\n 'translator' => 'Zend\\I18n\\Translator\\TranslatorServiceFactory',\n ),\n ),\n 'translator' => array(\n 'locale' => 'en_US',\n 'translation_file_patterns' => array(\n array(\n 'type' => 'gettext',\n 'base_dir' => __DIR__ . '/../language',\n 'pattern' => '%s.mo',\n ),\n ),\n ),\n 'controllers' => array(\n 'invokables' => array(\n 'Application\\Controller\\Index' => 'Application\\Controller\\IndexController'\n ),\n ),\n 'view_manager' => array(\n 'display_not_found_reason' => true,\n 'display_exceptions' => true,\n 'doctype' => 'HTML5',\n 'not_found_template' => 'error/404',\n 'exception_template' => 'error/index',\n 'template_map' => array(\n 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',\n 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',\n 'error/404' => __DIR__ . '/../view/error/404.phtml',\n 'error/index' => __DIR__ . '/../view/error/index.phtml',\n ),\n 'template_path_stack' => array(\n __DIR__ . '/../view',\n ),\n ),\n);\n"]],"start1":0,"start2":0,"length1":0,"length2":3538}]],"length":3538} +{"contributors":[],"silentsave":true,"ts":1360917452256,"patch":[[{"diffs":[[0,"roller'\n"],[1," \n"],[0," "]],"start1":2769,"start2":2769,"length1":16,"length2":21}]],"length":3543,"saved":false} +{"ts":1360917453443,"patch":[[{"diffs":[[0,"roller'\n"],[-1," "],[0,"\n "]],"start1":2769,"start2":2769,"length1":20,"length2":16}]],"length":3539,"saved":false} +{"ts":1360917454661,"patch":[[{"diffs":[[0,"roller'\n"],[1," 'Application\\Controller\\Index' => 'Application\\Controller\\IndexController'"],[0,"\n "]],"start1":2769,"start2":2769,"length1":16,"length2":102}]],"length":3625,"saved":false} +{"ts":1360917478163,"patch":[[{"diffs":[[0,"tion\\Controller\\"],[-1,"Index"],[1,"AlexanderAlexandrov"],[0,"' => 'Applicatio"]],"start1":2797,"start2":2797,"length1":37,"length2":51}]],"length":3639,"saved":false} +{"ts":1360917483867,"patch":[[{"diffs":[[0,"tion\\Controller\\"],[-1,"Index"],[1,"AlexanderAl"],[0,"Controller'\n "]],"start1":2845,"start2":2845,"length1":37,"length2":43}]],"length":3645,"saved":false} +{"ts":1360917486688,"patch":[[{"diffs":[[0,"xanderAl"],[1,"exandrov"],[0,"Controll"]],"start1":2864,"start2":2864,"length1":16,"length2":24}]],"length":3653,"saved":false} +{"ts":1360917492948,"patch":[[{"diffs":[[0,"IndexController'"],[1,","],[0,"\n 'Ap"]],"start1":2760,"start2":2760,"length1":32,"length2":33}]],"length":3654,"saved":false} diff --git a/.c9revisions/module/Application/src/Application/Controller/AlexanderAlexandrov.php.c9save b/.c9revisions/module/Application/src/Application/Controller/AlexanderAlexandrov.php.c9save new file mode 100644 index 00000000..5d82ff18 --- /dev/null +++ b/.c9revisions/module/Application/src/Application/Controller/AlexanderAlexandrov.php.c9save @@ -0,0 +1,5 @@ +{"ts":1360917333816,"silentsave":true,"restoring":false,"patch":[[]],"length":0} +{"contributors":[],"silentsave":true,"ts":1360917342631,"patch":[[{"diffs":[[1,""]],"start1":0,"start2":0,"length1":8,"length2":9}]],"length":9,"saved":false} +{"ts":1360917419651,"patch":[[{"diffs":[[0,"

"],[1,"Alexander Alexandrov"],[0,"

"]],"start1":0,"start2":0,"length1":9,"length2":29}]],"length":29,"saved":false} diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index a6dd62b8..d1fd07ee 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -69,7 +69,8 @@ ), 'controllers' => array( 'invokables' => array( - 'Application\Controller\Index' => 'Application\Controller\IndexController' + 'Application\Controller\Index' => 'Application\Controller\IndexController', + 'Application\Controller\AlexanderAlexandrov' => 'Application\Controller\AlexanderAlexandrovController' ), ), 'view_manager' => array( diff --git a/module/Application/src/Application/Controller/AlexanderAlexandrov.php b/module/Application/src/Application/Controller/AlexanderAlexandrov.php new file mode 100644 index 00000000..0b3a9b7e --- /dev/null +++ b/module/Application/src/Application/Controller/AlexanderAlexandrov.php @@ -0,0 +1,21 @@ +Alexander Alexandrov \ No newline at end of file From 04a2f709d821646fc08904f6c344dfdf316cae37 Mon Sep 17 00:00:00 2001 From: OpenShift guest Date: Fri, 15 Feb 2013 04:08:35 -0500 Subject: [PATCH 133/180] new controller added --- .../config/module.config.php.c9save | 8 +++++++ .../Controller/IndexController.php.c9save | 1 + .../Controller/ZhelyanGuglev.php.c9save | 5 +++++ .../zhelyan-guglev/index.phtml.c9save | 6 ++++++ module/Application/config/module.config.php | 3 ++- .../Application/Controller/ZhelyanGuglev.php | 21 +++++++++++++++++++ .../application/zhelyan-guglev/index.phtml | 1 + 7 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 .c9revisions/module/Application/config/module.config.php.c9save create mode 100644 .c9revisions/module/Application/src/Application/Controller/IndexController.php.c9save create mode 100644 .c9revisions/module/Application/src/Application/Controller/ZhelyanGuglev.php.c9save create mode 100644 .c9revisions/module/Application/view/application/zhelyan-guglev/index.phtml.c9save create mode 100644 module/Application/src/Application/Controller/ZhelyanGuglev.php create mode 100644 module/Application/view/application/zhelyan-guglev/index.phtml diff --git a/.c9revisions/module/Application/config/module.config.php.c9save b/.c9revisions/module/Application/config/module.config.php.c9save new file mode 100644 index 00000000..8761beb2 --- /dev/null +++ b/.c9revisions/module/Application/config/module.config.php.c9save @@ -0,0 +1,8 @@ +{"ts":1360917442300,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1," array(\n 'routes' => array(\n 'home' => array(\n 'type' => 'Zend\\Mvc\\Router\\Http\\Literal',\n 'options' => array(\n 'route' => '/',\n 'defaults' => array(\n 'controller' => 'Album\\Controller\\Album',\n 'controller' => 'Application\\Controller\\Index',\n 'action' => 'index',\n ),\n ),\n ),\n // The following is a route to simplify getting started creating\n // new controllers and actions without needing to create a new\n // module. Simply drop new controllers in, and you can access them\n // using the path /application/:controller/:action\n 'application' => array(\n 'type' => 'Literal',\n 'options' => array(\n 'route' => '/application',\n 'defaults' => array(\n '__NAMESPACE__' => 'Application\\Controller',\n 'controller' => 'Index',\n 'action' => 'index',\n ),\n ),\n 'may_terminate' => true,\n 'child_routes' => array(\n 'default' => array(\n 'type' => 'Segment',\n 'options' => array(\n 'route' => '/[:controller[/:action]]',\n 'constraints' => array(\n 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',\n 'action' => '[a-zA-Z][a-zA-Z0-9_-]*',\n ),\n 'defaults' => array(\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n 'service_manager' => array(\n 'factories' => array(\n 'translator' => 'Zend\\I18n\\Translator\\TranslatorServiceFactory',\n ),\n ),\n 'translator' => array(\n 'locale' => 'en_US',\n 'translation_file_patterns' => array(\n array(\n 'type' => 'gettext',\n 'base_dir' => __DIR__ . '/../language',\n 'pattern' => '%s.mo',\n ),\n ),\n ),\n 'controllers' => array(\n 'invokables' => array(\n 'Application\\Controller\\Index' => 'Application\\Controller\\IndexController'\n ),\n ),\n 'view_manager' => array(\n 'display_not_found_reason' => true,\n 'display_exceptions' => true,\n 'doctype' => 'HTML5',\n 'not_found_template' => 'error/404',\n 'exception_template' => 'error/index',\n 'template_map' => array(\n 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',\n 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',\n 'error/404' => __DIR__ . '/../view/error/404.phtml',\n 'error/index' => __DIR__ . '/../view/error/index.phtml',\n ),\n 'template_path_stack' => array(\n __DIR__ . '/../view',\n ),\n ),\n);\n"]],"start1":0,"start2":0,"length1":0,"length2":3604}]],"length":3604} +{"contributors":[],"silentsave":true,"ts":1360917476849,"patch":[[{"diffs":[[0,"roller'\n"],[1," 'Application\\Controller\\Index' => 'Application\\Controller\\IndexController'\n"],[0," "]],"start1":2835,"start2":2835,"length1":16,"length2":103}]],"length":3691,"saved":false} +{"ts":1360917485251,"patch":[[{"diffs":[[0,"tion\\Controller\\"],[-1,"Index"],[1,"ZhelyanG"],[0,"' => 'Applicatio"]],"start1":2863,"start2":2863,"length1":37,"length2":40}]],"length":3694,"saved":false} +{"ts":1360917486976,"patch":[[{"diffs":[[0,"ZhelyanG"],[1,"ugle"],[0,"' => 'Ap"]],"start1":2879,"start2":2879,"length1":16,"length2":20}]],"length":3698,"saved":false} +{"ts":1360917488544,"patch":[[{"diffs":[[0,"yanGugle"],[1,"v"],[0,"' => 'Ap"]],"start1":2883,"start2":2883,"length1":16,"length2":17}]],"length":3699,"saved":false} +{"ts":1360917492418,"patch":[[{"diffs":[[0,"tion\\Controller\\"],[-1,"Index"],[1,"ZhelyanGu"],[0,"Controller'\n "]],"start1":2905,"start2":2905,"length1":37,"length2":41}]],"length":3703,"saved":false} +{"ts":1360917493956,"patch":[[{"diffs":[[0,"helyanGu"],[1,"glev"],[0,"Controll"]],"start1":2922,"start2":2922,"length1":16,"length2":20}]],"length":3707,"saved":false} +{"ts":1360917496261,"patch":[[{"diffs":[[0,"IndexController'"],[1,","],[0,"\n 'Ap"]],"start1":2826,"start2":2826,"length1":32,"length2":33}]],"length":3708,"saved":false} diff --git a/.c9revisions/module/Application/src/Application/Controller/IndexController.php.c9save b/.c9revisions/module/Application/src/Application/Controller/IndexController.php.c9save new file mode 100644 index 00000000..6173c4e6 --- /dev/null +++ b/.c9revisions/module/Application/src/Application/Controller/IndexController.php.c9save @@ -0,0 +1 @@ +{"ts":1360917344453,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1,""]],"start1":0,"start2":0,"length1":0,"length2":4}]],"length":4,"saved":false} +{"ts":1360917413705,"patch":[[{"diffs":[[0,"

"],[1,""]],"start1":0,"start2":0,"length1":6,"length2":9}]],"length":9,"saved":false} +{"ts":1360917419870,"patch":[[{"diffs":[[0,"

"],[1,"Zhelyzn"],[0,"

"]],"start1":0,"start2":0,"length1":9,"length2":16}]],"length":16,"saved":false} +{"ts":1360917423178,"patch":[[{"diffs":[[0,"hely"],[-1,"zn"],[1,"an Guglev"],[0," array( 'invokables' => array( - 'Application\Controller\Index' => 'Application\Controller\IndexController' + 'Application\Controller\Index' => 'Application\Controller\IndexController', + 'Application\Controller\ZhelyanGuglev' => 'Application\Controller\ZhelyanGuglevController' ), ), 'view_manager' => array( diff --git a/module/Application/src/Application/Controller/ZhelyanGuglev.php b/module/Application/src/Application/Controller/ZhelyanGuglev.php new file mode 100644 index 00000000..13c0975b --- /dev/null +++ b/module/Application/src/Application/Controller/ZhelyanGuglev.php @@ -0,0 +1,21 @@ +Zhelyan Guglev \ No newline at end of file From 382398eb76cf57b34c6a535d31ee46dec038b1a2 Mon Sep 17 00:00:00 2001 From: Zh G Date: Fri, 15 Feb 2013 09:41:03 +0000 Subject: [PATCH 134/180] new module and controller added --- module/ZhelyanGuglev/Module.php | 24 +++++++++++ module/ZhelyanGuglev/autoload_classmap.php | 2 + module/ZhelyanGuglev/config/module.config.php | 42 +++++++++++++++++++ .../Controller/IndexController.php | 21 ++++++++++ module/ZhelyanGuglev/view/layout/layout.phtml | 11 +++++ .../view/zhelyan-guglev/index/index.phtml | 1 + 6 files changed, 101 insertions(+) create mode 100644 module/ZhelyanGuglev/Module.php create mode 100644 module/ZhelyanGuglev/autoload_classmap.php create mode 100644 module/ZhelyanGuglev/config/module.config.php create mode 100644 module/ZhelyanGuglev/src/ZhelyanGuglev/Controller/IndexController.php create mode 100644 module/ZhelyanGuglev/view/layout/layout.phtml create mode 100644 module/ZhelyanGuglev/view/zhelyan-guglev/index/index.phtml diff --git a/module/ZhelyanGuglev/Module.php b/module/ZhelyanGuglev/Module.php new file mode 100644 index 00000000..d5993803 --- /dev/null +++ b/module/ZhelyanGuglev/Module.php @@ -0,0 +1,24 @@ + array( + __DIR__ . '/autoload_classmap.php', + ), + 'Zend\Loader\StandardAutoloader' => array( + 'namespaces' => array( + __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, + ), + ), + ); + } + + public function getConfig() + { + return include __DIR__ . '/config/module.config.php'; + } +} \ No newline at end of file diff --git a/module/ZhelyanGuglev/autoload_classmap.php b/module/ZhelyanGuglev/autoload_classmap.php new file mode 100644 index 00000000..dad330e6 --- /dev/null +++ b/module/ZhelyanGuglev/autoload_classmap.php @@ -0,0 +1,2 @@ + array( + 'invokables' => array( + 'ZhelyanGuglev\Controller\Index' => 'ZhelyanGuglev\Controller\IndexController', + ), + ), + + // The following section is new and should be added to your file + 'router' => array( + 'routes' => array( + 'album' => array( + 'type' => 'segment', + 'options' => array( + 'route' => '/stoyan-cheresharov[/:action][/:id]', + 'constraints' => array( + 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', + 'id' => '[0-9]+', + ), + 'defaults' => array( + 'controller' => 'ZhelyanGuglev\Controller\Index', + 'action' => 'index', + ), + ), + ), + ), + ), + + 'view_manager' => array( + 'template_map' => array( + // 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', // the entire app is using it + // 'layout/layout' => __DIR__ . '/../view/layout/student.phtml', + // 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', + // 'application/stoyan/index' => __DIR__ . '/../view/application/stoyan/index.phtml', // <-- Added by me + // 'error/404' => __DIR__ . '/../view/error/404.phtml', + // 'error/index' => __DIR__ . '/../view/error/index.phtml', + ), + 'template_path_stack' => array( + 'album' => __DIR__ . '/../view', + ), + ), +); \ No newline at end of file diff --git a/module/ZhelyanGuglev/src/ZhelyanGuglev/Controller/IndexController.php b/module/ZhelyanGuglev/src/ZhelyanGuglev/Controller/IndexController.php new file mode 100644 index 00000000..6b79f20f --- /dev/null +++ b/module/ZhelyanGuglev/src/ZhelyanGuglev/Controller/IndexController.php @@ -0,0 +1,21 @@ + + + Zhelyan Guglev Layout + + + Zhelyan Guglev layout

'; ?> + + content; ?> + + + \ No newline at end of file diff --git a/module/ZhelyanGuglev/view/zhelyan-guglev/index/index.phtml b/module/ZhelyanGuglev/view/zhelyan-guglev/index/index.phtml new file mode 100644 index 00000000..9863c081 --- /dev/null +++ b/module/ZhelyanGuglev/view/zhelyan-guglev/index/index.phtml @@ -0,0 +1 @@ +

I am the index.phtml in ZhelyanGuglev module

\ No newline at end of file From 07ba524643f381dba006cb21c2a51987e8d9772c Mon Sep 17 00:00:00 2001 From: "aleksaander_aleksandrov@abv.bg" <> Date: Fri, 15 Feb 2013 09:41:05 +0000 Subject: [PATCH 135/180] Created Module Alexander Alexandrov --- module/AlexanderAlexandrov/Module.php | 24 +++++++++++++ .../AlexanderAlexandrov/autoload_classmap.php | 2 ++ .../config/module.config.php | 34 +++++++++++++++++++ .../Controller/IndexController.php | 21 ++++++++++++ .../alexander-alexandrov/index/index.phtml | 1 + 5 files changed, 82 insertions(+) create mode 100644 module/AlexanderAlexandrov/Module.php create mode 100644 module/AlexanderAlexandrov/autoload_classmap.php create mode 100644 module/AlexanderAlexandrov/config/module.config.php create mode 100644 module/AlexanderAlexandrov/src/AlexanderAlexandrov/Controller/IndexController.php create mode 100644 module/AlexanderAlexandrov/view/alexander-alexandrov/index/index.phtml diff --git a/module/AlexanderAlexandrov/Module.php b/module/AlexanderAlexandrov/Module.php new file mode 100644 index 00000000..0c89ee03 --- /dev/null +++ b/module/AlexanderAlexandrov/Module.php @@ -0,0 +1,24 @@ + array( + __DIR__ . '/autoload_classmap.php', + ), + 'Zend\Loader\StandardAutoloader' => array( + 'namespaces' => array( + __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, + ), + ), + ); + } + + public function getConfig() + { + return include __DIR__ . '/config/module.config.php'; + } +} \ No newline at end of file diff --git a/module/AlexanderAlexandrov/autoload_classmap.php b/module/AlexanderAlexandrov/autoload_classmap.php new file mode 100644 index 00000000..dad330e6 --- /dev/null +++ b/module/AlexanderAlexandrov/autoload_classmap.php @@ -0,0 +1,2 @@ + array( + 'invokables' => array( + 'AlexanderAlexandrov\Controller\Index' => 'AlexanderAlexandrov\Controller\IndexController', + ), + ), + + // The following section is new and should be added to your file + 'router' => array( + 'routes' => array( + 'album' => array( + 'type' => 'segment', + 'options' => array( + 'route' => '/alexander-alexandrov[/:action][/:id]', + 'constraints' => array( + 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', + 'id' => '[0-9]+', + ), + 'defaults' => array( + 'controller' => 'AlexanderAlexandrov\Controller\Index', + 'action' => 'index', + ), + ), + ), + ), + ), + + 'view_manager' => array( + 'template_path_stack' => array( + 'album' => __DIR__ . '/../view', + ), + ), +); \ No newline at end of file diff --git a/module/AlexanderAlexandrov/src/AlexanderAlexandrov/Controller/IndexController.php b/module/AlexanderAlexandrov/src/AlexanderAlexandrov/Controller/IndexController.php new file mode 100644 index 00000000..6341a878 --- /dev/null +++ b/module/AlexanderAlexandrov/src/AlexanderAlexandrov/Controller/IndexController.php @@ -0,0 +1,21 @@ +I am the index.phtml in AlexanderAlexandrov module \ No newline at end of file From e6705e805381cc078c02a852cf8d88a2abd9103b Mon Sep 17 00:00:00 2001 From: Zh G Date: Fri, 15 Feb 2013 09:43:45 +0000 Subject: [PATCH 136/180] adding new module path --- config/application.config.php | 1 + 1 file changed, 1 insertion(+) diff --git a/config/application.config.php b/config/application.config.php index bf1446de..9099ae00 100644 --- a/config/application.config.php +++ b/config/application.config.php @@ -3,6 +3,7 @@ 'modules' => array( 'Application', 'Album', + 'ZhelyanGuglev', ), 'module_listener_options' => array( 'config_glob_paths' => array( From 07ca9051fb02b60af7bdf0c6efbe44f2f49958f6 Mon Sep 17 00:00:00 2001 From: "aleksaander_aleksandrov@abv.bg" <> Date: Fri, 15 Feb 2013 09:44:25 +0000 Subject: [PATCH 137/180] Changing the config --- config/application.config.php | 1 + 1 file changed, 1 insertion(+) diff --git a/config/application.config.php b/config/application.config.php index aaa7a91f..07d3c073 100644 --- a/config/application.config.php +++ b/config/application.config.php @@ -3,6 +3,7 @@ 'modules' => array( 'Application', 'Album', // <-- Add this line + 'AlexanderAlexandrov', // <-- Add this line ), 'module_listener_options' => array( 'config_glob_paths' => array( From 1cc4c33a75db7aed0c28408490721458584c42f2 Mon Sep 17 00:00:00 2001 From: Zh G Date: Fri, 15 Feb 2013 09:49:00 +0000 Subject: [PATCH 138/180] new module module.config.php route fix --- module/ZhelyanGuglev/config/module.config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/ZhelyanGuglev/config/module.config.php b/module/ZhelyanGuglev/config/module.config.php index 0caf2039..97d922f5 100644 --- a/module/ZhelyanGuglev/config/module.config.php +++ b/module/ZhelyanGuglev/config/module.config.php @@ -12,7 +12,7 @@ 'album' => array( 'type' => 'segment', 'options' => array( - 'route' => '/stoyan-cheresharov[/:action][/:id]', + 'route' => '/zhelyan-guglev[/:action][/:id]', 'constraints' => array( 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 'id' => '[0-9]+', From 6e99793053079214a0a73cc73371eb45e137e043 Mon Sep 17 00:00:00 2001 From: Zh G Date: Fri, 15 Feb 2013 21:23:40 +0000 Subject: [PATCH 139/180] wrong namespace fixed --- .../src/ZhelyanGuglev/Controller/IndexController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/ZhelyanGuglev/src/ZhelyanGuglev/Controller/IndexController.php b/module/ZhelyanGuglev/src/ZhelyanGuglev/Controller/IndexController.php index 6b79f20f..03bfeb6c 100644 --- a/module/ZhelyanGuglev/src/ZhelyanGuglev/Controller/IndexController.php +++ b/module/ZhelyanGuglev/src/ZhelyanGuglev/Controller/IndexController.php @@ -7,7 +7,7 @@ * @license http://framework.zend.com/license/new-bsd New BSD License */ -namespace StoyanCheresharov\Controller; +namespace ZhelyanGuglev\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; From 7a6bd582c3531cb0bece5d76c9d9de50a4653f61 Mon Sep 17 00:00:00 2001 From: Zh G Date: Fri, 15 Feb 2013 23:53:05 +0200 Subject: [PATCH 140/180] c9 directory removed --- .../module/Application/config/module.config.php.c9save | 8 -------- .../src/Application/Controller/IndexController.php.c9save | 1 - .../src/Application/Controller/ZhelyanGuglev.php.c9save | 5 ----- .../view/application/zhelyan-guglev/index.phtml.c9save | 6 ------ 4 files changed, 20 deletions(-) delete mode 100644 .c9revisions/module/Application/config/module.config.php.c9save delete mode 100644 .c9revisions/module/Application/src/Application/Controller/IndexController.php.c9save delete mode 100644 .c9revisions/module/Application/src/Application/Controller/ZhelyanGuglev.php.c9save delete mode 100644 .c9revisions/module/Application/view/application/zhelyan-guglev/index.phtml.c9save diff --git a/.c9revisions/module/Application/config/module.config.php.c9save b/.c9revisions/module/Application/config/module.config.php.c9save deleted file mode 100644 index 8761beb2..00000000 --- a/.c9revisions/module/Application/config/module.config.php.c9save +++ /dev/null @@ -1,8 +0,0 @@ -{"ts":1360917442300,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1," array(\n 'routes' => array(\n 'home' => array(\n 'type' => 'Zend\\Mvc\\Router\\Http\\Literal',\n 'options' => array(\n 'route' => '/',\n 'defaults' => array(\n 'controller' => 'Album\\Controller\\Album',\n 'controller' => 'Application\\Controller\\Index',\n 'action' => 'index',\n ),\n ),\n ),\n // The following is a route to simplify getting started creating\n // new controllers and actions without needing to create a new\n // module. Simply drop new controllers in, and you can access them\n // using the path /application/:controller/:action\n 'application' => array(\n 'type' => 'Literal',\n 'options' => array(\n 'route' => '/application',\n 'defaults' => array(\n '__NAMESPACE__' => 'Application\\Controller',\n 'controller' => 'Index',\n 'action' => 'index',\n ),\n ),\n 'may_terminate' => true,\n 'child_routes' => array(\n 'default' => array(\n 'type' => 'Segment',\n 'options' => array(\n 'route' => '/[:controller[/:action]]',\n 'constraints' => array(\n 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',\n 'action' => '[a-zA-Z][a-zA-Z0-9_-]*',\n ),\n 'defaults' => array(\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n 'service_manager' => array(\n 'factories' => array(\n 'translator' => 'Zend\\I18n\\Translator\\TranslatorServiceFactory',\n ),\n ),\n 'translator' => array(\n 'locale' => 'en_US',\n 'translation_file_patterns' => array(\n array(\n 'type' => 'gettext',\n 'base_dir' => __DIR__ . '/../language',\n 'pattern' => '%s.mo',\n ),\n ),\n ),\n 'controllers' => array(\n 'invokables' => array(\n 'Application\\Controller\\Index' => 'Application\\Controller\\IndexController'\n ),\n ),\n 'view_manager' => array(\n 'display_not_found_reason' => true,\n 'display_exceptions' => true,\n 'doctype' => 'HTML5',\n 'not_found_template' => 'error/404',\n 'exception_template' => 'error/index',\n 'template_map' => array(\n 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',\n 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',\n 'error/404' => __DIR__ . '/../view/error/404.phtml',\n 'error/index' => __DIR__ . '/../view/error/index.phtml',\n ),\n 'template_path_stack' => array(\n __DIR__ . '/../view',\n ),\n ),\n);\n"]],"start1":0,"start2":0,"length1":0,"length2":3604}]],"length":3604} -{"contributors":[],"silentsave":true,"ts":1360917476849,"patch":[[{"diffs":[[0,"roller'\n"],[1," 'Application\\Controller\\Index' => 'Application\\Controller\\IndexController'\n"],[0," "]],"start1":2835,"start2":2835,"length1":16,"length2":103}]],"length":3691,"saved":false} -{"ts":1360917485251,"patch":[[{"diffs":[[0,"tion\\Controller\\"],[-1,"Index"],[1,"ZhelyanG"],[0,"' => 'Applicatio"]],"start1":2863,"start2":2863,"length1":37,"length2":40}]],"length":3694,"saved":false} -{"ts":1360917486976,"patch":[[{"diffs":[[0,"ZhelyanG"],[1,"ugle"],[0,"' => 'Ap"]],"start1":2879,"start2":2879,"length1":16,"length2":20}]],"length":3698,"saved":false} -{"ts":1360917488544,"patch":[[{"diffs":[[0,"yanGugle"],[1,"v"],[0,"' => 'Ap"]],"start1":2883,"start2":2883,"length1":16,"length2":17}]],"length":3699,"saved":false} -{"ts":1360917492418,"patch":[[{"diffs":[[0,"tion\\Controller\\"],[-1,"Index"],[1,"ZhelyanGu"],[0,"Controller'\n "]],"start1":2905,"start2":2905,"length1":37,"length2":41}]],"length":3703,"saved":false} -{"ts":1360917493956,"patch":[[{"diffs":[[0,"helyanGu"],[1,"glev"],[0,"Controll"]],"start1":2922,"start2":2922,"length1":16,"length2":20}]],"length":3707,"saved":false} -{"ts":1360917496261,"patch":[[{"diffs":[[0,"IndexController'"],[1,","],[0,"\n 'Ap"]],"start1":2826,"start2":2826,"length1":32,"length2":33}]],"length":3708,"saved":false} diff --git a/.c9revisions/module/Application/src/Application/Controller/IndexController.php.c9save b/.c9revisions/module/Application/src/Application/Controller/IndexController.php.c9save deleted file mode 100644 index 6173c4e6..00000000 --- a/.c9revisions/module/Application/src/Application/Controller/IndexController.php.c9save +++ /dev/null @@ -1 +0,0 @@ -{"ts":1360917344453,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1,""]],"start1":0,"start2":0,"length1":0,"length2":4}]],"length":4,"saved":false} -{"ts":1360917413705,"patch":[[{"diffs":[[0,"

"],[1,""]],"start1":0,"start2":0,"length1":6,"length2":9}]],"length":9,"saved":false} -{"ts":1360917419870,"patch":[[{"diffs":[[0,"

"],[1,"Zhelyzn"],[0,"

"]],"start1":0,"start2":0,"length1":9,"length2":16}]],"length":16,"saved":false} -{"ts":1360917423178,"patch":[[{"diffs":[[0,"hely"],[-1,"zn"],[1,"an Guglev"],[0," Date: Sun, 17 Feb 2013 14:46:58 +0000 Subject: [PATCH 141/180] spelling mistakes correction --- phpcloud_local_php_file_upload_instructions.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/phpcloud_local_php_file_upload_instructions.txt b/phpcloud_local_php_file_upload_instructions.txt index 34ffa838..caec00fe 100644 --- a/phpcloud_local_php_file_upload_instructions.txt +++ b/phpcloud_local_php_file_upload_instructions.txt @@ -4,13 +4,13 @@ How to upload local.php file for zend skeleton application on phpcloud.com step 1) Download FileZilla from: http://filezilla-project.org/ 2) Open FileZilla -> Settings: - Connection - SFTP - Add new key... + Connection + SFTP + Add new key... -And add your private key for phpcloud.com. -(FileZilla is able to convert non PuTTy compatible keys too like those -generated with github ssh keygen application.) +3) And add your private key for phpcloud.com. + (FileZilla is able to convert non PuTTy compatible keys too like those + generated with github ssh keygen application.) 4) Press OK. From c175ce61340955d26bcba714dcbfd90b9d04e26e Mon Sep 17 00:00:00 2001 From: = <=> Date: Tue, 19 Feb 2013 10:23:25 +0200 Subject: [PATCH 142/180] For five --- config/application.config.php | 1 + module/GyunerZeki/Module.php | 24 ++++++++++++++ module/GyunerZeki/autoload_classmap.php | 2 ++ module/GyunerZeki/config/module.config.php | 33 +++++++++++++++++++ .../GyunerZeki/Controller/IndexController.php | 21 ++++++++++++ .../view/gyuner-zeki/index/index.phtml | 1 + 6 files changed, 82 insertions(+) create mode 100644 module/GyunerZeki/Module.php create mode 100644 module/GyunerZeki/autoload_classmap.php create mode 100644 module/GyunerZeki/config/module.config.php create mode 100644 module/GyunerZeki/src/GyunerZeki/Controller/IndexController.php create mode 100644 module/GyunerZeki/view/gyuner-zeki/index/index.phtml diff --git a/config/application.config.php b/config/application.config.php index aaa7a91f..64a7d531 100644 --- a/config/application.config.php +++ b/config/application.config.php @@ -3,6 +3,7 @@ 'modules' => array( 'Application', 'Album', // <-- Add this line + 'GyunerZeki', ), 'module_listener_options' => array( 'config_glob_paths' => array( diff --git a/module/GyunerZeki/Module.php b/module/GyunerZeki/Module.php new file mode 100644 index 00000000..8944ffb7 --- /dev/null +++ b/module/GyunerZeki/Module.php @@ -0,0 +1,24 @@ + array( + __DIR__ . '/autoload_classmap.php', + ), + 'Zend\Loader\StandardAutoloader' => array( + 'namespaces' => array( + __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, + ), + ), + ); + } + + public function getConfig() + { + return include __DIR__ . '/config/module.config.php'; + } +} \ No newline at end of file diff --git a/module/GyunerZeki/autoload_classmap.php b/module/GyunerZeki/autoload_classmap.php new file mode 100644 index 00000000..dad330e6 --- /dev/null +++ b/module/GyunerZeki/autoload_classmap.php @@ -0,0 +1,2 @@ + array( + 'invokables' => array( + 'GyunerZeki\Controller\Index' => 'GyunerZeki\Controller\IndexController', + ), + ), + + 'router' => array( + 'routes' => array( + 'album' => array( + 'type' => 'segment', + 'options' => array( + 'route' => '/gyuner-zeki[/:action][/:id]', + 'constraints' => array( + 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', + 'id' => '[0-9]+', + ), + 'defaults' => array( + 'controller' => 'GyunerZeki\Controller\Index', + 'action' => 'index', + ), + ), + ), + ), + ), + + 'view_manager' => array( + 'template_path_stack' => array( + 'album' => __DIR__ . '/../view', + ), + ), +); \ No newline at end of file diff --git a/module/GyunerZeki/src/GyunerZeki/Controller/IndexController.php b/module/GyunerZeki/src/GyunerZeki/Controller/IndexController.php new file mode 100644 index 00000000..c3875df5 --- /dev/null +++ b/module/GyunerZeki/src/GyunerZeki/Controller/IndexController.php @@ -0,0 +1,21 @@ +I am the index.phtml in GyunerZeki module \ No newline at end of file From 6ca85c8c311e39df8544d9fcb90524deafc65527 Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 15:20:28 +0000 Subject: [PATCH 143/180] wrong module path --- module/Album/config/module.config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/Album/config/module.config.php b/module/Album/config/module.config.php index c02888fe..1f0aaf29 100644 --- a/module/Album/config/module.config.php +++ b/module/Album/config/module.config.php @@ -12,7 +12,7 @@ 'album' => array( 'type' => 'segment', 'options' => array( - 'route' => '/album[/:action][/:id]', + 'route' => '/album/album[/:action][/:id]', 'constraints' => array( 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 'id' => '[0-9]+', From 8b7d37caf71ae92f36c48734e4a6604bb877943d Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 15:28:14 +0000 Subject: [PATCH 144/180] cloud test --- module/Album/config/module.config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/Album/config/module.config.php b/module/Album/config/module.config.php index 1f0aaf29..fc5a2c5e 100644 --- a/module/Album/config/module.config.php +++ b/module/Album/config/module.config.php @@ -12,7 +12,7 @@ 'album' => array( 'type' => 'segment', 'options' => array( - 'route' => '/album/album[/:action][/:id]', + 'route' => '/album[/:action][/:id]', 'constraints' => array( 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 'id' => '[0-9]+', From 782b6a5071a2ad47edab6cb1226a9af4d8e11eb7 Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 15:41:15 +0000 Subject: [PATCH 145/180] cloud test --- config/application.config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/application.config.php b/config/application.config.php index 9099ae00..f3fcb758 100644 --- a/config/application.config.php +++ b/config/application.config.php @@ -3,7 +3,7 @@ 'modules' => array( 'Application', 'Album', - 'ZhelyanGuglev', +//'ZhelyanGuglev', ), 'module_listener_options' => array( 'config_glob_paths' => array( From 40484ed18510c371ede575f408ff7d61fb4c0047 Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 15:48:32 +0000 Subject: [PATCH 146/180] cloud test3 --- config/application.config.php | 2 +- module/Application/view/application/album/index.phtml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 module/Application/view/application/album/index.phtml diff --git a/config/application.config.php b/config/application.config.php index f3fcb758..9099ae00 100644 --- a/config/application.config.php +++ b/config/application.config.php @@ -3,7 +3,7 @@ 'modules' => array( 'Application', 'Album', -//'ZhelyanGuglev', + 'ZhelyanGuglev', ), 'module_listener_options' => array( 'config_glob_paths' => array( diff --git a/module/Application/view/application/album/index.phtml b/module/Application/view/application/album/index.phtml new file mode 100644 index 00000000..fd2e2819 --- /dev/null +++ b/module/Application/view/application/album/index.phtml @@ -0,0 +1 @@ +

album

From 76fdbce519e1ea6feea977addc7af0958ddeb745 Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 15:56:25 +0000 Subject: [PATCH 147/180] cloud test4 --- module/Application/config/module.config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index 5bd4e75e..049689e3 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -71,7 +71,7 @@ 'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController', - 'Application\Controller\ZhelyanGuglev' => 'Application\Controller\ZhelyanGuglevController' + 'Application\Controller\ZhelyanGuglev' => 'Application\Controller\ZhelyanGuglevController', ), ), 'view_manager' => array( From 31cfe0d287e5123bfb0dc9447e32c8f92d512198 Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 15:59:06 +0000 Subject: [PATCH 148/180] cloud test5 --- module/Application/config/module.config.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index 049689e3..8d6ff659 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -71,6 +71,7 @@ 'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController', + 'Application\Controller\Album' => 'Album\Controller\AlbumController', 'Application\Controller\ZhelyanGuglev' => 'Application\Controller\ZhelyanGuglevController', ), ), From c4c8a15d5c7a76a39739bb6dd2e34a3200b2e420 Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 16:01:39 +0000 Subject: [PATCH 149/180] cloud test6 --- module/Application/config/module.config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index 8d6ff659..1e320a70 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -71,7 +71,7 @@ 'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController', - 'Application\Controller\Album' => 'Album\Controller\AlbumController', + 'Album\Controller\Album' => 'Album\Controller\AlbumController', 'Application\Controller\ZhelyanGuglev' => 'Application\Controller\ZhelyanGuglevController', ), ), From 47b8a4591610cfa772ac22fe23aa0b2fc1af761e Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 16:04:52 +0000 Subject: [PATCH 150/180] tc7 --- .../Controller/AlbumController.php | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 module/Application/src/Application/Controller/AlbumController.php diff --git a/module/Application/src/Application/Controller/AlbumController.php b/module/Application/src/Application/Controller/AlbumController.php new file mode 100644 index 00000000..9a051293 --- /dev/null +++ b/module/Application/src/Application/Controller/AlbumController.php @@ -0,0 +1,111 @@ + $this->getAlbumTable()->fetchAll(), + )); + } + + public function addAction() + { + $form = new AlbumForm(); + $form->get('submit')->setValue('Add'); + + $request = $this->getRequest(); + if ($request->isPost()) { + $album = new Album(); + $form->setInputFilter($album->getInputFilter()); + $form->setData($request->getPost()); + + if ($form->isValid()) { + $album->exchangeArray($form->getData()); + $this->getAlbumTable()->saveAlbum($album); + + // Redirect to list of albums + return $this->redirect()->toRoute('album'); + } + } + return array('form' => $form); + } + + public function editAction() + { + $id = (int) $this->params()->fromRoute('id', 0); + if (!$id) { + return $this->redirect()->toRoute('album', array( + 'action' => 'add' + )); + } + $album = $this->getAlbumTable()->getAlbum($id); + + $form = new AlbumForm(); + $form->bind($album); + $form->get('submit')->setAttribute('value', 'Edit'); + + $request = $this->getRequest(); + if ($request->isPost()) { + $form->setInputFilter($album->getInputFilter()); + $form->setData($request->getPost()); + + if ($form->isValid()) { + $this->getAlbumTable()->saveAlbum($form->getData()); + + // Redirect to list of albums + return $this->redirect()->toRoute('album'); + } + } + + return array( + 'id' => $id, + 'form' => $form, + ); + } + + public function deleteAction() + { + $id = (int) $this->params()->fromRoute('id', 0); + if (!$id) { + return $this->redirect()->toRoute('album'); + } + + $request = $this->getRequest(); + if ($request->isPost()) { + $del = $request->getPost('del', 'No'); + + if ($del == 'Yes') { + $id = (int) $request->getPost('id'); + $this->getAlbumTable()->deleteAlbum($id); + } + + // Redirect to list of albums + return $this->redirect()->toRoute('album'); + } + + return array( + 'id' => $id, + 'album' => $this->getAlbumTable()->getAlbum($id) + ); + } + + public function getAlbumTable() + { + if (!$this->albumTable) + { + $sm = $this->getServiceLocator(); + $this->albumTable = $sm->get('Album\Model\AlbumTable'); + } + return $this->albumTable; + } + } \ No newline at end of file From 441409b86363be8652aca37ffb749adb4a7b24a2 Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 16:07:09 +0000 Subject: [PATCH 151/180] tc8 --- module/Application/config/module.config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index 1e320a70..8d6ff659 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -71,7 +71,7 @@ 'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController', - 'Album\Controller\Album' => 'Album\Controller\AlbumController', + 'Application\Controller\Album' => 'Album\Controller\AlbumController', 'Application\Controller\ZhelyanGuglev' => 'Application\Controller\ZhelyanGuglevController', ), ), From a2fe3424b2854a3b6bd2eda5a55bbae44a830dc6 Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 16:10:03 +0000 Subject: [PATCH 152/180] tc9 --- module/Application/config/module.config.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index 8d6ff659..accb80d5 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -71,8 +71,8 @@ 'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController', - 'Application\Controller\Album' => 'Album\Controller\AlbumController', - 'Application\Controller\ZhelyanGuglev' => 'Application\Controller\ZhelyanGuglevController', + 'Album\Controller\AlbumController' => 'Application\Controller\Album', + 'Application\Controller\ZhelyanGuglev' => 'Application\Controller\ZhelyanGuglevController' ), ), 'view_manager' => array( From 0d8770e4e1e7b0a95f5ac3e9a1f86183c4c0093a Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 16:11:37 +0000 Subject: [PATCH 153/180] tc10 --- module/Application/config/module.config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index accb80d5..b67deb00 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -71,7 +71,7 @@ 'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController', - 'Album\Controller\AlbumController' => 'Application\Controller\Album', + 'Album\Controller\Album' => 'Application\Controller\AlbumController', 'Application\Controller\ZhelyanGuglev' => 'Application\Controller\ZhelyanGuglevController' ), ), From 16ebd354558eaf8269e8a0d92f102ae959f281be Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 16:18:21 +0000 Subject: [PATCH 154/180] tc12 --- module/Application/config/module.config.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index b67deb00..3a3e87cd 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -71,8 +71,7 @@ 'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController', - 'Album\Controller\Album' => 'Application\Controller\AlbumController', - 'Application\Controller\ZhelyanGuglev' => 'Application\Controller\ZhelyanGuglevController' +//'Application\Controller\ZhelyanGuglev' => 'Application\Controller\ZhelyanGuglevController', ), ), 'view_manager' => array( From c074d502c2485f2046071474d90b94669268a27f Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 16:26:41 +0000 Subject: [PATCH 155/180] tc12 --- module/Application/config/module.config.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index 3a3e87cd..562b53a5 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -15,8 +15,9 @@ 'options' => array( 'route' => '/', 'defaults' => array( - 'controller' => 'Album\Controller\Album', +// 'controller' => 'Album\Controller\Album', 'controller' => 'Application\Controller\Index', +//'controller' => 'ZhelyanGuglev\Controller\ZhelyanGuglev', 'action' => 'index', ), ), @@ -71,7 +72,7 @@ 'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController', -//'Application\Controller\ZhelyanGuglev' => 'Application\Controller\ZhelyanGuglevController', + 'Application\Controller\ZhelyanGuglev' => 'Application\Controller\ZhelyanGuglevController', ), ), 'view_manager' => array( From 0bf99ac99aa89aac15e12ba4fce70cb5f959e663 Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 16:28:50 +0000 Subject: [PATCH 156/180] tc13 --- module/Application/config/module.config.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index 562b53a5..08f6008b 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -72,6 +72,7 @@ 'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController', + 'Album\Controller\Album' => 'Album\Controller\Album', 'Application\Controller\ZhelyanGuglev' => 'Application\Controller\ZhelyanGuglevController', ), ), From 010185c9224caa4d5dce471f47e280e2583096f1 Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 16:32:26 +0000 Subject: [PATCH 157/180] tc14 --- module/Application/config/module.config.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index 08f6008b..fb703020 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -17,7 +17,6 @@ 'defaults' => array( // 'controller' => 'Album\Controller\Album', 'controller' => 'Application\Controller\Index', -//'controller' => 'ZhelyanGuglev\Controller\ZhelyanGuglev', 'action' => 'index', ), ), @@ -72,7 +71,7 @@ 'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController', - 'Album\Controller\Album' => 'Album\Controller\Album', + 'Album\Controller\Album' => 'Album\Controller\AlbumController', 'Application\Controller\ZhelyanGuglev' => 'Application\Controller\ZhelyanGuglevController', ), ), From 4a3bd081423c5f81c0f8f84e9d44523d6ea85b57 Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 16:38:27 +0000 Subject: [PATCH 158/180] tc15 --- module/Application/config/module.config.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index fb703020..06d0de28 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -71,8 +71,7 @@ 'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController', - 'Album\Controller\Album' => 'Album\Controller\AlbumController', - 'Application\Controller\ZhelyanGuglev' => 'Application\Controller\ZhelyanGuglevController', +// 'Application\Controller\ZhelyanGuglev' => 'Application\Controller\ZhelyanGuglevController', ), ), 'view_manager' => array( From c5c3360bdd4c101a94c03cc5e70d6d683256ddbf Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 16:40:24 +0000 Subject: [PATCH 159/180] tc16 --- config/application.config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/application.config.php b/config/application.config.php index 9099ae00..2a96315b 100644 --- a/config/application.config.php +++ b/config/application.config.php @@ -3,7 +3,7 @@ 'modules' => array( 'Application', 'Album', - 'ZhelyanGuglev', + 'ZhelyanGuglev' ), 'module_listener_options' => array( 'config_glob_paths' => array( From b9f54bcab1da2062ca5df9ccec6c28267ebf1aa8 Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 16:42:11 +0000 Subject: [PATCH 160/180] --- config/application.config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/application.config.php b/config/application.config.php index 2a96315b..9099ae00 100644 --- a/config/application.config.php +++ b/config/application.config.php @@ -3,7 +3,7 @@ 'modules' => array( 'Application', 'Album', - 'ZhelyanGuglev' + 'ZhelyanGuglev', ), 'module_listener_options' => array( 'config_glob_paths' => array( From de20481d8757140c88e0e8a7221aab2e1edbdaf1 Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 16:46:53 +0000 Subject: [PATCH 161/180] tc16 --- module/Album/view/album/index.phtml | 30 +++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 module/Album/view/album/index.phtml diff --git a/module/Album/view/album/index.phtml b/module/Album/view/album/index.phtml new file mode 100644 index 00000000..58c37696 --- /dev/null +++ b/module/Album/view/album/index.phtml @@ -0,0 +1,30 @@ +headTitle($title); +?> +

escapeHtml($title); ?>

+

+ Add new album +

+ +
+ + + + + + + + + + + + +
TitleArtist 
escapeHtml($album->title);?>escapeHtml($album->artist);?> + Edit + Delete +
From a7ef04fb6a4fff79fb286d89d40a397376f5ba1f Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 16:49:41 +0000 Subject: [PATCH 162/180] tc17 --- config/application.config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/application.config.php b/config/application.config.php index 9099ae00..f3fcb758 100644 --- a/config/application.config.php +++ b/config/application.config.php @@ -3,7 +3,7 @@ 'modules' => array( 'Application', 'Album', - 'ZhelyanGuglev', +//'ZhelyanGuglev', ), 'module_listener_options' => array( 'config_glob_paths' => array( From 73bac4fc9f75d004cece00eea78f75c329a95b92 Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 16:56:44 +0000 Subject: [PATCH 163/180] crashing notification added --- config/application.config.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/application.config.php b/config/application.config.php index f3fcb758..cd5fbee0 100644 --- a/config/application.config.php +++ b/config/application.config.php @@ -2,8 +2,8 @@ return array( 'modules' => array( 'Application', - 'Album', -//'ZhelyanGuglev', + 'Album', //this one crashes + 'ZhelyanGuglev', ), 'module_listener_options' => array( 'config_glob_paths' => array( From a27be9b4874851c7bfec22b9a6db61eb36804b70 Mon Sep 17 00:00:00 2001 From: Zh G Date: Wed, 20 Feb 2013 16:59:38 +0000 Subject: [PATCH 164/180] crashing notification added --- module/Album/view/album/index.phtml | 30 ------------------- .../view/application/album/index.phtml | 1 - module/ZhelyanGuglev/view/layout/layout.phtml | 11 ------- 3 files changed, 42 deletions(-) delete mode 100644 module/Album/view/album/index.phtml delete mode 100644 module/Application/view/application/album/index.phtml delete mode 100644 module/ZhelyanGuglev/view/layout/layout.phtml diff --git a/module/Album/view/album/index.phtml b/module/Album/view/album/index.phtml deleted file mode 100644 index 58c37696..00000000 --- a/module/Album/view/album/index.phtml +++ /dev/null @@ -1,30 +0,0 @@ -headTitle($title); -?> -

escapeHtml($title); ?>

-

- Add new album -

- - - - - - - - - - - - - - -
TitleArtist 
escapeHtml($album->title);?>escapeHtml($album->artist);?> - Edit - Delete -
diff --git a/module/Application/view/application/album/index.phtml b/module/Application/view/application/album/index.phtml deleted file mode 100644 index fd2e2819..00000000 --- a/module/Application/view/application/album/index.phtml +++ /dev/null @@ -1 +0,0 @@ -

album

diff --git a/module/ZhelyanGuglev/view/layout/layout.phtml b/module/ZhelyanGuglev/view/layout/layout.phtml deleted file mode 100644 index 7709f206..00000000 --- a/module/ZhelyanGuglev/view/layout/layout.phtml +++ /dev/null @@ -1,11 +0,0 @@ - - - Zhelyan Guglev Layout - - - Zhelyan Guglev layout

'; ?> - - content; ?> - - - \ No newline at end of file From ac76554e46f824ebed85af20a521af04fd191046 Mon Sep 17 00:00:00 2001 From: cl-server Date: Wed, 20 Feb 2013 19:13:51 +0000 Subject: [PATCH 165/180] init --- .htaccess | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .htaccess diff --git a/.htaccess b/.htaccess new file mode 100644 index 00000000..912ca125 --- /dev/null +++ b/.htaccess @@ -0,0 +1,4 @@ + + Order allow,deny + Deny from all + From ef72290233f12aa34c95059381b5a613253a33b4 Mon Sep 17 00:00:00 2001 From: "vkapitanski@abv.bg" <> Date: Wed, 20 Feb 2013 19:48:18 +0000 Subject: [PATCH 166/180] VasilKapitanski.php file added --- VasilKapitanski.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 VasilKapitanski.php diff --git a/VasilKapitanski.php b/VasilKapitanski.php new file mode 100644 index 00000000..df45846f --- /dev/null +++ b/VasilKapitanski.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World I am Vasil Kapitanski. It`s nice to meet you!

'; ?> + + \ No newline at end of file From 27de9e250c5a15924f5e2cd189142dae41bfa5d0 Mon Sep 17 00:00:00 2001 From: cl-server Date: Fri, 22 Feb 2013 07:42:47 +0000 Subject: [PATCH 167/180] init --- .htaccess | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .htaccess diff --git a/.htaccess b/.htaccess new file mode 100644 index 00000000..912ca125 --- /dev/null +++ b/.htaccess @@ -0,0 +1,4 @@ + + Order allow,deny + Deny from all + From c0c519d83643af7642ea2a8d111baed91848f296 Mon Sep 17 00:00:00 2001 From: "ness.leehan@gmail.com" <> Date: Fri, 22 Feb 2013 08:04:22 +0000 Subject: [PATCH 168/180] Add Commit --- NeslihanSuleyman.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 NeslihanSuleyman.php diff --git a/NeslihanSuleyman.php b/NeslihanSuleyman.php new file mode 100644 index 00000000..66caee3d --- /dev/null +++ b/NeslihanSuleyman.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World from Neslihan Suleyman!

'; ?> + + \ No newline at end of file From 64d6d34f674cbd8a631fdea390815b023a882287 Mon Sep 17 00:00:00 2001 From: cl-server Date: Sun, 24 Feb 2013 22:51:25 +0000 Subject: [PATCH 169/180] init --- .htaccess | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .htaccess diff --git a/.htaccess b/.htaccess new file mode 100644 index 00000000..912ca125 --- /dev/null +++ b/.htaccess @@ -0,0 +1,4 @@ + + Order allow,deny + Deny from all + From 8179396573f9dc84d198331f9899ee3efb4c1088 Mon Sep 17 00:00:00 2001 From: cl-server Date: Mon, 25 Feb 2013 16:52:38 +0000 Subject: [PATCH 170/180] init --- .htaccess | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .htaccess diff --git a/.htaccess b/.htaccess new file mode 100644 index 00000000..912ca125 --- /dev/null +++ b/.htaccess @@ -0,0 +1,4 @@ + + Order allow,deny + Deny from all + From f7dbb43bf734af2785db74b852d538549b5ec242 Mon Sep 17 00:00:00 2001 From: "cheresharov@yahoo.com" <> Date: Mon, 25 Feb 2013 17:19:13 +0000 Subject: [PATCH 171/180] I have added a file StudentContributorBg.php --- StudentContributorBg.php | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 StudentContributorBg.php diff --git a/StudentContributorBg.php b/StudentContributorBg.php new file mode 100644 index 00000000..3a9bbdd5 --- /dev/null +++ b/StudentContributorBg.php @@ -0,0 +1,8 @@ + + + PHP Test + + + Hello World Student Contributor Bg

'; ?> + + \ No newline at end of file From ac2ba63ec5c66c935892b1ebf1ce2ddb88b39d9f Mon Sep 17 00:00:00 2001 From: Stoyan Cheresharov Date: Wed, 27 Feb 2013 14:06:52 +0200 Subject: [PATCH 172/180] Fixing the names of the routes. Use not only album --- module/AlexanderAlexandrov/config/module.config.php | 4 ++-- module/GyunerZeki/config/module.config.php | 4 ++-- module/ZhelyanGuglev/config/module.config.php | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/module/AlexanderAlexandrov/config/module.config.php b/module/AlexanderAlexandrov/config/module.config.php index 72c8bfe3..2f0dfede 100644 --- a/module/AlexanderAlexandrov/config/module.config.php +++ b/module/AlexanderAlexandrov/config/module.config.php @@ -9,7 +9,7 @@ // The following section is new and should be added to your file 'router' => array( 'routes' => array( - 'album' => array( + 'alexander_alexandrov' => array( 'type' => 'segment', 'options' => array( 'route' => '/alexander-alexandrov[/:action][/:id]', @@ -28,7 +28,7 @@ 'view_manager' => array( 'template_path_stack' => array( - 'album' => __DIR__ . '/../view', + 'alexander_alexandrov' => __DIR__ . '/../view', ), ), ); \ No newline at end of file diff --git a/module/GyunerZeki/config/module.config.php b/module/GyunerZeki/config/module.config.php index 10a3058f..c271ce15 100644 --- a/module/GyunerZeki/config/module.config.php +++ b/module/GyunerZeki/config/module.config.php @@ -8,7 +8,7 @@ 'router' => array( 'routes' => array( - 'album' => array( + 'gyuner_zeki' => array( 'type' => 'segment', 'options' => array( 'route' => '/gyuner-zeki[/:action][/:id]', @@ -27,7 +27,7 @@ 'view_manager' => array( 'template_path_stack' => array( - 'album' => __DIR__ . '/../view', + 'gyuner_zeki' => __DIR__ . '/../view', ), ), ); \ No newline at end of file diff --git a/module/ZhelyanGuglev/config/module.config.php b/module/ZhelyanGuglev/config/module.config.php index 97d922f5..ec6ab528 100644 --- a/module/ZhelyanGuglev/config/module.config.php +++ b/module/ZhelyanGuglev/config/module.config.php @@ -9,7 +9,7 @@ // The following section is new and should be added to your file 'router' => array( 'routes' => array( - 'album' => array( + 'zhelyan_guglev' => array( // NOT 'album'! Give a different name for the route 'type' => 'segment', 'options' => array( 'route' => '/zhelyan-guglev[/:action][/:id]', @@ -36,7 +36,7 @@ // 'error/index' => __DIR__ . '/../view/error/index.phtml', ), 'template_path_stack' => array( - 'album' => __DIR__ . '/../view', + 'zhelyan_guglev' => __DIR__ . '/../view', ), ), ); \ No newline at end of file From 042b562e94c7e2c6ecea560249752fcdcfd537ef Mon Sep 17 00:00:00 2001 From: Stoyan Date: Wed, 27 Feb 2013 08:10:55 -0500 Subject: [PATCH 173/180] Adding the js files --- .../StoyanCheresharov/css/exp.css.c9save | 2 + .../StoyanCheresharov/css/exp_bg.css.c9save | 1 + .../StoyanCheresharov/exp_bg.html.c9save | 4 + .../StoyanCheresharov/exp_bg.txt.c9save | 3 + .../StoyanCheresharov/index.html.c9save | 6 + .../StoyanCheresharov/js/exp.js.c9save | 26 ++ .../StoyanCheresharov/js/exp_bg.js.c9save | 52 +++ StoyanCheresharov/css/exp.css | 12 + StoyanCheresharov/css/exp_bg.css | 3 + StoyanCheresharov/exp.txt | 1 + StoyanCheresharov/exp_bg.html | 12 + StoyanCheresharov/exp_bg.txt | 1 + StoyanCheresharov/index.html | 17 + StoyanCheresharov/js/exp.js | 301 ++++++++++++++++++ StoyanCheresharov/js/exp_bg.js | 171 ++++++++++ 15 files changed, 612 insertions(+) create mode 100644 .c9revisions/StoyanCheresharov/css/exp.css.c9save create mode 100644 .c9revisions/StoyanCheresharov/css/exp_bg.css.c9save create mode 100644 .c9revisions/StoyanCheresharov/exp_bg.html.c9save create mode 100644 .c9revisions/StoyanCheresharov/exp_bg.txt.c9save create mode 100644 .c9revisions/StoyanCheresharov/index.html.c9save create mode 100644 .c9revisions/StoyanCheresharov/js/exp.js.c9save create mode 100644 .c9revisions/StoyanCheresharov/js/exp_bg.js.c9save create mode 100644 StoyanCheresharov/css/exp.css create mode 100644 StoyanCheresharov/css/exp_bg.css create mode 100644 StoyanCheresharov/exp.txt create mode 100644 StoyanCheresharov/exp_bg.html create mode 100644 StoyanCheresharov/exp_bg.txt create mode 100644 StoyanCheresharov/index.html create mode 100644 StoyanCheresharov/js/exp.js create mode 100644 StoyanCheresharov/js/exp_bg.js diff --git a/.c9revisions/StoyanCheresharov/css/exp.css.c9save b/.c9revisions/StoyanCheresharov/css/exp.css.c9save new file mode 100644 index 00000000..1c0f312c --- /dev/null +++ b/.c9revisions/StoyanCheresharov/css/exp.css.c9save @@ -0,0 +1,2 @@ +{"ts":1361703623298,"silentsave":true,"restoring":false,"patch":[[]],"length":0} +{"contributors":[],"silentsave":false,"ts":1361703643427,"patch":[[{"diffs":[[1,"h1 {\n color: red; \n}"]],"start1":0,"start2":0,"length1":0,"length2":26}]],"length":26,"saved":false} diff --git a/.c9revisions/StoyanCheresharov/css/exp_bg.css.c9save b/.c9revisions/StoyanCheresharov/css/exp_bg.css.c9save new file mode 100644 index 00000000..7493f4f6 --- /dev/null +++ b/.c9revisions/StoyanCheresharov/css/exp_bg.css.c9save @@ -0,0 +1 @@ +{"ts":1361520632903,"silentsave":true,"restoring":false,"patch":[[]],"length":0} diff --git a/.c9revisions/StoyanCheresharov/exp_bg.html.c9save b/.c9revisions/StoyanCheresharov/exp_bg.html.c9save new file mode 100644 index 00000000..90f4760e --- /dev/null +++ b/.c9revisions/StoyanCheresharov/exp_bg.html.c9save @@ -0,0 +1,4 @@ +{"ts":1361520348700,"silentsave":true,"restoring":false,"patch":[[]],"length":0} +{"contributors":[],"silentsave":false,"ts":1361520420246,"patch":[[{"diffs":[[1,"\n\n \n Exp BG\n \n \n

Exp BG

\n \n"]],"start1":0,"start2":0,"length1":0,"length2":130}]],"length":130,"saved":false} +{"ts":1361520615381,"patch":[[{"diffs":[[0,"/title>\n"],[1," \n"],[0," \n"],[1," \n"],[0," This is a title

"],[0,"This tex"]],"start1":0,"start2":0,"length1":8,"length2":35},{"diffs":[[0,"e server"],[1,"

"]],"start1":50,"start2":50,"length1":8,"length2":12}]],"length":62,"saved":false} diff --git a/.c9revisions/StoyanCheresharov/index.html.c9save b/.c9revisions/StoyanCheresharov/index.html.c9save new file mode 100644 index 00000000..0763d7fa --- /dev/null +++ b/.c9revisions/StoyanCheresharov/index.html.c9save @@ -0,0 +1,6 @@ +{"ts":1360862909416,"silentsave":true,"restoring":false,"patch":[[]],"length":0} +{"contributors":[],"silentsave":false,"ts":1360863042611,"patch":[[{"diffs":[[1,"\n\n \n JS experiments\n + + +

Exp BG

+
Test
+ + \ No newline at end of file diff --git a/StoyanCheresharov/exp_bg.txt b/StoyanCheresharov/exp_bg.txt new file mode 100644 index 00000000..56d32f5b --- /dev/null +++ b/StoyanCheresharov/exp_bg.txt @@ -0,0 +1 @@ +

This is a title

This text comes from the server

\ No newline at end of file diff --git a/StoyanCheresharov/index.html b/StoyanCheresharov/index.html new file mode 100644 index 00000000..760428c1 --- /dev/null +++ b/StoyanCheresharov/index.html @@ -0,0 +1,17 @@ + + + + JS experiments + + + + +

Exp

+

Test

+
+
Subtitle
+

This is my test

+
+

This is my test

+ + \ No newline at end of file diff --git a/StoyanCheresharov/js/exp.js b/StoyanCheresharov/js/exp.js new file mode 100644 index 00000000..f635e50f --- /dev/null +++ b/StoyanCheresharov/js/exp.js @@ -0,0 +1,301 @@ +/* +(function(){ + window.onload = function(e){ + var elements, i=0; + elements = document.getElementsByTagName('h1'); + for (i=0; i < elements.length; i++) { + alert(elements[i]); + elements[i].style.color = 'red'; + } + }; +})(); +*/ + +/* +alert(typeof myExample); +alert(myExample instanceof Object); +myExample.prop1 = 'Roperty 1'; +console.log(myExample.prop1); +var myGlobalFunction = function(param1){ + return param1; +}; + +console.log(myGlobalFunction('Stoyan')); + +function myNextFunction(param1) { + return param1; +} + +alert(myNextFunction(myGlobalFunction)); +*/ +(function(){ +/* + function myExample(parm1) { + var name = 'Stoyan'; + // this.prop1= 'Stoyan'; + alert(name); + alert(this.prop1); + } +*/ +/* + // alert(myExample); + // alert(myExample()); + // alert(new myExample()); + + + function foo() { + // function body goes here + } + + var f = function(x) { return x*x; }; // function literal + + // var myFunction = new Function('arg1', 'arg2', 'return arg1;'); + + alert(myExample.length); + + myExample(); + + myExample.call({prop1: 'Nikola'},1); +*/ +/* + var myObject = {}; + myObject.prop1 = 'Stoyan'; + myObject['prop2'] = 'Cheresharov'; + myObject.method1 = function(arg1, arg2){ alert('Arguments');}; + + + // var myObject = new Object('arg1', 'arg2'); + + alert(myObject.arg1); + // constructor for a class of objects + function MyClass(){ + this.prop1 = 'Stoyan'; + this.method1 = function(arg1, arg2){ alert('Arguments');}; + } +*/ +/* + var obj1 = {}; + obj1.prop1 = 'Stoyan'; + obj1.method1 = function(arg1, arg2){ alert('Arguments');}; + + var obj2 = {}; + obj2.prop1 = 'Stoyan'; + obj2.method1 = function(arg1, arg2){ alert('Arguments');}; +*/ +/* + var obj1 = new MyClass(); + var obj2 = new MyClass(); + + alert(obj1.prop1); + alert(obj2.prop1); + + alert(obj1 instanceof MyClass); +*/ +/* + function MyNewClass(arg1, arg2){ + this.name = 'Stoyan'; + this.family = 'Cheresharov'; + this.method1 = function(){ alert('Do something'); }; // each instance will have a separate copy if this function + } + + MyNewClass.prototype = { + name: 'Nikola', + family: 'Cheresharov' + }; + + MyNewClass.prototype.constructor = MyNewClass; + + // Douglas Crockford prototypel styple + window.object = function(o){ + var F = function(){}; + F.prototype = o; + return new F(); + }; + + var myObject = function(){ + var counter = 1; + return {'counter': counter}; // there is a closure + }(); // !!! execute right at the spot to get the object + +// alert(myExample); +// alert(foo); +*/ +})(); + +(function(){ + + window.onload = function(e){ + + // I Objects +/* + // 1) created as Literal (Expression) + var myObject = {}; + myObject.prop1 = 'Stoyan'; + myObject['prop2'] = 'Cheresharov'; + myObject.method1 = function(arg1, arg2){ alert('Arguments');}; + + }; +*/ +/* + // 2) Created with On eof the Standart Classes Object Class + var myObject = new Object('arg1', 'arg2'); +*/ +/* + // 3) created with a Constructor taht defines a Class of Objects custom class + function MyClass(){ + this.prop1 = 'Stoyan'; + this.method1 = function(arg1, arg2){ alert('Arguments');}; + } + + MyClass.prototype = { + 'prop1': 'Nikola', + 'prop2': 'Cheresharov' // they are in the shadow of prop1 and prop2 of the object + }; + + MyClass.prototype.constructor = MyClass; + + // alert(MyClass.prototype.constructor); + + var myObject = new MyClass(); + // alert(myObject.constructor); + + // Universal Properties and methods + // 1) property + alert('myObject.constructor: ' + myObject.constructor); // property + + // 2) Methods + alert( 'myObject.toString(): ' + myObject.toString() ); // method + + alert( 'myObject.toLocaleString(): ' + myObject.toLocaleString() ); // method + alert( 'myObject.valueOf(): ' + myObject.valueOf() ); // method + alert( 'myObject.hasOwnProperty(prop1): ' + myObject.hasOwnProperty('prop1') ); // method + alert( 'myObject.propertyIsEnumerable(prop1): ' + myObject.propertyIsEnumerable('prop1') ); // method + alert( 'Object.isPrototypeOf( myObject ): ' + Object.isPrototypeOf( myObject ) ); // method +*/ + + // II Functions +/* + // 1) Create statement + function myFunction(arg1, arg2){ + alert('I am here'); + } +*/ +/* + // 2) literal (expression) + var myFunction = function forCallBack(arg1, arg2){ + for (var i = 0 ; 0 < arguments.length; i++) + { + alert(arguments[i]); + } + // arguments.callee(); // recursion self reference + }; +*/ +/* + // 3) with the Function class + var myFunction = new Function('arg1', 'arg2', 'return arg1;'); +*/ + + // III + + // 1) DOM Manipulation +/* + var nodeList = document.getElementsByTagName('div'); + + for (var i=0; i < nodeList.length; i++) + { + alert(nodeList[i]); + } + + var element = document.getElementById('myPi'); + alert(element); + + alert( nodeList[0].parentNode ); + alert( nodeList[0].childNodes[0] ); + alert( nodeList[0].firstChild ); + alert( nodeList[0].lastChild ); + alert( nodeList[0].nextSibling ); + alert( nodeList[0].previousSibling ); + alert( nodeList[0].style.background = 'gray' ); + alert( nodeList[0].innerHTML = 'I am dinamic head' ); + alert( nodeList[0].nodeType ); + alert( nodeList[0].nodeValue ); + alert( nodeList[0].nodeName ); + alert( nodeList[0].getAttribute('class') ); + alert( nodeList[0].setAttribute('class', 'content') ); + + var element = document.createElement('div'); + element.setAttribute('class', 'head'); + element.innerHTML = 'I have been added by JS'; + nodeList[0].appendChild(element); + // nodeList[0].insertBefore(element); +*/ + + // 2) Remouting ther e are 8 variants GET, POST / synchronous, asynchronous / text XML + var xmlhttp; + if (window.XMLHttpRequest) + {// code for IE7+, Firefox, Chrome, Opera, Safari + xmlhttp=new window.XMLHttpRequest(); + } + else if (window.ActiveXObject) + {// code for IE6, IE5 + // xmlhttp = new window.ActiveXObject('Msxml2.XMLHTTP'); + xmlhttp=new window.ActiveXObject("Microsoft.XMLHTTP"); + } + else + { + alert('Your browser doesn\'t support XHR'); + } + + // 2.1) + xmlhttp.open('GET', 'exp.txt', true); + xmlhttp.send(); + // notice instead of direct alert with the xmlhttp.responsetext / XML + xmlhttp.onreadystatechange = function(){ + if (xmlhttp.readyState == 4 && xmlhttp.status == 200) // 404 not founs + { + var responseText = xmlhttp.responseText; + var responseXML = xmlhttp.responseXML; // documentElement is the root element of the document + // var object = eval(responseText); + alert(responseText); + } + }; + + + // 3) Dynamic Behaviour + // 3.1 Get the element + var nodeList = document.getElementsByTagName('div'); + + var element = nodeList[0]; + + + // 3.2 if it is going to be a function literal should be here + var onMouseOver = function(e){ // function literal + // function onMouseOver(e){ // function statement + var event = e || window.event; + var element = event.target || event.srcElement; // currentTarget + alert('The mouse was over me: ' + element.innerHTML); + }; + + + // 3.3 check which DOM 0, 1, 2 is suported + if (element.addEventListener) + { // all aothers + element.addEventListener('mouseover', onMouseOver, false); // capture or not + } + else if (element.attachEvent) + { // MS + element.attachEvent('onmouseover', onMouseOver); + } + else + { // DOM 0 + element.onmouseover = onMouseOver; + } + + var functionToExecute = function() { + alert('10000 miliseconds'); + }; + + var deferer = window.setInterval(functionToExecute, 10000); + } +})(); + diff --git a/StoyanCheresharov/js/exp_bg.js b/StoyanCheresharov/js/exp_bg.js new file mode 100644 index 00000000..043eca77 --- /dev/null +++ b/StoyanCheresharov/js/exp_bg.js @@ -0,0 +1,171 @@ +// alert('hello World'); +// I Objects +// 1) created as Literal (Expression) +/* +var myObject = {}; + +myObject.prop1 = 'Stoyan'; + +myObject['prop2'] = 'Cheresharov'; + +myObject.method1 = function(arg1, arg2){ alert('Arguments ' + this.prop1 + this.prop2);}; + +alert('Hello World ' + myObject.prop1 + myObject['prop2']); + +myObject.method1(); +*/ + +// 2) Created with On eof the Standart Classes Object Class +/* +var myObject = new Object('arg1', 'arg2'); + +myObject.arg1 = 'Stoyan'; + +alert(myObject.arg1); + +*/ + +// 3) created with a Constructor that defines a Class of Objects. custom class +/* +function MyClass(){ + this.prop1 = 'Stoyan'; + this.method1 = function(arg1, arg2){ alert('Arguments');}; +} + +MyClass.prototype = { + 'prop1': 'Nikola', + 'prop2': 'Cheresharov' +}; + +MyClass.prototype.constructor = MyClass; + +var myObject = new MyClass(); + +alert('Hello ' + myObject.prop1); + +var myObject2 = new MyClass(); +alert('Hello ' + myObject2.prop1); +alert('Hello ' + myObject2.prop2); +alert(MyClass.prototype.constructor); +*/ + + +// II Functions +/* +// 1) Create statement +function myFunction(arg1, arg2){ + alert('I m here'); +} +*/ +// myFunction(); +/* +// 2) literal (expression) +var myFunction = function forCallBack(arg1, arg2){ + for (var i = 0 ; 0 < arguments.length; i++) + { + alert(arguments[i]); + } +// argument.callee(); // recursion self reference +}; +*/ +// myFunction('Stoyan'); + +// 3) with the Function class +/* +var myFunction = new Function('arg1', 'arg2', 'return arg1;'); + +alert(myFunction('Stoyan', 'Cheresharov')); +*/ + +// III +// 1) DOM Manipulation +/* +var nodeList = document.getElementsByTagName('div'); +for (var i=0; i < nodeList.length; i++) +{ + alert(nodeList[i]); +} +*/ +window.onload = function(e){ +/* + var element = document.getElementById('myDiv'); + alert(element); +*/ +/* + var nodeList = document.getElementsByTagName('div'); + for (var i=0; i < nodeList.length; i++) + { + alert(nodeList[i]); + nodeList[i].style.color = 'green'; + } + + alert( nodeList[0].parentNode ); + + nodeList[0].innerHTML = 'Hello World from JS'; +*/ + // 2) Remouting ther e are 8 variants GET, POST / synchronous, asynchronous / text XML + var xmlhttp = null; + if (window.XMLHttpRequest) + {// code for IE7+, Firefox, Chrome, Opera, Safari + xmlhttp=new window.XMLHttpRequest(); + } + else if (window.ActiveXObject) + {// code for IE6, IE5 + // xmlhttp = new window.ActiveXObject('Msxml2.XMLHTTP'); + xmlhttp=new window.ActiveXObject("Microsoft.XMLHTTP"); + } + else + { + alert('Your browser doesn\'t support XHR'); + } + + // 2) asynchronous + // 2.1) + xmlhttp.open('GET', 'exp_bg.txt', true); + xmlhttp.send(); + // notice instead of direct alert with the xmlhttp.responsetext / XML + xmlhttp.onreadystatechange = function(){ + if (xmlhttp.readyState == 4 && xmlhttp.status == 200) // 404 not founs + { + var responseText = xmlhttp.responseText; + + var element = document.getElementById('myDiv'); + element.innerHTML = responseText; + + var responseXML = xmlhttp.responseXML; // documentElement is the root element of the document + // var object = eval(responseText); + // alert(responseText); + } + }; + + // 3) Dynamic Behaviour + // 3.1 Get the element + var nodeList = document.getElementsByTagName('div'); + + var element = nodeList[0]; + + // 3.2 if it is going to be a function literal should be here + var onMouseOver = function(e){ // function literal + // function onMouseOver(e){ // function statement + var event = e || window.event; + var element = event.target || event.srcElement; // currentTarget + alert('The mouse was over me: ' + element.innerHTML); + }; + + // 3.3 check which DOM 0, 1, 2 is suported + if (element.addEventListener) + { // all aothers + element.addEventListener('mouseover', onMouseOver, false); // capture or not + } + else if (element.attachEvent) + { // MS + element.attachEvent('onmouseover', onMouseOver); + } + else + { // DOM 0 + element.onmouseover = onMouseOver; + } + + +}; + From 106d4e098cd504c0f1026e19524e5f67365a3b2f Mon Sep 17 00:00:00 2001 From: Stoyan Cheresharov Date: Wed, 27 Feb 2013 18:41:15 +0200 Subject: [PATCH 174/180] Adding layout change in the FmiStudent module --- module/Application/config/module.config.php | 2 +- module/FmiStudent/config/module.config.php | 1 + .../FmiStudent/src/FmiStudent/Controller/IndexController.php | 5 +++++ module/FmiStudent/view/fmi-student/index/student.phtml | 1 + 4 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 module/FmiStudent/view/fmi-student/index/student.phtml diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php index d430dfa4..938869c4 100644 --- a/module/Application/config/module.config.php +++ b/module/Application/config/module.config.php @@ -86,7 +86,7 @@ 'exception_template' => 'error/index', 'template_map' => array( 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', -// 'layout/layout' => __DIR__ . '/../view/layout/student.phtml', + 'layout/student' => __DIR__ . '/../view/layout/student.phtml', 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', // 'application/stoyan/index' => __DIR__ . '/../view/application/stoyan/index.phtml', // <-- Added by me 'error/404' => __DIR__ . '/../view/error/404.phtml', diff --git a/module/FmiStudent/config/module.config.php b/module/FmiStudent/config/module.config.php index b87b9eac..f234d81d 100644 --- a/module/FmiStudent/config/module.config.php +++ b/module/FmiStudent/config/module.config.php @@ -13,6 +13,7 @@ 'type' => 'segment', 'options' => array( 'route' => '/fmi-student[/:action][/:id]', +// 'route' => '/fmi-student[/:controller][/:action]', 'constraints' => array( 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 'id' => '[0-9]+', diff --git a/module/FmiStudent/src/FmiStudent/Controller/IndexController.php b/module/FmiStudent/src/FmiStudent/Controller/IndexController.php index 3d2aa0c2..f861642e 100644 --- a/module/FmiStudent/src/FmiStudent/Controller/IndexController.php +++ b/module/FmiStudent/src/FmiStudent/Controller/IndexController.php @@ -18,4 +18,9 @@ public function indexAction() { return new ViewModel(); } + + public function studentAction() { + $this->layout('layout/student'); // change the layout. DOn't forget to add it in modeule.config.php + return $viewModel; + } } diff --git a/module/FmiStudent/view/fmi-student/index/student.phtml b/module/FmiStudent/view/fmi-student/index/student.phtml new file mode 100644 index 00000000..78374cef --- /dev/null +++ b/module/FmiStudent/view/fmi-student/index/student.phtml @@ -0,0 +1 @@ +

I am in the student.phtml

\ No newline at end of file From 3f5299f6fc7a94fb0dbac02e8c5733062bf87634 Mon Sep 17 00:00:00 2001 From: cheresharov Date: Wed, 27 Feb 2013 17:07:52 +0000 Subject: [PATCH 175/180] Initial commit --- .gitignore | 9 + LICENSE.txt | 27 + README.md | 33 + composer.json | 22 + composer.phar | Bin 0 -> 570295 bytes config/application.config.php | 15 + config/autoload/.gitignore | 2 + config/autoload/README.md | 8 + config/autoload/global.php | 16 + config/autoload/local.php.dist | 16 + data/cache/.gitignore | 2 + init_autoloader.php | 49 + module/Application/Module.php | 39 + module/Application/config/module.config.php | 91 ++ module/Application/language/ar_SY.mo | Bin 0 -> 5526 bytes module/Application/language/ar_SY.po | 184 +++ module/Application/language/cs_CZ.mo | Bin 0 -> 5005 bytes module/Application/language/cs_CZ.po | 153 +++ module/Application/language/de_DE.mo | Bin 0 -> 5126 bytes module/Application/language/de_DE.po | 153 +++ module/Application/language/en_US.mo | Bin 0 -> 545 bytes module/Application/language/en_US.po | 153 +++ module/Application/language/es_ES.mo | Bin 0 -> 5063 bytes module/Application/language/es_ES.po | 111 ++ module/Application/language/fr_CA.mo | Bin 0 -> 5074 bytes module/Application/language/fr_CA.po | 153 +++ module/Application/language/fr_FR.mo | Bin 0 -> 5077 bytes module/Application/language/fr_FR.po | 153 +++ module/Application/language/it_IT.mo | Bin 0 -> 4922 bytes module/Application/language/it_IT.po | 154 +++ module/Application/language/ja_JP.mo | Bin 0 -> 5185 bytes module/Application/language/ja_JP.po | 140 +++ module/Application/language/nl_NL.mo | Bin 0 -> 4815 bytes module/Application/language/nl_NL.po | 153 +++ module/Application/language/pl_PL.mo | Bin 0 -> 4934 bytes module/Application/language/pl_PL.po | 153 +++ module/Application/language/tr_TR.mo | Bin 0 -> 4785 bytes module/Application/language/tr_TR.po | 153 +++ .../Controller/IndexController.php | 21 + .../view/application/index/index.phtml | 26 + module/Application/view/error/404.phtml | 61 + module/Application/view/error/index.phtml | 62 + module/Application/view/layout/layout.phtml | 57 + public/.htaccess | 7 + public/css/bootstrap-responsive.min.css | 3 + public/css/bootstrap.min.css | 610 +++++++++ public/css/style.css | 37 + public/images/favicon.ico | Bin 0 -> 1406 bytes public/images/zf2-logo.png | Bin 0 -> 738 bytes public/index.php | 12 + public/js/html5.js | 4 + public/js/jquery-1.7.2.min.js | 4 + vendor/.gitignore | 5 + vendor/README.md | 1 + vendor/doctrine/common/.gitignore | 4 + vendor/doctrine/common/.gitmodules | 3 + vendor/doctrine/common/.travis.yml | 5 + vendor/doctrine/common/LICENSE | 504 ++++++++ vendor/doctrine/common/README.md | 12 + vendor/doctrine/common/UPGRADE_TO_2_1 | 39 + vendor/doctrine/common/UPGRADE_TO_2_2 | 61 + vendor/doctrine/common/build.properties | 6 + vendor/doctrine/common/build.xml | 59 + vendor/doctrine/common/composer.json | 21 + .../Common/Annotations/Annotation.php | 75 ++ .../Annotations/Annotation/Attribute.php | 47 + .../Annotations/Annotation/Attributes.php | 37 + .../Annotation/IgnoreAnnotation.php | 44 + .../Annotations/Annotation/Required.php | 33 + .../Common/Annotations/Annotation/Target.php | 105 ++ .../Annotations/AnnotationException.php | 111 ++ .../Common/Annotations/AnnotationReader.php | 303 +++++ .../Common/Annotations/AnnotationRegistry.php | 129 ++ .../Common/Annotations/CachedReader.php | 179 +++ .../Doctrine/Common/Annotations/DocLexer.php | 140 +++ .../Doctrine/Common/Annotations/DocParser.php | 891 +++++++++++++ .../Common/Annotations/FileCacheReader.php | 209 +++ .../Common/Annotations/IndexedReader.php | 94 ++ .../Doctrine/Common/Annotations/PhpParser.php | 203 +++ .../Doctrine/Common/Annotations/Reader.php | 35 + .../Annotations/SimpleAnnotationReader.php | 152 +++ .../lib/Doctrine/Common/Cache/ApcCache.php | 97 ++ .../lib/Doctrine/Common/Cache/ArrayCache.php | 96 ++ .../lib/Doctrine/Common/Cache/Cache.php | 102 ++ .../Doctrine/Common/Cache/CacheProvider.php | 188 +++ .../Doctrine/Common/Cache/MemcacheCache.php | 121 ++ .../Doctrine/Common/Cache/MemcachedCache.php | 124 ++ .../Doctrine/Common/Cache/WinCacheCache.php | 92 ++ .../lib/Doctrine/Common/Cache/XcacheCache.php | 110 ++ .../Doctrine/Common/Cache/ZendDataCache.php | 84 ++ .../lib/Doctrine/Common/ClassLoader.php | 262 ++++ .../Common/Collections/ArrayCollection.php | 447 +++++++ .../Common/Collections/Collection.php | 243 ++++ .../lib/Doctrine/Common/CommonException.php | 28 + .../common/lib/Doctrine/Common/Comparable.php | 47 + .../common/lib/Doctrine/Common/EventArgs.php | 69 + .../lib/Doctrine/Common/EventManager.php | 136 ++ .../lib/Doctrine/Common/EventSubscriber.php | 45 + .../common/lib/Doctrine/Common/Lexer.php | 266 ++++ .../Doctrine/Common/NotifyPropertyChanged.php | 45 + .../Persistence/AbstractManagerRegistry.php | 224 ++++ .../Common/Persistence/ConnectionRegistry.php | 63 + .../Persistence/Event/LifecycleEventArgs.php | 77 ++ .../Event/LoadClassMetadataEventArgs.php | 76 ++ .../Persistence/Event/ManagerEventArgs.php | 59 + .../Persistence/Event/OnClearEventArgs.php | 84 ++ .../Persistence/Event/PreUpdateEventArgs.php | 129 ++ .../Common/Persistence/ManagerRegistry.php | 112 ++ .../Mapping/AbstractClassMetadataFactory.php | 359 ++++++ .../Persistence/Mapping/ClassMetadata.php | 165 +++ .../Mapping/ClassMetadataFactory.php | 74 ++ .../Mapping/Driver/AnnotationDriver.php | 214 ++++ .../Mapping/Driver/DefaultFileLocator.php | 169 +++ .../Persistence/Mapping/Driver/FileDriver.php | 178 +++ .../Mapping/Driver/FileLocator.php | 69 + .../Mapping/Driver/MappingDriver.php | 56 + .../Mapping/Driver/MappingDriverChain.php | 125 ++ .../Persistence/Mapping/Driver/PHPDriver.php | 70 ++ .../Mapping/Driver/StaticPHPDriver.php | 131 ++ .../Mapping/Driver/SymfonyFileLocator.php | 198 +++ .../Persistence/Mapping/MappingException.php | 57 + .../Persistence/Mapping/ReflectionService.php | 80 ++ .../Mapping/RuntimeReflectionService.php | 102 ++ .../Mapping/StaticReflectionService.php | 107 ++ .../Common/Persistence/ObjectManager.php | 143 +++ .../Common/Persistence/ObjectManagerAware.php | 49 + .../Common/Persistence/ObjectRepository.php | 78 ++ .../Common/Persistence/PersistentObject.php | 233 ++++ .../lib/Doctrine/Common/Persistence/Proxy.php | 60 + .../Common/PropertyChangedListener.php | 48 + .../lib/Doctrine/Common/Util/ClassUtils.php | 103 ++ .../common/lib/Doctrine/Common/Util/Debug.php | 123 ++ .../lib/Doctrine/Common/Util/Inflector.php | 72 ++ .../common/lib/Doctrine/Common/Version.php | 55 + vendor/doctrine/common/phpunit.xml.dist | 31 + vendor/doctrine/common/tests/.gitignore | 3 + .../Common/Annotations/AbstractReaderTest.php | 538 ++++++++ .../Annotations/AnnotationReaderTest.php | 13 + .../Common/Annotations/CachedReaderTest.php | 56 + .../Tests/Common/Annotations/DocLexerTest.php | 27 + .../Common/Annotations/DocParserTest.php | 1118 +++++++++++++++++ .../Annotations/FileCacheReaderTest.php | 40 + .../Annotation/AnnotWithDefaultValue.php | 10 + .../Fixtures/Annotation/Autoload.php | 10 + .../Annotations/Fixtures/Annotation/Route.php | 11 + .../Fixtures/Annotation/Secure.php | 18 + .../Fixtures/Annotation/Template.php | 14 + .../Fixtures/Annotation/Version.php | 11 + .../Fixtures/AnnotationTargetAll.php | 14 + .../Fixtures/AnnotationTargetAnnotation.php | 14 + .../Fixtures/AnnotationTargetClass.php | 15 + .../Fixtures/AnnotationTargetMethod.php | 15 + .../AnnotationTargetPropertyMethod.php | 14 + .../Fixtures/AnnotationWithAttributes.php | 119 ++ .../AnnotationWithRequiredAttributes.php | 50 + ...ithRequiredAttributesWithoutContructor.php | 24 + .../AnnotationWithTargetSyntaxError.php | 11 + .../Fixtures/AnnotationWithVarType.php | 62 + .../Annotations/Fixtures/ClassDDC1660.php | 30 + ...assWithAnnotationWithTargetSyntaxError.php | 21 + .../ClassWithAnnotationWithVarType.php | 31 + .../ClassWithFullyQualifiedUseStatements.php | 11 + ...lassWithInvalidAnnotationTargetAtClass.php | 17 + ...assWithInvalidAnnotationTargetAtMethod.php | 20 + ...sWithInvalidAnnotationTargetAtProperty.php | 24 + .../ClassWithValidAnnotationTarget.php | 41 + .../Annotations/Fixtures/Controller.php | 300 +++++ ...erentNamespacesPerFileWithClassAsFirst.php | 15 + ...ferentNamespacesPerFileWithClassAsLast.php | 15 + ...EqualNamespacesPerFileWithClassAsFirst.php | 13 + .../EqualNamespacesPerFileWithClassAsLast.php | 12 + ...lobalNamespacesPerFileWithClassAsFirst.php | 12 + ...GlobalNamespacesPerFileWithClassAsLast.php | 12 + .../InvalidAnnotationUsageButIgnoredClass.php | 14 + .../Fixtures/InvalidAnnotationUsageClass.php | 10 + .../Fixtures/MultipleClassesInFile.php | 9 + .../MultipleImportsInUseStatement.php | 10 + .../NamespaceAndClassCommentedOut.php | 20 + .../NamespaceWithClosureDeclaration.php | 15 + .../Fixtures/NamespacedSingleClassLOC1000.php | 1009 +++++++++++++++ .../Annotations/Fixtures/NoAnnotation.php | 5 + .../Fixtures/NonNamespacedClass.php | 10 + .../Fixtures/SingleClassLOC1000.php | 1006 +++++++++++++++ .../Annotations/Fixtures/TestInterface.php | 13 + .../Common/Annotations/PerformanceTest.php | 194 +++ .../Common/Annotations/PhpParserTest.php | 179 +++ .../SimpleAnnotationReaderTest.php | 97 ++ .../Common/Annotations/Ticket/DCOM55Test.php | 65 + .../Annotations/Ticket/DCOM58Entity.php | 8 + .../Common/Annotations/Ticket/DCOM58Test.php | 112 ++ .../Common/Annotations/TopLevelAnnotation.php | 8 + .../Tests/Common/Cache/ApcCacheTest.php | 20 + .../Tests/Common/Cache/ArrayCacheTest.php | 13 + .../Doctrine/Tests/Common/Cache/CacheTest.php | 87 ++ .../Tests/Common/Cache/MemcacheCacheTest.php | 38 + .../Tests/Common/Cache/MemcachedCacheTest.php | 40 + .../Tests/Common/Cache/WinCacheCacheTest.php | 20 + .../Tests/Common/Cache/XcacheCacheTest.php | 20 + .../Tests/Common/Cache/ZendDataCacheTest.php | 20 + .../Doctrine/Tests/Common/ClassLoaderTest.php | 45 + .../Common/ClassLoaderTest/ClassA.class.php | 6 + .../Common/ClassLoaderTest/ClassB.class.php | 6 + .../Common/ClassLoaderTest/ClassC.class.php | 6 + .../Tests/Common/ClassLoaderTest/ClassD.php | 5 + .../Common/Collections/CollectionTest.php | 195 +++ .../Tests/Common/DoctrineExceptionTest.php | 0 .../Tests/Common/EventManagerTest.php | 88 ++ .../Persistence/Mapping/ChainDriverTest.php | 94 ++ .../Mapping/ClassMetadataFactoryTest.php | 134 ++ .../Mapping/DefaultFileLocatorTest.php | 90 ++ .../Persistence/Mapping/FileDriverTest.php | 142 +++ .../Persistence/Mapping/PHPDriverTest.php | 18 + .../Mapping/RuntimeReflectionServiceTest.php | 70 ++ .../Mapping/StaticPHPDriverTest.php | 35 + .../Mapping/StaticReflectionServiceTest.php | 70 ++ .../Mapping/SymfonyFileLocatorTest.php | 88 ++ .../Persistence/Mapping/_files/TestEntity.php | 3 + .../Persistence/Mapping/_files/global.yml | 1 + .../Persistence/Mapping/_files/stdClass.yml | 1 + .../Persistence/PersistentObjectTest.php | 247 ++++ .../Tests/Common/Util/ClassUtilsTest.php | 100 ++ .../Doctrine/Tests/Common/Util/DebugTest.php | 27 + .../tests/Doctrine/Tests/DoctrineTestCase.php | 10 + .../common/tests/Doctrine/Tests/TestInit.php | 31 + .../common/tests/NativePhpunitTask.php | 246 ++++ vendor/doctrine/common/tests/README.markdown | 27 + 226 files changed, 20736 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 composer.json create mode 100644 composer.phar create mode 100644 config/application.config.php create mode 100644 config/autoload/.gitignore create mode 100644 config/autoload/README.md create mode 100644 config/autoload/global.php create mode 100644 config/autoload/local.php.dist create mode 100644 data/cache/.gitignore create mode 100644 init_autoloader.php create mode 100644 module/Application/Module.php create mode 100644 module/Application/config/module.config.php create mode 100644 module/Application/language/ar_SY.mo create mode 100644 module/Application/language/ar_SY.po create mode 100644 module/Application/language/cs_CZ.mo create mode 100644 module/Application/language/cs_CZ.po create mode 100644 module/Application/language/de_DE.mo create mode 100644 module/Application/language/de_DE.po create mode 100644 module/Application/language/en_US.mo create mode 100644 module/Application/language/en_US.po create mode 100644 module/Application/language/es_ES.mo create mode 100644 module/Application/language/es_ES.po create mode 100644 module/Application/language/fr_CA.mo create mode 100644 module/Application/language/fr_CA.po create mode 100644 module/Application/language/fr_FR.mo create mode 100644 module/Application/language/fr_FR.po create mode 100644 module/Application/language/it_IT.mo create mode 100644 module/Application/language/it_IT.po create mode 100644 module/Application/language/ja_JP.mo create mode 100644 module/Application/language/ja_JP.po create mode 100644 module/Application/language/nl_NL.mo create mode 100644 module/Application/language/nl_NL.po create mode 100644 module/Application/language/pl_PL.mo create mode 100644 module/Application/language/pl_PL.po create mode 100644 module/Application/language/tr_TR.mo create mode 100644 module/Application/language/tr_TR.po create mode 100644 module/Application/src/Application/Controller/IndexController.php create mode 100644 module/Application/view/application/index/index.phtml create mode 100644 module/Application/view/error/404.phtml create mode 100644 module/Application/view/error/index.phtml create mode 100644 module/Application/view/layout/layout.phtml create mode 100644 public/.htaccess create mode 100644 public/css/bootstrap-responsive.min.css create mode 100644 public/css/bootstrap.min.css create mode 100644 public/css/style.css create mode 100644 public/images/favicon.ico create mode 100644 public/images/zf2-logo.png create mode 100644 public/index.php create mode 100644 public/js/html5.js create mode 100644 public/js/jquery-1.7.2.min.js create mode 100644 vendor/.gitignore create mode 100644 vendor/README.md create mode 100644 vendor/doctrine/common/.gitignore create mode 100644 vendor/doctrine/common/.gitmodules create mode 100644 vendor/doctrine/common/.travis.yml create mode 100644 vendor/doctrine/common/LICENSE create mode 100644 vendor/doctrine/common/README.md create mode 100644 vendor/doctrine/common/UPGRADE_TO_2_1 create mode 100644 vendor/doctrine/common/UPGRADE_TO_2_2 create mode 100644 vendor/doctrine/common/build.properties create mode 100644 vendor/doctrine/common/build.xml create mode 100644 vendor/doctrine/common/composer.json create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/CommonException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Comparable.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventManager.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Lexer.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Version.php create mode 100644 vendor/doctrine/common/phpunit.xml.dist create mode 100644 vendor/doctrine/common/tests/.gitignore create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/CachedReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Autoload.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Route.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Secure.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetAll.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetPropertyMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithAttributes.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithTargetSyntaxError.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithVarType.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithAnnotationWithTargetSyntaxError.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithAnnotationWithVarType.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithFullyQualifiedUseStatements.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtProperty.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithValidAnnotationTarget.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Controller.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/EqualNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/EqualNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/GlobalNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/GlobalNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/InvalidAnnotationUsageButIgnoredClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/InvalidAnnotationUsageClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/MultipleClassesInFile.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/MultipleImportsInUseStatement.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespaceAndClassCommentedOut.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespaceWithClosureDeclaration.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespacedSingleClassLOC1000.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NonNamespacedClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/SingleClassLOC1000.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PerformanceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Test.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/CacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassB.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassC.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassD.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/CollectionTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/TestInit.php create mode 100644 vendor/doctrine/common/tests/NativePhpunitTask.php create mode 100644 vendor/doctrine/common/tests/README.markdown diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..ad907fa5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +nbproject +._* +.~lock.* +.buildpath +.DS_Store +.idea +.project +.settings +composer.lock diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..36e97601 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,27 @@ +Copyright (c) 2005-2012, Zend Technologies USA, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Zend Technologies USA, Inc. nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..4e7d164a --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +ZendSkeletonApplication +======================= + +Introduction +------------ +This is a simple, skeleton application using the ZF2 MVC layer and module +systems. This application is meant to be used as a starting place for those +looking to get their feet wet with ZF2. + + +Installation +------------ + +Using Composer (recommended) +---------------------------- +The recommended way to get a working copy of this project is to clone the repository +and use composer to install dependencies: + + cd my/project/dir + git clone git://github.com/zendframework/ZendSkeletonApplication.git + cd ZendSkeletonApplication + php composer.phar install + +Using Git submodules +-------------------- +Alternatively, you can install using native git submodules: + + git clone git://github.com/zendframework/ZendSkeletonApplication.git --recursive + +Virtual Host +------------ +Afterwards, set up a virtual host to point to the public/ directory of the +project and you should be ready to go! diff --git a/composer.json b/composer.json new file mode 100644 index 00000000..b70734ed --- /dev/null +++ b/composer.json @@ -0,0 +1,22 @@ +{ + "name": "zendframework/skeleton-application", + "description": "Skeleton Application for ZF2", + "license": "BSD-3-Clause", + "keywords": [ + "framework", + "zf2" + ], + "homepage": "http://framework.zend.com/", + "repositories": [ + { + "type": "composer", + "url": "http://packages.zendframework.com/" + } + ], + "require": { + "php": ">=5.3.3", + "zendframework/zendframework": "2.*", + "zendframework/zendservice-recaptcha": "2.*", + "doctrine/common": ">=2.1" + } +} diff --git a/composer.phar b/composer.phar new file mode 100644 index 0000000000000000000000000000000000000000..48edaa6149f3581df05a06f283f27ad50ff879de GIT binary patch literal 570295 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 literal 0 HcmV?d00001 diff --git a/config/application.config.php b/config/application.config.php new file mode 100644 index 00000000..6504dea7 --- /dev/null +++ b/config/application.config.php @@ -0,0 +1,15 @@ + array( + 'Application', + ), + 'module_listener_options' => array( + 'config_glob_paths' => array( + 'config/autoload/{,*.}{global,local}.php', + ), + 'module_paths' => array( + './module', + './vendor', + ), + ), +); diff --git a/config/autoload/.gitignore b/config/autoload/.gitignore new file mode 100644 index 00000000..1a83fda6 --- /dev/null +++ b/config/autoload/.gitignore @@ -0,0 +1,2 @@ +local.php +*.local.php diff --git a/config/autoload/README.md b/config/autoload/README.md new file mode 100644 index 00000000..4e504db0 --- /dev/null +++ b/config/autoload/README.md @@ -0,0 +1,8 @@ +About this directory: +===================== + +By default, this application is configured to load all configs in +`./config/autoload/{,*.}{global,local}.php`. Doing this provides a +location for a developer to drop in configuration override files provided by +modules, as well as cleanly provide individual, application-wide config files +for things like database connections, etc. diff --git a/config/autoload/global.php b/config/autoload/global.php new file mode 100644 index 00000000..1473720f --- /dev/null +++ b/config/autoload/global.php @@ -0,0 +1,16 @@ +add('Zend', $zf2Path . '/Zend'); + } else { + include $zf2Path . '/Zend/Loader/AutoloaderFactory.php'; + Zend\Loader\AutoloaderFactory::factory(array( + 'Zend\Loader\StandardAutoloader' => array( + 'autoregister_zf' => true + ) + )); + } +} + +if (!class_exists('Zend\Loader\AutoloaderFactory')) { + throw new RuntimeException('Unable to load ZF2. Run `php composer.phar install` or define a ZF2_PATH environment variable.'); +} diff --git a/module/Application/Module.php b/module/Application/Module.php new file mode 100644 index 00000000..86d9d4e2 --- /dev/null +++ b/module/Application/Module.php @@ -0,0 +1,39 @@ +getApplication()->getServiceManager()->get('translator'); + $eventManager = $e->getApplication()->getEventManager(); + $moduleRouteListener = new ModuleRouteListener(); + $moduleRouteListener->attach($eventManager); + } + + public function getConfig() + { + return include __DIR__ . '/config/module.config.php'; + } + + public function getAutoloaderConfig() + { + return array( + 'Zend\Loader\StandardAutoloader' => array( + 'namespaces' => array( + __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, + ), + ), + ); + } +} diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php new file mode 100644 index 00000000..a6dd62b8 --- /dev/null +++ b/module/Application/config/module.config.php @@ -0,0 +1,91 @@ + array( + 'routes' => array( + 'home' => array( + 'type' => 'Zend\Mvc\Router\Http\Literal', + 'options' => array( + 'route' => '/', + 'defaults' => array( + 'controller' => 'Application\Controller\Index', + 'action' => 'index', + ), + ), + ), + // The following is a route to simplify getting started creating + // new controllers and actions without needing to create a new + // module. Simply drop new controllers in, and you can access them + // using the path /application/:controller/:action + 'application' => array( + 'type' => 'Literal', + 'options' => array( + 'route' => '/application', + 'defaults' => array( + '__NAMESPACE__' => 'Application\Controller', + 'controller' => 'Index', + 'action' => 'index', + ), + ), + 'may_terminate' => true, + 'child_routes' => array( + 'default' => array( + 'type' => 'Segment', + 'options' => array( + 'route' => '/[:controller[/:action]]', + 'constraints' => array( + 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', + 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', + ), + 'defaults' => array( + ), + ), + ), + ), + ), + ), + ), + 'service_manager' => array( + 'factories' => array( + 'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory', + ), + ), + 'translator' => array( + 'locale' => 'en_US', + 'translation_file_patterns' => array( + array( + 'type' => 'gettext', + 'base_dir' => __DIR__ . '/../language', + 'pattern' => '%s.mo', + ), + ), + ), + 'controllers' => array( + 'invokables' => array( + 'Application\Controller\Index' => 'Application\Controller\IndexController' + ), + ), + 'view_manager' => array( + 'display_not_found_reason' => true, + 'display_exceptions' => true, + 'doctype' => 'HTML5', + 'not_found_template' => 'error/404', + 'exception_template' => 'error/index', + 'template_map' => array( + 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', + 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', + 'error/404' => __DIR__ . '/../view/error/404.phtml', + 'error/index' => __DIR__ . '/../view/error/index.phtml', + ), + 'template_path_stack' => array( + __DIR__ . '/../view', + ), + ), +); diff --git a/module/Application/language/ar_SY.mo b/module/Application/language/ar_SY.mo new file mode 100644 index 0000000000000000000000000000000000000000..fa7ae166939da5c016a79122da666e4ff85e3cf8 GIT binary patch literal 5526 zcmb7|%X1u86~-?l1dzik51s+80fkWU46^K$!#F0$mJ}Q8pt8mZ32b_1u4X#w>7MjM ziYSUIzhp%eVFQ0aFp9=1+p@47$0-)D;jw{Y0oA?9jtx~TS+D_q=XTFS!XYrFo-^I| z+;hHj&Ueo3(p&f4{S(DUb3G*2yOerVhL))ZdT~ zAxGr?Zlykqd=UA5PLLt4~8Ej-^+dXJ-Od& z$PaS=8>HC#Gg5H<6}b!fFQj7Mu6vXk=jXj_K7o7^Sw{X4`2_M8$gd#(ffWDy-j~~- zMV?~+3rO+vOThn=`#&J}bN_psXyje@D)l+!7m$MEDY-}Q+sF@b|NRf-daocQKbuI& z>#vYNQ*RaPe?dx~@4=bi7)O2@c@p_2>~)a*scDiaeoi69j*Aq%Wu(OaGvvpRw~>e0 z_ebQD+&@5)Uqn`slgM8qzmD96vFDJ_ARj?qLrT6fT){cp$t{6MFyHer>`q2z5}eCt+wBYNF9_V>j>}PrLqH5Vjq;Qxl%2L$}$A zBORK^gbSuoRulft-A4ky89H&|*je`= zK*d~HS6gnRqn^dO<7U3SGY*siIQqImZ0L$sT)-#hI-I$C%zlQ>PQO_ z#V$sNlI;vBMQ&`9HpIu!5R)4R;gSuoDV@P@A*67ooij>EZFDCLUNH4oeDy=2P<@8v zNq!=v6}p$5HzM4D~q7J-nr(9WHmj*N!@$dm+hlGb5u&xt6qIe#{`8%j5z9@;$-X@!d!hBghOR*i_8Z{8L?fN7%Mu$AdE_qvQkt91* z#e38EhFK_s@>%0S6Kk4bw|#7lk48$$JTwOM42|u0YNw_YH1Qiu8K*8y(&LznjMp}yAjy2;C*+ci!Q7miFKrKC z(bO#4m@y0x2)f`lOa!C+dGeCCr&t?}7TtMwG}^;2KO3&mcNX1UzUh@wfMwUm?B&OSu`v`&CmAzxOzqS=p!e>pJofmbWBbrM?nH5^8ajSN1VLEQ zRcCR|%Hp$B0@sk+nwd2C*azufVd3kNlA6GkRJbgDXCdVHWKz~)R?n)2&`%<_tU zyynIu-zv=nhPQ{(H_Q@)un`>xD+Y@=%s`=sv!bW`CZne{SUM6UOoXM1KK1mm>eQs3 ztxi;@W(VtsIVx!ARz;Tw4`(@n>a7_bm&RBqkIZ;U=y)ZL({@zRe#hQMhsF=;{O6%Z z{N0E4e(B(dO0T3hvvWGVn%+t;+TPux)Aj5ePfxRUNvCgStLc``&Sxv>Wv4rk{JPNmSQ&+MxteinRy^@{A#v9n!?pXF|m2PAgaK48#?W>z6`L{vwuK8yE%CCQ*_46>AD4*RgP0*i@|d`6kL+>1(9!Iu}G)vsI9k zOGP(`L#Sts3VBzAzPZDmlhZ;Wsn3eu<|!`#rDT(kS||kFyJSQtAmA<+0e3~{u-t=Z$+1ifbOtE;rn%qIJEZtJ@d`tV-n(d%{OTZEEUwcqZ}3eDieQBa zIG{dIMzXe%US=aK<$-uCQr)i))+Hr(ig!(_DPD!cd5x&9FbHQwCRbop(a{6Mc}fM! z8I)fmx&n;wjXGH{qtSo7om#+K!U73gNr1ExBSuPVDGLYtMUW&C>w4Zo^1f>K2{&)y z_SHOop;Q+fm+t)LS_H)WkdVZ0;YZNZhOA4i>`K2|Gyy=|A&w2`!(+ypY_Xk7VzUb} z26`hwI@C@S#;0W>otnOmM!K`@w#^zg-5_}@Id6)o+pGGvcirtXst*UqS8c7pBCP1q zT_VFcgOKkW(<-bY&C)G7tA@(hr_eUIMdFG{)y=1deJF#Wo8Gbs#KA3`t)$(-0a6Sq zAZ=zZ7g}gs&Mw&UlW9EK!3v27c6y_(K;Jjph0LqNJSS2+6oEmL*jTN3duC|@l}D?5 z{~&us71rL)cyZ_nr#EH%4O)(5T(*H0gNsQ2Pa^{Z0z&eXcDHAMVL?G;5!1GZI0U71 z>-m9HoY|s~Pj~r8hV8^`aAa9-ZZKUhW*1Q89P3JR%NZo6=k}Lac?)M, 2012. +# Tawfek Daghistani , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-07 13:58+0300\n" +"Last-Translator: Tawfek Daghistani \n" +"Language-Team: Arabic <>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: English\n" +"X-Poedit-Country: UNITED STATES\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +#: ../view/layout/layout.phtml:6 ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "الصفحة الرئيسية" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "جميع الحقوق محفوظة" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "أهلا بك في %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "" +"Congratulations! You have successfully installed the %sZF2 Skeleton " +"Application%s. You are currently running Zend Framework version %s. This " +"skeleton can serve as a simple starting point for you to begin building your " +"application on ZF2." +msgstr "" +"تهانينا! لقد قمت بتنصيب %sZF2 Skeleton Application%s . أنت الآن تستخدم مكتبة " +"زيند الإصدار %s . هذا التطبيق يمكن أن يكون لك نقطة بداية سهلة في بناء " +"برامجك الخاصة على مكتبة زيند " + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "اشتق مكتبة زيند على GitHub " + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "تابع أخر التطورات" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "" +"Zend Framework 2 is under active development. If you are interested in " +"following the development of ZF2, there is a special ZF2 portal on the " +"official Zend Framework website which provides links to the ZF2 %swiki%s, " +"%sdev blog%s, %sissue tracker%s, and much more. This is a great resource for " +"staying up to date with the latest developments!" +msgstr "" +"مكتبة زيند تخضع للتطوير المستمر , إذا كان لديك الرغبة في متابعة التطورات , " +"بإمكانك تصفح الموقع الرسمي للمكتبة الذي يحتوي على روابط إلى %swiki%s, %sdev " +"blog%s, %sissue tracker%s, ,و المزيد . هذه مصادر رائعة لمتابعة أخر التطورات" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "بوابة التطوير الخاصة ب زيند" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "تعرف على الإضافات" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "" +"The community is working on developing a community site to serve as a " +"repository and gallery for ZF2 modules. The project is available %son GitHub" +"%s. The site is currently live and currently contains a list of some of the " +"modules already available for ZF2." +msgstr "" +"المجتمع البرمجي يعمل على تطوير موقع خاص به ليكون كمصدر و معرض لإضافات ZF2 . " +"هذا المشروع موجود على %son GitHub%s . هذا الموقع يخضع للتطوير المستمر و " +"يحتوي على قائمة من الإضافات الخاصة ب ZF2 " + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "إكتشف إضافات ZF2 " + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "الدعم و المساعدة " + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "" +"If you need any help or support while developing with ZF2, you may reach us " +"via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or " +"feedback you may have regarding the beta releases. Alternatively, you may " +"subscribe and post questions to the %smailing lists%s." +msgstr "" +"إذا كنت تريد الحصول على دعم فني أو مساعدة في تطوير ZF2 , بإمكانك التواصل عبر " +"IRC: %s#zftalk.2 on Freenode%s. نحن نريد أن نسمع منك المزيد من الأسئلة , " +"الأراء و الملاحظات على النسخة التجربية من المكتبة , أو بإمكانك الإشتراك و " +"التفاعل أو وضع الأسئلة في القائمة البريدية %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "تواصل معنا في IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "حصل خطأ ما " + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "مزيد من المعلومات" + +#: ../view/error/index.phtml:11 ../view/error/index.phtml:35 +msgid "File" +msgstr "ملف" + +#: ../view/error/index.phtml:15 ../view/error/index.phtml:39 +msgid "Message" +msgstr "الرسالة" + +#: ../view/error/index.phtml:19 ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "تفاصيل الخطأ" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "الأخطاء السابقة" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "لايوجد خطأ" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "حصل خطأ 404 , الصفحة غير موجودة" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "المتحكم المطلوب غير قادر على إجابة الطلب" + +#: ../view/error/404.phtml:13 +msgid "" +"The requested controller could not be mapped to an existing controller class." +msgstr "لا يمكن ربط المتحكم المطلوب بأي من المتحكمات الموجودة حالياًَ" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "المتحكم المطلوب غير قادر على الإجابة " + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "الرابط المطلوب غير معرف لدى الموجه" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "لا يمكنني التحديد لماذا حصل الخطأ 404 في هذا الوقت " + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "المتحكم " + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "يوصل إلى %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "خطأ برمجي" diff --git a/module/Application/language/cs_CZ.mo b/module/Application/language/cs_CZ.mo new file mode 100644 index 0000000000000000000000000000000000000000..46f2c0f637a83e5aea25000e19c7016663ff5d98 GIT binary patch literal 5005 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 QV;@(@2=$5oVl3(S4+(UTng9R* literal 0 HcmV?d00001 diff --git a/module/Application/language/cs_CZ.po b/module/Application/language/cs_CZ.po new file mode 100644 index 00000000..2485e2d6 --- /dev/null +++ b/module/Application/language/cs_CZ.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-06 13:05+0100\n" +"Last-Translator: David Lukas \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Czech\n" +"X-Poedit-Country: CZECH REPUBLIC\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton aplikace" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Úvod" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Všechna práva vyhrazena." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Vítejte v %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Blahopřejeme! Úspěšně jste nainstalovali %sZF2 Skeleton Application%s. Právě používáte Zend Framework verze %s. Tato kostra aplikace vám poslouží jako jednoduchý výchozí bod, ze kterého můžete vyjít při tvorbě vlastní aplikace nad ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 na GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Sledujte vývoj" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 je aktivně vyvíjen. Chcete-li sledovat vývoj ZF2, máte na oficiálních webových stránkách Zend Framework k dispozici zvláštní portál ZF2, na kterém najdete odkazy na ZF2 %swiki%s, %svývojářský blog%s, %sissue tracker%s a mnoho dalšího. Tento portál je skvělý zdroj aktuálních informací o nejnovějším vývoji!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Vývojářský portál ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Objevte Moduly" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Komunita pracuje na vývoji komunitního webu, který bude sloužit jako archiv a galerie modulů ZF2. Tento projekt je dostupný %sna GitHub%s. Web je aktuálně v provozu a obsahuje seznam některých již dostupných modulů ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Prozkoumejte Moduly ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Pomoc & Podpora" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Budete-li při vývoji se ZF2 potřebovat jakoukoli pomoc nebo podporu, můžete nás zastihnout přes IRC: %s#zftalk.2 na Freenode%s. Budeme rádi za jakékoli vaše otázky nebo připomínky týkající se beta verzí. Případně se také můžete přihlásit k odběru a posílat otázky na naše %se-mailové distribuční seznamy%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Ozvěte se nám na IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Vyskytla se chyba" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Další informace" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Soubor" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Zpráva" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Trasování zásobníku (Stack trace)" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Předchozí výjimky" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Žádná výjimka není k dispozici" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Vyskytla se chyba 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Požadovaný controller nemohl vyřídit požadavek." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Požadovaný controller se nepodařilo namapovat na žádnou existující třídu controlleru." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Požadovaný controller nepodporuje vyřízení (controller not dispatchable)." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "S požadovaným URL nebyla při směrování (routing) nalezena shoda." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Momentálně nedokážeme určit, proč byla vygenerována chyba 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "je mapován na %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Výjimka" + diff --git a/module/Application/language/de_DE.mo b/module/Application/language/de_DE.mo new file mode 100644 index 0000000000000000000000000000000000000000..fcea0366faf48b28a5e7b083f717dc36c6dda9c4 GIT binary patch literal 5126 zcma)3*uf4mr6|b{+*LLC)HQhBcmFejo zs;XzatB4a42M!=15C;Sj%00lr;$U$Zi4zClP7rsH5H}7;{9bj>&UlFvTD$Y6yQ|*c z?|t>=?Gwj-oNztQ|7ZDs`h7|ACFJq<^TG8i@|R5bIEfE$AV0+Y4?kGj{VDP( z?%zU+zTY7~g8VZwVg1|4Rlff9i6q%Zo?vqu`7PuHzG6B0r7%0#aOD zLw*u@38|2GkP^oPDf_>Vd;@(yLE>U^@?-V7=aA2Fe*r0Zd$o}Rl$yDeYb=u$CT2;FPlbcW$YJD`yZ5kDv_U))a zJENk1MPRq9iozB>bs!{ zvUxu>qnNtQ`=h)h010yTcFX1_*|M3tTGdIenS7+q z=;7!kwOfrwr3=Zma%ht4-ROH^NU1LNRbSQ-kgpf1NgsnMt1U@P6C3*C(Q@23)MVA@ zw67|!##XEAx2~*_$S)prsnehxUD$HQ6lG>4zjw_GnaT-R($zPb{9yIlmGKg?7t>vQ z>F9KDXduGCnVxnrt5W%n2^zz>(cYkSJrBkeRGx(F&pq>1$EVJA3`R1l<->v{?AI6? zYMV=Bx%I*0W3mn0bk8I=OLbTbrN=DO9kRb8iwT$H5^b{M%-ELPn_1y}vKz$z;B;z| zJ={&p;jk)f0Ki@e=0pYi7xJnX7I_Q|TQ`Wb$}?4zfjTO9BJJ~{1Cq*0`s(NwaiQ*(qdP|f6a(imi*N)PTvMEl6l! z4S5chyiNKfDe|XS@0r3td%}r#O%6<=YIyBYhFU%C6DjjT$EzKBSm(*nl~T~E$RHG* zNnbgAb;*wAaUjdhF zEW2G>zj`!)iRnbNK__qp03F-Rco0<#$V=UcqV2Sw*nvImm-&Vhs*{(!`p$Y^ksMlT zV4OUXmL67U8^VzdaYyfZATh{c1N){X;t-}8YvpULl^50OSJuwG$oG{M7PfA|C~_hlUH4VBa(?aX`FhB191 z>DJWdm^QdV(EIAb&|EUy(r9kK4XnPgbVC=t3RY|F89l`NEtb+&wo|d$s|yF+76}i$ zymUbA9^Hih+t;@@=fR(CuPn)a0Mgpq9}!G2_rsS*IaKkIqLZ9A;o|MRt=9SZI`Oq@ zTx%1*gvr;``Hl@sueNqd!|c#{+3drOnZH3Nqp%6h%okjS?P=8hnrhD<&H`IgSLruh z%-@g;BHZW2=B@4Zo3G8^>~ip={T)=bR#4VnN;WAqji?O0Aj8d;=|iweSKZ`Z<)?3k z14awba{bZK#;98+?E|NA={lybIfsgNvWb#Lflww&dL}sdpx_*KwI)vHeEKjQOsc}C z{Zne!8s?pj;ZWe)yG=HXPIN0MmsV;9B5PcbwuexQDo{X}#p#SrMp*+{l!9`9WJ=)l z+^`I0UeY&xh`R&$OI`05DABoB1Ou^}o*z}kAS|oy^r7Q5Tre>lAjr)kOl&&HtD?88 zI@;rmbU$HZZ+OI>VsgMKv_CQip(8W2b`cX%Pdmwa;VxRPBMk%~osuEnLVn_dKgQ|n~AW9(6zYG{Q> z{x@VP%k)98(EYL+$cZ{2rDQ2;2LUQ8DJJ0S$}BZ~*ddsV^Wi7GfLp9+q0m^)ZOl_bd_9;xjFHCpF3YIZK&a6%eSp%% zsY?x}4+;T{pg3x*L40Ji!eYq;9s?J!Mzf7?8KlW%ZJ297#P<}*zjQ~kiH zBBvjWDzgRF-NK?>S+WfNbD;!jlB*iFKv8UtIY1-QId+>4i^s@72D3mj&Y?(S&O?f; znUgyahH)+4V$rKt3Jy#Y`yAi;(>L=-SVjqBGD(3xxP+q^ZPN!`3LONng5tViIOnB% z1zAVuhIXWC*z z{JHapDoN?#WcPB;tY&~{&tSTs0{@RX$z&lR3fs7<3nbp%{)Ar~^#(Xvn&1YV5m|D* z=t`GJlaRg!2SjtPlGi?VwGEL3V^LsCX}Mb2aQdL`7j2Xdu=5|GoCSZz1id-QZ3S325l6x zfl%lh9D(^r)QgLxl=\n" +"Language-Team: ZF Contributors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Startseite" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Alle Rechte vorbehalten." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Willkommen zu dem %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Herzlichen Glückwunsch! Sie haben die %sZF2 Skeleton Application%s erfolgreich installiert und benutzen gerade die Version %s des Zend Frameworks. Dieses Gerüst kann Ihnen als Einstiegspunkt, für Ihre weitere Entwicklung, basierend auf dem Zend Framework 2, dienen." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 auf GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Folge der Entwicklung" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Das Zend Framework 2 wird z.Z. aktiv weiterentwickelt. Sollten Sie daran interessiert sein, die Entwicklung von ZF2 zu verfolgen, so bietet Ihnen die offizielle Webseite einen eigens für das Zend Framework 2 eingerichteten Bereich, auf der Sie Verlinkungen zum ZF2 %sWiki%s, %sEntwickler Blog%s, einem %sFehlerverfolgungssystem%s und noch vielem mehr finden. Dieser Bereich ist eine hervorragende Quelle um stets aktuell zu bleiben." + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Entwickler Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Entdecken Sie Module" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Die Community arbeitet momentan an einer Community Seite, welche als Galerie für ZF2 Module dient. Dieses Projekt ist %sauf GitHub%s verfügbar. Die Webseite ist bereits Online und enthält eine Liste mit schon veröffentlichten Modulen für das Zend Framework 2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Erkunden Sie ZF2 Module" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Hilfe & Support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Sollten Sie Hilfe jeglicher Art bei der Entwicklung mit dem Zend Framework 2 benötigen, kontaktieren Sie uns doch einfach über das IRC: %s#zftalk.2 on Freenode%s. Wir freuen uns darauf, Ihnen bei Ihren Fragen zu helfen oder aber auch Ihre Meinung bezüglich der Beta Versionen zu hören. Alternativ können Sie auch die %smailing lists%s abonnieren und Ihre Fragen dort stellen." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Schreiben Sie uns im IRC an" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Ein Fehler ist aufgetreten" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Zusätzliche Information" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Datei" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Meldung" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stapelüberwachung" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Vorherige Ausnahme" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Es ist keine Ausnahme verfügbar" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Es trat ein 404 Fehler auf" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Der angeforderte Controller war nicht in der Lage die Anfrage zu verarbeiten." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Der angeforderte Controller konnte keiner Controller Klasse zugeordnet werden." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Der angeforderte Controller ist nicht aufrufbar." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Für die angeforderte URL konnte keine Übereinstimmung gefunden werden." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Zu diesem Zeitpunkt ist es uns nicht möglich zu bestimmen, warum ein 404 Fehler aufgetreten ist." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "wird aufgelöst in %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Ausnahme" + diff --git a/module/Application/language/en_US.mo b/module/Application/language/en_US.mo new file mode 100644 index 0000000000000000000000000000000000000000..972a28ab34c2f0d90cabf56f0d021c5f205bbc09 GIT binary patch literal 545 zcmaJ+O;5r=5XI=JN6#Mi;L*WCV!(=quaXc!i4ehb)vOfK!O`$uD#=6e|OmacsLHr?6s=z73-+k!ZznDgs*g(XHw}45ig~6 zNSCu{0L@ZYSY4onkZmPOr-5kB6?qRZF_\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: English\n" +"X-Poedit-Country: UNITED STATES\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "" + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "" + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "" + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "" + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "" + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "" + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "" + diff --git a/module/Application/language/es_ES.mo b/module/Application/language/es_ES.mo new file mode 100644 index 0000000000000000000000000000000000000000..3728554767333faa67772174898cf3de1d245970 GIT binary patch literal 5063 zcmai&&5s;M8OAG+@UaO55=@*)yz{h}at&GPZZ|3a_*Bt}$2$siwPjro25} z?XK=w&x!+QB*X>&fJh*bgQZB303jq0djJjyP8@TMgv5~pT;TUs_k8SPk&$QLsp+cs z`+e#ezx~vsKT*6i@8{(Gh*D=nzK1`&{)qe-@=wT*Bj0Y<|3rS2_0oHl`Umnk6?8-$U|G{fIwLCLWcjV*9{~#6T9)F)wt9*Qd!&}I&A-l*QA}=C;gS>$J7gFqh`2&sq9po*} z-$ja@-{Jf_tp9@i1nXa7MB@J|^3%w7kYfL_CzSd(@>!(Bf9gX`UNlnHt4PV~B_t-* z9i*J=BhMlakP^>Nk+`mYg?tUWzeURaC!bVm8TkzI6!H>M{Mc#NcahJt{yy?W&ixE2 zasHVi>>!sY(i!A;k>`;=Kwd%~AwP$Fgkp$)&m$|&_mEP*U*Hr=MVX@?h?p;t518Et&aZX6{pKO&s{#ycWj>Ojna(lfiL&<*p>lTQPBEzG~l$Gcyyvr+1ta^gCmDhbcaJlZ+E=%P(-CI_^vV9VY$jZiOSEdc zv}5O4+iBr~dRR-Uol1hLN|RW%OALu0jq2Q0bal|uh@uyz3&}PMn}Vxi(iZx$w8Z2p zUru6x1DOmyOG8S}jGB&;rnb5${au?>Vrv!(g_?Cp)BH5Im|@d=YBI7K_0PXb=wHJu zG82+D?e}z`n?y=ZTf^F9^hSzv)7(v6>&66>HrAcayLIzAk=9wNb6-(h4R|C&9`tE1 zU(2waJR&YMBXsg)Q3yPET&5&=Cuv>WotZ$9B`0$S7M>q4>f%M}LLpvA&EI8voy#V% zIXx89(5mmM+Z5a6QK_X-M=mF!6?@2Y<;dH?kR(M=73%|=Td+`o^0v)rlc*Z7I}Tf` z%Rxz*7hphdGuS3mCwEFg>pTTzOd>-v?JbEaM(($piRx^ooo_Zb$XZ0;>F_UHM@u)E)UxVq zg@H>um+L|3?D{pmwEfy{=Zbg+_I0jeb4{AWeb-H>I=iLG0}=RgP4`lt?RnkfW*X>=Ca#PuUL6STb?L6JE?qbIpa$_e zyVi^dVnbh%>2m!V9YJ3_-0P6{iifWrQo`oY*5=mwJn(bfl_fbub98nm1%Xude)Xjy z114V4Oi>wZb?MgbM(6x|pZK|F%g%b9c!BmceZKFinL8xtTb*rh;T4^4*a;AshU*M8 zy4wite8XjK0_JtNrn~bmr-7~Mox2YB{YS*WpF6Pa^*<{FvhWU{F@K9~)_pfhQ zsEgxJfRSIUxg0>cO+d4S-3?IF0+PE@~@aN9ttMOqmncLkSeVEfT03 z?BkH(0xpjpkPl0674)NkAyF7?W2iRSz1s0)My60UV}07oO?Ncm zHPPt;N~gboXH#PKMRh%LE_hjL(x!@nHhpt9R5{gSN9G0Rmnq4cw`NxZSS<{-v`(%P zS|iL*a=v?N<7~s3rAekN&W4uRE!4jq!Fk{Lmf}4GUU6RVC=xun&*p#*^=N_N_Ke!G zkICkKdopwAcf0Seg)yR`Y-=!Naz3n literal 0 HcmV?d00001 diff --git a/module/Application/language/es_ES.po b/module/Application/language/es_ES.po new file mode 100644 index 00000000..5170d3ce --- /dev/null +++ b/module/Application/language/es_ES.po @@ -0,0 +1,111 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-06 19:07+0100\n" +"PO-Revision-Date: 2012-07-06 19:09+0100\n" +"Last-Translator: Adolfo Abegg \n" +"Language-Team: ZF Contributors \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: Spanish\n" +"X-Poedit-Country: SPAIN\n" +"X-Poedit-SearchPath-0: ..\n" + +msgid "Skeleton Application" +msgstr "Aplicación Esqueleto" + +msgid "Home" +msgstr "Inicio" + +msgid "All rights reserved." +msgstr "Todos los derechos reservados" + +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenido al %sZend Framework 2%s" + +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "¡Felicitaciones! Haz instalado correctamente el %sla aplicación esqueleto del ZF2%s. Estás corriendo la versión %s del Zend Framework. Este esqueleto te servirá como un punto de inicio sencillo para empezar a construir tu aplicación con el ZF2." + +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Hacer un Fork del Zend Framework 2 en GitHub" + +msgid "Follow Development" +msgstr "Seguir el Desarrollo" + +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "El Zend Framework 2 está en pleno desarrollo. Si estás interesado en seguir el desarrollo del ZF2, existe un portal especial para el ZF2 en el sitio web oficial del Zend Framework el cual provee enlaces %sa la Wiki%s, %sal Blog de desarrollo%s, %sal issue tracker%s y mucho más. Este es un gran recurso para mantenerte al día con los últimos avances en el desarrollo!" + +msgid "ZF2 Development Portal" +msgstr "Portal de Desarrollo del ZF2" + +msgid "Discover Modules" +msgstr "Descubre Módulos" + +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La comunidad está trabajando en el desarrollo de una web comunitaria que servirá de repositorio y galería de los módulos del ZF2. El proyecto está disponible %sen GitHub%s. El sitio web está en línea y actualmente posee una lista de algunos módulos que ya están disponibles para el ZF2." + +msgid "Explore ZF2 Modules" +msgstr "Explora los módulos del ZF2" + +msgid "Help & Support" +msgstr "Ayuda & Soporte" + +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si necesitas alguna ayuda o soporte mientras estás desarrollando con el ZF2, puedes encontrarnos via IRC: %s#zftalk.2 en Freenode%s. Nos encantaría leer tus preguntas o cualquier feedback que puedas tener en relación a los lanzamientos de las versiones beta. También puedes subscribirte y enviar preguntas %sa la lista de correos%s" + +msgid "Ping us on IRC" +msgstr "Escríbenos en el IRC" + +msgid "An error occurred" +msgstr "Ha ocurrido un error" + +msgid "Additional information" +msgstr "Información adicional" + +msgid "File" +msgstr "Archivo" + +msgid "Message" +msgstr "Mensaje" + +msgid "Stack trace" +msgstr "Seguimiento de la pila (stack trace)" + +msgid "Previous exceptions" +msgstr "Excepciones anteriores" + +msgid "No Exception available" +msgstr "No hay ninguna Excepción disponible." + +msgid "A 404 error occurred" +msgstr "Ha ocurrido un error 404" + +msgid "The requested controller was unable to dispatch the request." +msgstr "El controlador solicitado no pudo ejecutar la petición." + +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "El controlador solicitado no se pudo mapear con una clase de controlador existente." + +msgid "The requested controller was not dispatchable." +msgstr "El controlador solicitado no es ejecutable." + +msgid "The requested URL could not be matched by routing." +msgstr "El ruteador no ha encontrado la ruta para la URL solicitada." + +msgid "We cannot determine at this time why a 404 was generated." +msgstr "No pudimos determinar por qué un error 404 ha sido generado." + +msgid "Controller" +msgstr "Controller" + +msgid "resolves to %s" +msgstr "se resuelve a %s" + +msgid "Exception" +msgstr "Excepción" + diff --git a/module/Application/language/fr_CA.mo b/module/Application/language/fr_CA.mo new file mode 100644 index 0000000000000000000000000000000000000000..956a0d9d90577e1c8366e18ddc2efc7397c014ef GIT binary patch literal 5074 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\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: CANADA\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Une erreur 404 est survenue" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Le contrôleur demandé n'a pas pu acheminer la requête." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Le contrôleur demandé ne correspond pas à une classe contrôleur existante." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Le contrôleur demandé ne peut être acheminé." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "L'URL demandée n'a pas pu trouver de route correspondante." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nous ne pouvons pas déterminer pour le moment pourquoi une 404 a été générée." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Contrôleur" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "résout en %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exception" + +#: ../view/error/404.phtml:55 +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +msgid "Stack trace" +msgstr "Pile d'exécution" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Une erreur est survenue" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informations complémentaires" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Fichier" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Message" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Exceptions précédentes" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Aucune exception disponible" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenue dans %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Félicitations ! Vous avez installé %sZF2 Skeleton Application%s avec succès. Vous utilisez actuellement Zend Framework version %s. Cette structure peut vous servir comme point de départ simple pour démarrer la construction de votre application avec ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Faites un Fork de Zend Framework 2 sur GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Suivre le développement" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 est en cours de développement. Si vous êtes intéressé pour suivre l'évolution de ZF2, il existe un portail dédié à ZF2 sur le site officiel Zend Framework qui propose des liens vers le %swiki%s ZF2, le %sblogue de dev%s, le %ssuivi des problèmes%s, et bien plus encore. Il s'agit d'une excellente ressource pour rester à jour sur les dernières évolutions !" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portail sur le développement de ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Découvrez les modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La communauté travaille sur le développement d'un site communautaire avec l'objectif de servir de dépôt et de galerie pour les modules ZF2. Le projet est disponible %ssur GitHub%s. Le site est déjà en ligne, et contient une liste non exhaustive des modules déjà disponibles pour ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Explorer les modules ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aide & support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si vous avez besoin d'aide ou de soutient en développant avec ZF2, vous pouvez nous joindre sur IRC : %s#zftalk.2 sur Freenode%s. Nous aimerions connaître vos questions ou les commentaires que vous pourriez avoir au sujet des versions beta. Sinon, vous pouvez vous abonner, et poser des questions sur la %sliste de diffusion%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Rejoignez-nous sur IRC" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Accueil" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tous droits réservés." + diff --git a/module/Application/language/fr_FR.mo b/module/Application/language/fr_FR.mo new file mode 100644 index 0000000000000000000000000000000000000000..28f1932ad37233a88a93cdd0dc86a9c817716d66 GIT binary patch literal 5077 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 literal 0 HcmV?d00001 diff --git a/module/Application/language/fr_FR.po b/module/Application/language/fr_FR.po new file mode 100644 index 00000000..49f89d92 --- /dev/null +++ b/module/Application/language/fr_FR.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:32-0700\n" +"PO-Revision-Date: 2012-07-05 23:36-0700\n" +"Last-Translator: Evan Coury \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: FRANCE\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Accueil" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tous droits réservés." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenue dans le %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Félicitations ! Vous avez installé avec succès le %sZF2 Skeleton Application%s. Vous utilisez actuellement Zend Framework version %s. Cette structure peut vous servir comme un point de départ simple pour démarrer la construction de votre application avec ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Faites un Fork de Zend Framework 2 sur GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Suivre le développement" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 est en cours de développement. Si vous êtes intéressé pour suivre l'évolution de ZF2, il existe un portail dédié à ZF2 sur le site officiel Zend Framework qui propose des liens vers le %swiki%s ZF2, %sdev blog%s, %ssuivi des problèmes%s, et bien plus encore. Il s'agit d'une excellente ressource pour rester à jour sur les dernières évolutions !" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portail sur le développement de ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Découvrez les modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La communauté travaille sur le développement d'un site communautaire avec l'objectif de servir de dépôt et de galerie pour les modules ZF2. Le projet est disponible %ssur GitHub%s. Le site est déjà en ligne, et contient une liste non exhaustive des modules déjà disponibles pour ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Explorer les modules ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aide & support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si vous avez besoin d'aide ou de support en développant avec ZF2, vous pouvez nous joindre sur IRC : %s#zftalk.2 sur Freenode%s. Nous aimerions avoir vos questions ou vos commentaires que vous pourriez avoir au sujet des versions bêta. Sinon, vous pouvez vous abonner, et poser des questions sur la %sliste de diffusion%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Rejoignez-nous sur IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Une erreur est survenue" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informations complémentaires" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Fichier" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Message" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Pile d'exécution" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Exceptions précédentes" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Aucune exception disponible" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Une erreur 404 est survenue" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Le contrôleur demandé n'a pas pu dispatcher la requête." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Le contrôleur demandé ne correspond pas à une classe existante de contrôleur." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Le contrôleur demandé n'est pas dispatchable." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "L'URL demandée n'a pas pu trouver de route correspondante." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nous ne pouvons pas déterminer pour le moment pourquoi une 404 a été générée." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Contrôleur" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "résout en %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exception" + diff --git a/module/Application/language/it_IT.mo b/module/Application/language/it_IT.mo new file mode 100644 index 0000000000000000000000000000000000000000..3656ac349512a2f60b0ea2ad8658554c27c13cdf GIT binary patch literal 4922 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\n" +"Language-Team: ZF Contributors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,-1,5,-1,-1,-1\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Pagina iniziale" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tutti i diritti sono riservati." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Benvenuto in %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Congratulazioni! Hai appena installato con successo %sZF2 Skeleton Application%s e stai utilizzando la versione %s di Zend Framework. Questa struttura può servirti come semplice punto di riferimento per iniziare a costruire un'applicazione basata su ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Crea un fork di Zend Framework 2 su GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Segui lo sviluppo" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 è in forte sviluppo. Se sei interessato a seguire lo sviluppo di ZF2, è presente un portale che fornisce link al %swiki%s, al %sdev blog%s, all'%sissue tracker%s e a molto altro riguardo a ZF2. Il Portale è un'ottima risorsa per rimanere aggiornati con gli ultimi sviluppi!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portale sullo sviluppo di ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Scopri i Moduli" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La community sta lavorando allo sviluppo di un sito che deve servire come raccolta e gallery di Moduli per ZF2. Il progetto è disponibile %son Github%s. Il sito è visitabile e al momento contiene una lista di alcuni dei Moduli già disponibili per ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Esplora i Moduli di ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aiuto & Supporto" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Qualora ti servisse aiuto o supporto mentre sviluppi con ZF2, puoi contattarci tramite IRC: %s#zftalk.2 on Freenode%s. Ci piacerebbe moltissimo ricevere le tue domande o qualunque feedback tu possa avere riguardo alle beta release. In alternativa, puoi iscriverti e inviare domande alla %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Contattaci su IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Si è verificato un errore" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informazioni aggiuntive" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "File" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Messaggio" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Eccezioni precedenti" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Non è disponibile alcuna eccezione" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Si è verificato un errore 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Il controller richiesto non è stato in grado di elaborare la richiesta." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Non è stato possibile mappare il controller richiesto ad una classe di tipo controller." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Il controller richiesto non è un oggetto dispatchable." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Non è stato possibile effettuare il match dell'indirizzo richiesto tramite routing." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "In questo momento non siamo in grado di determinare perchè sia stato generato un 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "viene risolto in %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Eccezione" + diff --git a/module/Application/language/ja_JP.mo b/module/Application/language/ja_JP.mo new file mode 100644 index 0000000000000000000000000000000000000000..66b6f3ccb4213eae7758f2b6cd6bfb94f6f23a06 GIT binary patch literal 5185 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 literal 0 HcmV?d00001 diff --git a/module/Application/language/ja_JP.po b/module/Application/language/ja_JP.po new file mode 100644 index 00000000..d6a953ee --- /dev/null +++ b/module/Application/language/ja_JP.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 19:30-0700\n" +"PO-Revision-Date: 2012-07-15 08:20+0900\n" +"Last-Translator: sasezaki \n" +"Language-Team: Japanese\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Japanese\n" +"X-Poedit-Country: Japan\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "%sZend Framework 2%s へようこそ" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "おめでとうございます! %sZF2 Skeleton Application%s のインストールに成功しました。 あなたは Zend Framework version %s を動作させています。このスケルトンはZF2上でのアプリケーション構築を始めるためにシンプルなスタートポイントを提供します。" + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "GitHub で Zend Framework 2 をフォーク" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "開発を追う" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 は鋭意開発中です。ZF2の開発進行にご関心がおありでしょうか、Zend Framework公式ウェブサイト上ではZF2特別ポータルがあり、 %swiki%s、 %sdev blog%s、 %sissue tracker%s、 などのZF2関連のものを提供しています。最新の開発状況に追随するためのすばらしいリソースです。" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 開発ポータル" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "モジュールを見つける" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "コミュニティーはZF2モジュールのためのリポジトリとギャラリーを提供するコミュニティーサイトを開発中です。プロジェクトは %s GitHub%s で利用可能です。サイトは現在運営されており、ZF2ですでに利用可能なモジュールのリストを持っています。" + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "ZF2モジュールを探す" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "ヘルプとサポート" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "ZF2 で開発中に何らかのお手伝いやサポートが必要な場合、IRC を通じて私たちと連絡することができます。: %s#zftalk.2 on Freenode%s ベータ版についてあなたが抱えるかもしれない質問やフィードバックを何でも聞きたいと望みます。あるいは、%smailing lists%s を購読したり質問をポストしたりできます。" + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "IRC で呼び出す" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "エラーが発生しました" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "追加の情報" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "ファイル" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "メッセージ" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "スタックトレース" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "前の例外" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "例外が利用できません" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "404エラーが発生しました" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "要求されたコントローラはリクエストをディスパッチできませんでした。" + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "要求されたコントローラは存在するコントローラクラスにマッピングできませんでした。" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "要求されたコントローラはディスパッチ不可能でした。" + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "要求されたURLはルーティングにマッチしませんでした。" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "404が生成された理由について現時点で判断できません。" + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "コントローラ" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "%s に解決" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "例外" + diff --git a/module/Application/language/nl_NL.mo b/module/Application/language/nl_NL.mo new file mode 100644 index 0000000000000000000000000000000000000000..a03a3328cfb393bb53fab0b04298f56255c8086f GIT binary patch literal 4815 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 literal 0 HcmV?d00001 diff --git a/module/Application/language/nl_NL.po b/module/Application/language/nl_NL.po new file mode 100644 index 00000000..fa97eae1 --- /dev/null +++ b/module/Application/language/nl_NL.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-24 12:48+0100\n" +"Last-Translator: Walter Tamboer\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Dutch\n" +"X-Poedit-Country: NETHERLANDS\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Applicatie Fundering" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Home" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Alle rechten voorbehouden." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Welkom bij %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Gefeliciteerd! Je hebt de %sZF2 Applicatie Fundering%s succesvol geinstalleerd. Je gebruikt Zend Framework versie %s. Deze fundering biedt je een startpunt om je ZF2 applicatie op voort te bouwen." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 op GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Volg de Ontwikkeling" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 wordt actief ontwikkeld. Als je interesse hebt in het volgen van deze ontwikkelingen dan kun je de ZF2 portaal bezoeken op de officiële website van Zend Framework. Daar staan links naar de ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s en nog veel meer. Het is het perfecte middel om up-to-date te blijven met de ontwikkelingen." + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Ontwikkelaars Portaal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Ontdek Modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "De community werkt aan een eigen community website die dient als een bewaarplaats en galerij voor ZF2 modules. Het project is beschikbaar %sop GitHub%s. De site staat op dit moment live en bevat een lijst met modules die op dit moment beschikbaar zijn voor ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Verken ZF2 Modules" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Hulp & Support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Als je hulp nodig hebt tijdens het ontwikkelen met ZF2, dan kun je ons bereiken via IRC: %s#zftalk.2 op Freenode%s. We beantwoorde met alle liefde je vragen en zouden graag feedback krijgen betreffende de beta releases. Je kunt je ook abonneren op de %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Ping ons via IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Er is een fout opgetreden" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Additionele informatie" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Bestand" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Bericht" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stack trace" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Vorige excepties" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Geen exceptie beschikbaar" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "De pagina kon niet worden gevonden." + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "De opgevraagde controller kon deze aanvraag niet verwerken." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Er is geen mapping beschikbaar voor de opgevraagde controller." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "De opgevraagde controller is niet bruikbaar (dispatchable)." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Er is geen route gevonden die overeenkomt met de opgevraagde URL." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "We kunnen op dit moment niet achterhalen waarom de pagina niet kon worden gevonden." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "verwijst naar %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exceptie" + diff --git a/module/Application/language/pl_PL.mo b/module/Application/language/pl_PL.mo new file mode 100644 index 0000000000000000000000000000000000000000..0df3fc6d1c60bd28da8262ba9698a293a35d4155 GIT binary patch literal 4934 zcmb7`PmCm09mh)r(EsytZD| z6xHG4#*G(^7d@BiGwHn{9biW&yFO7N_T&|s^0JS zet*C3_x3%v{UYL0d>@qW$D-&l!H@I9^=I%4;9tNmf^X07-vd9-{mLhz=-=Rj;ELSe z7Db-}?*l&#J_6ngu7P}_GyL2Go&&!Qet&-d7RV?189(=8!_UDxxc~L--M+sCKg0c> zK+*RPQ0#gKyc2vMjF7wYlTozJ-@6dL06q)$!JmT9fH%NzgZ~9(|HnVo>E8igMScv* zK7Yjc|8W0T@ILPUz$UWa-$9AfJD~V~$6ZnMH}C;a{CyV``S(CnMYrAE`Fl4g{weUQ z;41hqcp4PFL-4cUTi`DH{sa_#|3cXV;Je`0z}s0Q@%zRcp9IDK7s30HdkuV+`+_8F zgTDdS!1qCk%NjiZ!I4*tK z6~j_jbrz)jL+W)`tC8L}%GYshyx*&{tVOf0be5S!RU@NT{To~BY9}?Bsa&BpCzH&^ zLBXo;2MxM3D%e+4NSAd{*kY*OFh!!aN}Zd=m8se{rN>m%_0{gkdgT`yV_m3Vv(jE^ z*VY9#A$$ajlWGh#!PbUTSpjjcvv z(TO0JYocm&JW{n+`&O%S7f){x$cLwUP;Po?qL-aIOor0?EYky`zb%V#m*C=Uv|XBg>$o?I z#QErhN;2B1#Hp&(v59u^A$ECQ7q+6Ry^=x{y(m2rY<*;rw^az*k$Nl*KH18ZZE$cX zoxy)8NU52;t0*aIqb8*ro4As_4qYKphZWKlKgBKEuxQye8Bq=TmycrVSJR91ghWlb zJ>{t;L5b;nW2G}{Bf+>u>=vf=LjXz>@=oQwdhtA-)>)zoSCL!=dBh`L3@9&GOS2sp z5fi!=Ixabx2t7DVCM8%WVLiG!)1D+tOqK>5dEe0LVnt&8M68gUf5`H>kVUfRLMVh` zuD%~#BH6kKN)3gY+k${rtRc>oC2q}#AO%vD-G``bg4z zga*_$jjglj_)1A=T_muKj-^Q!H73;2S91;!u7uAFG|k@pC0oKX5sX5*;{z z=OPuzabjW%`HM-yFZ`vrM9}T++3wY?4m4&!dc=DRfl#3PHZh)xDpKOowWnxX^^HyK zsz1R$j8KEj4ZAz*eNAv^snnG6Ncudl(UwD;b2bmw4XMORP9P{bHlYro@m74RCn0kL zydyU;nPZ439Cg`06p3`UkA>Jq?6YYn^uXQKLMquDY^B*~mRxZ-1W!1ajhc@Y* zs)xR}>o(NN_A9%+(_$Ii*E_?W8)|*+rb-p zB3=w@sIRwcbdEP$>NIU;2Q|99dS<%UBmNcdo|}?N5nIaO&V_Rq&MsqdvcI+>;?zrT zx1HcyW!|j5Imuv-rxlG=dQ*Mp)!nV$Q_FQ?`kpC!XN%Yg+i$3+2DV!HUT@nO=8N7- zriCgKf1b)g;oMWRT(EFqgI<7}M$0#+T@7Wlym;mO=F4Z6FHUiY(CVWN)n7i`;cSXW z+dS^A@uI&HU21)GaAjg=m(^f)`QS<-4I7 zs%JM^xMX^KCTLVct&S~F1I*8KDbhu^w@Keinh@b z&3?&rH~XDLjy}Zz#=@LrxAC-)$)`-~@o}ftW#4Yld6e_nDZc&~^d4b=Z<>3`I%tRf>9scJQedo z3(kHIMagij6ArF0VoB!mo7aah*c8ikfFZgb3--3Xpq_IO!56e6QbTv~=E zXGPWKs?<{mmGH#Vt{}shCFVnChkOn_+e(jBBTReixbjivt&q}2&ZiXik>t{0k{&6~ z1%1p}jmLd8=Od95nit*=lUNsCTE;Angt1s(x@qIa^$Cf(1Rdh;#xHU)AHL+AAT5sB zYs{Ho#$CB#%`v}N)YTNxS#+%OSKEe>@2sORUslxBU)!2;1KWd!0X?Bel m73B>rjlHx=%QNxL1`-$-PS}moveXqb7miASb}fw+(f\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Polish\n" +"X-Poedit-Country: POLAND\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Szkielet Aplikacji" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Strona startowa" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Wszelkie prawa zastrzeżone." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Witaj w %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Gratulacje! Z powodzeniem zainstalowałeś %sZF2 Skeleton Application%s. Aktualnie używasz Zend Framework w wersji %s. Ten szkielet może służyć jak prosty punkt startowy do budowy Twoich aplikacji na ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Forkuj Zend Framework 2 na GitHub'e" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Śledź prace programistyczne" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 jest w trakcie aktywnych prac programistycznych. Jeśli jesteś zainteresowany śledzeniem jego rozwoju, istnieje specialny portal ZF2 na oficjalnej stronie Zend Framework na którym dostępne są linki do ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, oraz wiele więcej. Jest to świetne miejsce by śledzić najnowsze zmiany!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Development Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Odkryj Moduły" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Społeczność pracuje nad stworzeniem społecznościowego serwisu który posłuży jako repozytorium i galeria dla modułów ZF2. Projekt wkrótce będzie dostępny na %son GitHub%s. Ta strona jest aktualnie online i udostępnia listę niektórych modułów dostępnych dla ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Odkryj Moduły ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Pomoc & Wsparcie" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Jeśli potrzebujesz jakiejkolwiek pomocy lub wsparcia podczas programowania na ZF2, możesz skontaktować się z nami via IRC: %s#zftalk.2 w sieci Freenode%s. Z przyjemnością wysłuchamy wszelkich pytań lub sugestii które możesz mieć odnoście wydań beta. Alternatywnie, możesz zapisać się i wysłać pytanie na %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Wyślij nam wiadomość na IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Wystąpił błąd" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Dodatkowe informacje" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Plik" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Komunikat" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stack trace" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Poprzedni wyjątek" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Brak dostępnego wyjątku" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Wystąpił błąd 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Żądany kontroler nie mógł zmapować żądania." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Żądany kontroler nie mógł być zmapowany na isteniejącą klasę kontrolera." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Żądany kontroler nie mógł zostać zmapowany." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Żądany adres URL nie mógł zostać powiązany z routing'iem." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nie możemy określić tym razem dlaczego wygenerowano błąd 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Kontroler" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "rozwiązuje na %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Wyjątek" + diff --git a/module/Application/language/tr_TR.mo b/module/Application/language/tr_TR.mo new file mode 100644 index 0000000000000000000000000000000000000000..952882142e8f6f0863f0fb0c08efdf31590512d3 GIT binary patch literal 4785 zcma)ARV6~`}73Jj&dw6x{3cLZsKh)t3f+NK}sWRi4-PD(W6=`h{EwS8^h`hA#t z-%DzX1$!2NDo|HMVl!ezv!DwUAtWcP=%#yG#I6fiv|AAT&V6?5gjQhL{`l09EZ6UXe+TdQh*Ia| z8vG3SFYpuK-FGN;5BLDcTP^W*9$W!s&yC4-8|1C____xheguAu>z{qJ+V@rPZmxd| z%6fkQKMB4GD#pJBuJZHkJC)i7&oj9W{s4Ru{3-Z2_-9b|z4PPMx(|UjnEw%W50 z|KR%9;Qd_xoK0k(-|!{ZzXQeZH^6tnw?W?O&ATd|-U3-ly$5~){3pnk>i$nv^Bx2j zxn2Q<*IS^B&%kx|-2=s?-(w6@)gM9O>x~Ki6_own1K$Dv4K9K2d|Ii?;C+z)F!+7& zY48>B3GhwuYvA1&FL8Vr+-AS;fDdr}Dw}YrpfB1hT9B8-P+niDAdZzdv2El-Zj1fm zi`X@N5q|YKK40b|d?Ayl57}E@pRXWtB=PtnABih&M1O??@gK7ll+0ci^&`uVXzP9M zb>3=~-rKgi*lxSR<(Wye%R0GFja;dVNus^$_KKjr4c714c3oY}&d$D+XI*cKGKsUo z1$`?ob(AZ zZ*{aUE12!eEOS{`zi6|z-ts23d%5rHUF!p;vRqv^dM@ZNU9n{{9c|VoXrqHm2MHDx z#uu{AAa_}z@l_A8w#aqUc3q~MrAylKoV#9|nN^xiu(+=9w(vQAc(vg|E5`!8owv)x z2DSNe%MK!Sn=cQN90$b7>C-KjShdB}d{1xKU7O^C)Mf>@aO8|%tFqs-uDDz_)n%Iu z^g|{cJfW|bgF)^KbvaM1y3&cZXBJ9LHq<>CheM$nr1yGksN2;};?tfhdScO1oR=C{ zwWih6Wzf6M=quMQtwH2hM;+qSuSXNMytP^0w!-gCyV%wV4hvm9Yv6}ne^}ZeE(h7V zgDp+d>Yr>7W#Dbs_{ge6zG(}?#)&n-vg*a8us$R55Hg%u7RqL5dDpaT(k5D=nA?f{ zD-ET_CE{7)LJ_c0Z6i0+wd(m?p9DjjU51$^?C;26+=X1cRXg79x}0k}4O~#y3$efO zre#$Fb6a_umYFLMaL}STS%Ud`GbU-+QLf>R#Z4zYA z#<(d>Q`72^0B>W65!sDvSMjt=+B(Y%;;5+;tsW1WC@C)`ug*>p6RK=EJ999QN|0kR z>|>qKIzKuwfp`ihGXv(H?~&DFMcajeSRvv4AH&N`2Fae&Ns)%h@^y8SV4Ey1YSCos zG6*dg1J8wnx4j-D#ri3`cWq`Vdr}i`+60-zrKxMDE7a;jP!i_3jMqEluu0U}krL1{ zYg156OY&i=F{u)DJxO;diKfB@^>b$5oF`JFsV)QEikHY6Sw_b!{6^RMv-=DidY3g|O%PZXqo33nO$h$-C8+ z3!#J@QmSvg+>(?|OIAy%k(0t5t?Q!1LJk|MZ_7pr#<(1Xi@}sroZ|T+5wH1Cmy1dN5+BGVQoJeQKeOs?QyteZAH0ur1-L> zFOg)fSu!u^Cr6zc>=!(HW<(%Q&%v4PE8CkhCRXap=VUr+sWpZJJS*(W#Wx2Db>j(5 zTKQm$r*1U1YLCsviQygVYnxdsm$JU5A8Wee-1llbxuub)J!gj$%67PlFDy9m)6ND= zU0BnNl7bp~vqzWml8Q0p$&G8zZQhzaSm(GP(|c>WKD&9HQ>fM3;dX7A2laDm-T9cI zJyV!)bfEL3Jl-!#wb|EAmvlK1y=sgPQyP?h!VwmLql5O*fq%c&reT}j^_g=4DT&CZ zsyW@TES6d~&GEkRM+d{i=;8Q~Nl@cPb$$G+QUq_#9`Or7>o7j_VvHQrApSQ?}$t4=rxLU$cz#` zW+SrsG0#!G$FFh zI&ZmjO6H}LU}8jH(Gm$AP7g@xDqQ1VW|&X-s+hCjDSBa zbV$ehlicHAC%MEBv2>a!BW_jW^_=xt?3OSBNi!0&NefXunUTdNXgGd7ODL|+r?{XC z(+eD5=r*z3aH@f`gX&ru#gl{@R*8G+o~BBn#}1~PU59?=0~Qh@j`mSZR9K|>XkY%h zVCe_WArr9=pCSs$DYd6RJ`{USrazBI*?bAbxJ)D^W%Ott;Z9hk0i<9c6V?<7kLv3E znx93Zd-?Ic1T+@JST_EjX2|pl*O}?SC8_Px@!+D~B%5RNyvTpT$&grNrnzS`F)0{H z^rg9w(;Gm*nZ9e%;1F+OIevX)lWAvEX=90hHb&|<%9%Dfi$g1Y&c@~olRjsWQnCzib**pCn8u!-fqZ-yD9ag<$9>!mkTm+@`\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Turkish\n" +"X-Poedit-Country: TURKEY\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Anasayfa" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tüm haklar saklıdır." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "%sZend Framework 2%s'a hoş geldiniz" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Tebrikler! %sZF2 Skeleton Application%s'u başarıyla yüklediniz. Şu anda Zend Framework %s sürüm ile çalışıyorsunuz. Bu iskelet ZF2 üzerinde uygulama oluşturmak için basit bir başlangıç ​​noktası olarak hizmet verebilir." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Zend Framework 2'yi GitHub'da fork edin" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Gelişimi izleyin" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 aktif geliştirilmektedir. Eğer ZF2'nin gelişimi ile ilgileniyorsanız, ZF2 için resmi Zend Framework websitesinde özel portal mevcut, orada ZF2 %swiki%s'ye, %sDEV blog%s'a, %ssorun takibi%s'ne bağlantılarını ve çok daha fazlasını sunar. Bu son gelişmeler ile güncel kalmak için büyük bir kaynaktır!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Development Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Modülleri keşfedin" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Topluluk ZF2 modülleri için bir depo ve galeri olarak hizmet edecek bir topluluk sitesi geliştirme üzerinde çalışıyor. Proje %sGitHub%s'da mevcut. Site şu anda canlı ve ZF2 için bazı mevcut modüllerin listesini içerir." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "ZF2 Modüllerini keşfedin" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Yardım & Destek" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "ZF2 ile geliştirirken herhangi yardım veya desteğe ihtiyacınız varsa, bize IRC: %sFreenode #zftalk.2%s üzerinden ulaşabilirsiniz. Beta sürümleri ile ilgili olabilecek herhangi bir sorunuzu ya da yorumlarınızı duymak isteriz. Alternatif olarak %smailing listelerine%s abone olup sorularınızı sorabilirsiniz." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "IRC bizi pingleyin" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "An error occurred" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Ek bilgiler" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Klasör" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Mesaj" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Denetleyici" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Önceki istisnalar" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "İstisna yok" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Bir 404 hatası oluştu" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Talep edilen denetleyici işlemi işlemesi mümkün değildir." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Talep edilen denetleyiciye uygun denetleyici sınıfı tahsis edilemedi." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Talep edilen denetleyici çağrılabilir değildir." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "İstenen URL yönlendirmede tahsis edilemedi" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Neden 404 hatasının oluştuğunu şu an belirleyemiyoruz." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Denetleyici" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "Buraya çözümlenir: %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "İstisna" + diff --git a/module/Application/src/Application/Controller/IndexController.php b/module/Application/src/Application/Controller/IndexController.php new file mode 100644 index 00000000..a1aafaee --- /dev/null +++ b/module/Application/src/Application/Controller/IndexController.php @@ -0,0 +1,21 @@ + +

translate('Welcome to %sZend Framework 2%s'), '', '') ?>

+
+

translate('Fork Zend Framework 2 on GitHub') ?> »

+ + +
+ +
+

translate('Follow Development') ?>

+

translate('Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!'), '', '', '', '', '', '') ?>

+

translate('ZF2 Development Portal') ?> »

+
+ +
+

translate('Discover Modules') ?>

+

translate('The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2.'), '', '') ?>

+

translate('Explore ZF2 Modules') ?> »

+
+ +
+

translate('Help & Support') ?>

+

translate('If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We\'d love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s.'), '', '', '', '') ?>

+

translate('Ping us on IRC') ?> »

+
+
diff --git a/module/Application/view/error/404.phtml b/module/Application/view/error/404.phtml new file mode 100644 index 00000000..3edd37a8 --- /dev/null +++ b/module/Application/view/error/404.phtml @@ -0,0 +1,61 @@ +

translate('A 404 error occurred') ?>

+

message ?>

+ +reason) && $this->reason): ?> + +reason) { + case 'error-controller-cannot-dispatch': + $reasonMessage = $this->translate('The requested controller was unable to dispatch the request.'); + break; + case 'error-controller-not-found': + $reasonMessage = $this->translate('The requested controller could not be mapped to an existing controller class.'); + break; + case 'error-controller-invalid': + $reasonMessage = $this->translate('The requested controller was not dispatchable.'); + break; + case 'error-router-no-match': + $reasonMessage = $this->translate('The requested URL could not be matched by routing.'); + break; + default: + $reasonMessage = $this->translate('We cannot determine at this time why a 404 was generated.'); + break; +} +?> + +

+ + + +controller) && $this->controller): ?> + +
+
translate('Controller') ?>:
+
escapeHtml($this->controller) ?> +controller_class) + && $this->controller_class + && $this->controller_class != $this->controller +) { + echo '(' . sprintf($this->translate('resolves to %s'), $this->escapeHtml($this->controller_class)) . ')'; +} +?> +
+
+ + + +exception) && $this->exception): ?> + +

translate('Exception') ?>:

+ +

escapeHtml($this->exception->getMessage()) ?>

+ +

translate('Stack trace') ?>:

+ +
+exception->getTraceAsString() ?>
+
+ + diff --git a/module/Application/view/error/index.phtml b/module/Application/view/error/index.phtml new file mode 100644 index 00000000..5165cd8e --- /dev/null +++ b/module/Application/view/error/index.phtml @@ -0,0 +1,62 @@ +

translate('An error occurred') ?>

+

message ?>

+ +display_exceptions) && $this->display_exceptions): ?> + +exception) && $this->exception instanceof Exception): ?> +
+

translate('Additional information') ?>:

+

exception); ?>

+
+
translate('File') ?>:
+
+
exception->getFile() ?>:exception->getLine() ?>
+
+
translate('Message') ?>:
+
+
exception->getMessage() ?>
+
+
translate('Stack trace') ?>:
+
+
exception->getTraceAsString() ?>
+
+
+exception->getPrevious(); + if ($e) : +?> +
+

translate('Previous exceptions') ?>:

+
    + +
  • +

    +
    +
    translate('File') ?>:
    +
    +
    getFile() ?>:getLine() ?>
    +
    +
    translate('Message') ?>:
    +
    +
    getMessage() ?>
    +
    +
    translate('Stack trace') ?>:
    +
    +
    getTraceAsString() ?>
    +
    +
    +
  • + getPrevious(); + endwhile; + ?> +
+ + + + +

translate('No Exception available') ?>

+ + + + diff --git a/module/Application/view/layout/layout.phtml b/module/Application/view/layout/layout.phtml new file mode 100644 index 00000000..d5af45f6 --- /dev/null +++ b/module/Application/view/layout/layout.phtml @@ -0,0 +1,57 @@ +doctype(); ?> + + + + + headTitle('ZF2 '. $this->translate('Skeleton Application'))->setSeparator(' - ')->setAutoEscape(false) ?> + + headMeta()->appendName('viewport', 'width=device-width, initial-scale=1.0') ?> + + + headLink(array('rel' => 'shortcut icon', 'type' => 'image/vnd.microsoft.icon', 'href' => $this->basePath() . '/images/favicon.ico')) + ->prependStylesheet($this->basePath() . '/css/bootstrap-responsive.min.css') + ->prependStylesheet($this->basePath() . '/css/style.css') + ->prependStylesheet($this->basePath() . '/css/bootstrap.min.css') ?> + + + headScript()->prependFile($this->basePath() . '/js/html5.js', 'text/javascript', array('conditional' => 'lt IE 9',)) + ->prependFile($this->basePath() . '/js/jquery-1.7.2.min.js') ?> + + + + + + + +
+ + content; ?> + +
+ +
+

© 2005 - 2012 by Zend Technologies Ltd. translate('All rights reserved.') ?>

+
+ +
+ + inlineScript() ?> + + diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 00000000..10d71d77 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,7 @@ +RewriteEngine On +RewriteCond %{REQUEST_FILENAME} -s [OR] +RewriteCond %{REQUEST_FILENAME} -l [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteBase /fmi +RewriteRule ^.*$ - [NC,L] +RewriteRule ^.*$ index.php [NC,L] diff --git a/public/css/bootstrap-responsive.min.css b/public/css/bootstrap-responsive.min.css new file mode 100644 index 00000000..bc3f2ab7 --- /dev/null +++ b/public/css/bootstrap-responsive.min.css @@ -0,0 +1,3 @@ + +.hidden{display:none;visibility:hidden;} +@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:768px){.container{width:auto;padding:0 20px;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;}}@media (min-width:768px) and (max-width:980px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .span1{width:42px;} .span2{width:104px;} .span3{width:166px;} .span4{width:228px;} .span5{width:290px;} .span6{width:352px;} .span7{width:414px;} .span8{width:476px;} .span9{width:538px;} .span10{width:600px;} .span11{width:662px;} .span12,.container{width:724px;} .offset1{margin-left:82px;} .offset2{margin-left:144px;} .offset3{margin-left:206px;} .offset4{margin-left:268px;} .offset5{margin-left:330px;} .offset6{margin-left:392px;} .offset7{margin-left:454px;} .offset8{margin-left:516px;} .offset9{margin-left:578px;} .offset10{margin-left:640px;} .offset11{margin-left:702px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.801104972%;} .row-fluid .span2{width:14.364640883%;} .row-fluid .span3{width:22.928176794%;} .row-fluid .span4{width:31.491712705%;} .row-fluid .span5{width:40.055248616%;} .row-fluid .span6{width:48.618784527%;} .row-fluid .span7{width:57.182320438000005%;} .row-fluid .span8{width:65.74585634900001%;} .row-fluid .span9{width:74.30939226%;} .row-fluid .span10{width:82.87292817100001%;} .row-fluid .span11{width:91.436464082%;} .row-fluid .span12{width:99.999999993%;} input.span1,textarea.span1,.uneditable-input.span1{width:32px;} input.span2,textarea.span2,.uneditable-input.span2{width:94px;} input.span3,textarea.span3,.uneditable-input.span3{width:156px;} input.span4,textarea.span4,.uneditable-input.span4{width:218px;} input.span5,textarea.span5,.uneditable-input.span5{width:280px;} input.span6,textarea.span6,.uneditable-input.span6{width:342px;} input.span7,textarea.span7,.uneditable-input.span7{width:404px;} input.span8,textarea.span8,.uneditable-input.span8{width:466px;} input.span9,textarea.span9,.uneditable-input.span9{width:528px;} input.span10,textarea.span10,.uneditable-input.span10{width:590px;} input.span11,textarea.span11,.uneditable-input.span11{width:652px;} input.span12,textarea.span12,.uneditable-input.span12{width:714px;}}@media (max-width:980px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .span1{width:70px;} .span2{width:170px;} .span3{width:270px;} .span4{width:370px;} .span5{width:470px;} .span6{width:570px;} .span7{width:670px;} .span8{width:770px;} .span9{width:870px;} .span10{width:970px;} .span11{width:1070px;} .span12,.container{width:1170px;} .offset1{margin-left:130px;} .offset2{margin-left:230px;} .offset3{margin-left:330px;} .offset4{margin-left:430px;} .offset5{margin-left:530px;} .offset6{margin-left:630px;} .offset7{margin-left:730px;} .offset8{margin-left:830px;} .offset9{margin-left:930px;} .offset10{margin-left:1030px;} .offset11{margin-left:1130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.982905983%;} .row-fluid .span2{width:14.529914530000001%;} .row-fluid .span3{width:23.076923077%;} .row-fluid .span4{width:31.623931624%;} .row-fluid .span5{width:40.170940171000005%;} .row-fluid .span6{width:48.717948718%;} .row-fluid .span7{width:57.264957265%;} .row-fluid .span8{width:65.81196581200001%;} .row-fluid .span9{width:74.358974359%;} .row-fluid .span10{width:82.905982906%;} .row-fluid .span11{width:91.45299145300001%;} .row-fluid .span12{width:100%;} input.span1,textarea.span1,.uneditable-input.span1{width:60px;} input.span2,textarea.span2,.uneditable-input.span2{width:160px;} input.span3,textarea.span3,.uneditable-input.span3{width:260px;} input.span4,textarea.span4,.uneditable-input.span4{width:360px;} input.span5,textarea.span5,.uneditable-input.span5{width:460px;} input.span6,textarea.span6,.uneditable-input.span6{width:560px;} input.span7,textarea.span7,.uneditable-input.span7{width:660px;} input.span8,textarea.span8,.uneditable-input.span8{width:760px;} input.span9,textarea.span9,.uneditable-input.span9{width:860px;} input.span10,textarea.span10,.uneditable-input.span10{width:960px;} input.span11,textarea.span11,.uneditable-input.span11{width:1060px;} input.span12,textarea.span12,.uneditable-input.span12{width:1160px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}} diff --git a/public/css/bootstrap.min.css b/public/css/bootstrap.min.css new file mode 100644 index 00000000..b01f92e6 --- /dev/null +++ b/public/css/bootstrap.min.css @@ -0,0 +1,610 @@ +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} +audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} +audio:not([controls]){display:none;} +html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} +a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +a:hover,a:active{outline:0;} +sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} +sup{top:-0.5em;} +sub{bottom:-0.25em;} +img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;} +button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} +button,input{*overflow:visible;line-height:normal;} +button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} +button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} +input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} +input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} +textarea{overflow:auto;vertical-align:top;} +body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;} +a{color:#0088cc;text-decoration:none;} +a:hover{color:#005580;text-decoration:underline;} +.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} +.row:after{clear:both;} +[class*="span"]{float:left;margin-left:20px;} +.span1{width:60px;} +.span2{width:140px;} +.span3{width:220px;} +.span4{width:300px;} +.span5{width:380px;} +.span6{width:460px;} +.span7{width:540px;} +.span8{width:620px;} +.span9{width:700px;} +.span10{width:780px;} +.span11{width:860px;} +.span12,.container{width:940px;} +.offset1{margin-left:100px;} +.offset2{margin-left:180px;} +.offset3{margin-left:260px;} +.offset4{margin-left:340px;} +.offset5{margin-left:420px;} +.offset6{margin-left:500px;} +.offset7{margin-left:580px;} +.offset8{margin-left:660px;} +.offset9{margin-left:740px;} +.offset10{margin-left:820px;} +.offset11{margin-left:900px;} +.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} +.row-fluid:after{clear:both;} +.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;} +.row-fluid>[class*="span"]:first-child{margin-left:0;} +.row-fluid .span1{width:6.382978723%;} +.row-fluid .span2{width:14.89361702%;} +.row-fluid .span3{width:23.404255317%;} +.row-fluid .span4{width:31.914893614%;} +.row-fluid .span5{width:40.425531911%;} +.row-fluid .span6{width:48.93617020799999%;} +.row-fluid .span7{width:57.446808505%;} +.row-fluid .span8{width:65.95744680199999%;} +.row-fluid .span9{width:74.468085099%;} +.row-fluid .span10{width:82.97872339599999%;} +.row-fluid .span11{width:91.489361693%;} +.row-fluid .span12{width:99.99999998999999%;} +.container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";} +.container:after{clear:both;} +.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";} +.container-fluid:after{clear:both;} +p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;} +.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;} +h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;} +h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;} +h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;} +h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;} +h4,h5,h6{line-height:18px;} +h4{font-size:14px;}h4 small{font-size:12px;} +h5{font-size:12px;} +h6{font-size:11px;color:#999999;text-transform:uppercase;} +.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;} +.page-header h1{line-height:1;} +ul,ol{padding:0;margin:0 0 9px 25px;} +ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} +ul{list-style:disc;} +ol{list-style:decimal;} +li{line-height:18px;} +ul.unstyled{margin-left:0;list-style:none;} +dl{margin-bottom:18px;} +dt,dd{line-height:18px;} +dt{font-weight:bold;} +dd{margin-left:9px;} +hr{margin:18px 0;border:0;border-top:1px solid #e5e5e5;border-bottom:1px solid #ffffff;} +strong{font-weight:bold;} +em{font-style:italic;} +.muted{color:#999999;} +abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;} +blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;} +blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} +blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} +q:before,q:after,blockquote:before,blockquote:after{content:"";} +address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;} +small{font-size:100%;} +cite{font-style:normal;} +code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} +pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;}pre.prettyprint{margin-bottom:18px;} +pre code{padding:0;background-color:transparent;} +form{margin:0 0 18px;} +fieldset{padding:0;margin:0;border:0;} +legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;} +label,input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;} +label{display:block;margin-bottom:5px;color:#333333;} +input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.uneditable-textarea{width:auto;height:auto;} +label input,label textarea,label select{display:block;} +input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:0;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +input[type="file"]{padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;} +select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;} +select{width:220px;background-color:#ffffff;} +select[multiple],select[size]{height:auto;} +input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +textarea{height:auto;} +input[type="hidden"]{display:none;} +.radio,.checkbox{padding-left:18px;} +.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;} +.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} +.radio.inline,.checkbox.inline{display:inline-block;margin-bottom:0;vertical-align:middle;} +.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} +.controls>.radio.inline:first-child,.controls>.checkbox.inline:first-child{padding-top:0;} +input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;} +input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;} +input[type="file"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.input-mini{width:60px;} +.input-small{width:90px;} +.input-medium{width:150px;} +.input-large{width:210px;} +.input-xlarge{width:270px;} +.input-xxlarge{width:530px;} +input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;} +input.span1,textarea.span1,.uneditable-input.span1{width:50px;} +input.span2,textarea.span2,.uneditable-input.span2{width:130px;} +input.span3,textarea.span3,.uneditable-input.span3{width:210px;} +input.span4,textarea.span4,.uneditable-input.span4{width:290px;} +input.span5,textarea.span5,.uneditable-input.span5{width:370px;} +input.span6,textarea.span6,.uneditable-input.span6{width:450px;} +input.span7,textarea.span7,.uneditable-input.span7{width:530px;} +input.span8,textarea.span8,.uneditable-input.span8{width:610px;} +input.span9,textarea.span9,.uneditable-input.span9{width:690px;} +input.span10,textarea.span10,.uneditable-input.span10{width:770px;} +input.span11,textarea.span11,.uneditable-input.span11{width:850px;} +input.span12,textarea.span12,.uneditable-input.span12{width:930px;} +input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;} +.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} +.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;} +.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} +.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} +.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;} +.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} +.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} +.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;} +.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} +input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} +.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;} +.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} +:-moz-placeholder{color:#999999;} +::-webkit-input-placeholder{color:#999999;} +.help-block{margin-top:5px;margin-bottom:0;color:#999999;} +.help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;} +.input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";} +.input-prepend:after,.input-append:after{clear:both;} +.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;} +.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;} +.input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;} +.input-prepend .add-on{*margin-top:1px;} +.input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-append .uneditable-input{border-right-color:#ccc;} +.input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;} +.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;} +.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input{display:inline-block;margin-bottom:0;} +.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;} +.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;} +.control-group{margin-bottom:9px;} +.form-horizontal legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;} +.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";} +.form-horizontal .control-group:after{clear:both;} +.form-horizontal .control-group>label{float:left;width:140px;padding-top:5px;text-align:right;} +.form-horizontal .controls{margin-left:160px;} +.form-horizontal .form-actions{padding-left:160px;} +table{max-width:100%;border-collapse:collapse;border-spacing:0;} +.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;border-top:1px solid #ddd;} +.table th{font-weight:bold;vertical-align:bottom;} +.table td{vertical-align:top;} +.table thead:first-child tr th,.table thead:first-child tr td{border-top:0;} +.table tbody+tbody{border-top:2px solid #ddd;} +.table-condensed th,.table-condensed td{padding:4px 5px;} +.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;} +.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} +.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;} +.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;} +.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;} +.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;} +.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} +table .span1{float:none;width:44px;margin-left:0;} +table .span2{float:none;width:124px;margin-left:0;} +table .span3{float:none;width:204px;margin-left:0;} +table .span4{float:none;width:284px;margin-left:0;} +table .span5{float:none;width:364px;margin-left:0;} +table .span6{float:none;width:444px;margin-left:0;} +table .span7{float:none;width:524px;margin-left:0;} +table .span8{float:none;width:604px;margin-left:0;} +table .span9{float:none;width:684px;margin-left:0;} +table .span10{float:none;width:764px;margin-left:0;} +table .span11{float:none;width:844px;margin-left:0;} +table .span12{float:none;width:924px;margin-left:0;} +[class^="icon-"]{display:inline-block;width:14px;height:14px;vertical-align:text-top;background-image:url(../img/glyphicons-halflings.png);background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child{*margin-left:0;} +.icon-white{background-image:url(../img/glyphicons-halflings-white.png);} +.icon-glass{background-position:0 0;} +.icon-music{background-position:-24px 0;} +.icon-search{background-position:-48px 0;} +.icon-envelope{background-position:-72px 0;} +.icon-heart{background-position:-96px 0;} +.icon-star{background-position:-120px 0;} +.icon-star-empty{background-position:-144px 0;} +.icon-user{background-position:-168px 0;} +.icon-film{background-position:-192px 0;} +.icon-th-large{background-position:-216px 0;} +.icon-th{background-position:-240px 0;} +.icon-th-list{background-position:-264px 0;} +.icon-ok{background-position:-288px 0;} +.icon-remove{background-position:-312px 0;} +.icon-zoom-in{background-position:-336px 0;} +.icon-zoom-out{background-position:-360px 0;} +.icon-off{background-position:-384px 0;} +.icon-signal{background-position:-408px 0;} +.icon-cog{background-position:-432px 0;} +.icon-trash{background-position:-456px 0;} +.icon-home{background-position:0 -24px;} +.icon-file{background-position:-24px -24px;} +.icon-time{background-position:-48px -24px;} +.icon-road{background-position:-72px -24px;} +.icon-download-alt{background-position:-96px -24px;} +.icon-download{background-position:-120px -24px;} +.icon-upload{background-position:-144px -24px;} +.icon-inbox{background-position:-168px -24px;} +.icon-play-circle{background-position:-192px -24px;} +.icon-repeat{background-position:-216px -24px;} +.icon-refresh{background-position:-240px -24px;} +.icon-list-alt{background-position:-264px -24px;} +.icon-lock{background-position:-287px -24px;} +.icon-flag{background-position:-312px -24px;} +.icon-headphones{background-position:-336px -24px;} +.icon-volume-off{background-position:-360px -24px;} +.icon-volume-down{background-position:-384px -24px;} +.icon-volume-up{background-position:-408px -24px;} +.icon-qrcode{background-position:-432px -24px;} +.icon-barcode{background-position:-456px -24px;} +.icon-tag{background-position:0 -48px;} +.icon-tags{background-position:-25px -48px;} +.icon-book{background-position:-48px -48px;} +.icon-bookmark{background-position:-72px -48px;} +.icon-print{background-position:-96px -48px;} +.icon-camera{background-position:-120px -48px;} +.icon-font{background-position:-144px -48px;} +.icon-bold{background-position:-167px -48px;} +.icon-italic{background-position:-192px -48px;} +.icon-text-height{background-position:-216px -48px;} +.icon-text-width{background-position:-240px -48px;} +.icon-align-left{background-position:-264px -48px;} +.icon-align-center{background-position:-288px -48px;} +.icon-align-right{background-position:-312px -48px;} +.icon-align-justify{background-position:-336px -48px;} +.icon-list{background-position:-360px -48px;} +.icon-indent-left{background-position:-384px -48px;} +.icon-indent-right{background-position:-408px -48px;} +.icon-facetime-video{background-position:-432px -48px;} +.icon-picture{background-position:-456px -48px;} +.icon-pencil{background-position:0 -72px;} +.icon-map-marker{background-position:-24px -72px;} +.icon-adjust{background-position:-48px -72px;} +.icon-tint{background-position:-72px -72px;} +.icon-edit{background-position:-96px -72px;} +.icon-share{background-position:-120px -72px;} +.icon-check{background-position:-144px -72px;} +.icon-move{background-position:-168px -72px;} +.icon-step-backward{background-position:-192px -72px;} +.icon-fast-backward{background-position:-216px -72px;} +.icon-backward{background-position:-240px -72px;} +.icon-play{background-position:-264px -72px;} +.icon-pause{background-position:-288px -72px;} +.icon-stop{background-position:-312px -72px;} +.icon-forward{background-position:-336px -72px;} +.icon-fast-forward{background-position:-360px -72px;} +.icon-step-forward{background-position:-384px -72px;} +.icon-eject{background-position:-408px -72px;} +.icon-chevron-left{background-position:-432px -72px;} +.icon-chevron-right{background-position:-456px -72px;} +.icon-plus-sign{background-position:0 -96px;} +.icon-minus-sign{background-position:-24px -96px;} +.icon-remove-sign{background-position:-48px -96px;} +.icon-ok-sign{background-position:-72px -96px;} +.icon-question-sign{background-position:-96px -96px;} +.icon-info-sign{background-position:-120px -96px;} +.icon-screenshot{background-position:-144px -96px;} +.icon-remove-circle{background-position:-168px -96px;} +.icon-ok-circle{background-position:-192px -96px;} +.icon-ban-circle{background-position:-216px -96px;} +.icon-arrow-left{background-position:-240px -96px;} +.icon-arrow-right{background-position:-264px -96px;} +.icon-arrow-up{background-position:-289px -96px;} +.icon-arrow-down{background-position:-312px -96px;} +.icon-share-alt{background-position:-336px -96px;} +.icon-resize-full{background-position:-360px -96px;} +.icon-resize-small{background-position:-384px -96px;} +.icon-plus{background-position:-408px -96px;} +.icon-minus{background-position:-433px -96px;} +.icon-asterisk{background-position:-456px -96px;} +.icon-exclamation-sign{background-position:0 -120px;} +.icon-gift{background-position:-24px -120px;} +.icon-leaf{background-position:-48px -120px;} +.icon-fire{background-position:-72px -120px;} +.icon-eye-open{background-position:-96px -120px;} +.icon-eye-close{background-position:-120px -120px;} +.icon-warning-sign{background-position:-144px -120px;} +.icon-plane{background-position:-168px -120px;} +.icon-calendar{background-position:-192px -120px;} +.icon-random{background-position:-216px -120px;} +.icon-comment{background-position:-240px -120px;} +.icon-magnet{background-position:-264px -120px;} +.icon-chevron-up{background-position:-288px -120px;} +.icon-chevron-down{background-position:-313px -119px;} +.icon-retweet{background-position:-336px -120px;} +.icon-shopping-cart{background-position:-360px -120px;} +.icon-folder-close{background-position:-384px -120px;} +.icon-folder-open{background-position:-408px -120px;} +.icon-resize-vertical{background-position:-432px -119px;} +.icon-resize-horizontal{background-position:-456px -118px;} +.dropdown{position:relative;} +.dropdown-toggle{*margin-bottom:-3px;} +.dropdown-toggle:active,.open .dropdown-toggle{outline:0;} +.caret{display:inline-block;width:0;height:0;text-indent:-99999px;*text-indent:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"\2193";} +.dropdown .caret{margin-top:8px;margin-left:2px;} +.dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);} +.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;max-width:220px;_width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.bottom-up{top:auto;bottom:100%;margin-bottom:2px;} +.dropdown-menu .divider{height:1px;margin:5px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;} +.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#555555;white-space:nowrap;} +.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;} +.dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);} +.dropdown.open .dropdown-menu{display:block;} +.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} +.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;} +.collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;} +.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;} +.btn{display:inline-block;padding:4px 10px 4px;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#fafafa;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;*margin-left:.3em;}.btn:first-child{*margin-left:0;} +.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} +.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;color:rgba(0, 0, 0, 0.5);outline:0;} +.btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.btn-large .icon{margin-top:1px;} +.btn-small{padding:5px 9px;font-size:11px;line-height:16px;} +.btn-small .icon{margin-top:-1px;} +.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;} +.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active{color:rgba(255, 255, 255, 0.75);} +.btn-primary{background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-ms-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(top, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0044cc;} +.btn-primary:active,.btn-primary.active{background-color:#003399 \9;} +.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;} +.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} +.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;} +.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} +.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;} +.btn-success:active,.btn-success.active{background-color:#408140 \9;} +.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;} +.btn-info:active,.btn-info.active{background-color:#24748c \9;} +button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} +button.btn.large,input[type="submit"].btn.large{*padding-top:7px;*padding-bottom:7px;} +button.btn.small,input[type="submit"].btn.small{*padding-top:3px;*padding-bottom:3px;} +.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";} +.btn-group:after{clear:both;} +.btn-group:first-child{*margin-left:0;} +.btn-group+.btn-group{margin-left:5px;} +.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;} +.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} +.btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} +.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} +.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;} +.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} +.btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:5px;*padding-bottom:5px;} +.btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);} +.btn .caret{margin-top:7px;margin-left:0;} +.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);} +.btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret{border-top-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);} +.btn-small .caret{margin-top:4px;} +.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.alert,.alert-heading{color:#c09853;} +.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;} +.alert-success{background-color:#dff0d8;border-color:#d6e9c6;} +.alert-success,.alert-success .alert-heading{color:#468847;} +.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;} +.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading{color:#b94a48;} +.alert-info{background-color:#d9edf7;border-color:#bce8f1;} +.alert-info,.alert-info .alert-heading{color:#3a87ad;} +.alert-block{padding-top:14px;padding-bottom:14px;} +.alert-block>p,.alert-block>ul{margin-bottom:0;} +.alert-block p+p{margin-top:5px;} +.nav{margin-left:0;margin-bottom:18px;list-style:none;} +.nav>li>a{display:block;} +.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} +.nav-list{padding-left:14px;padding-right:14px;margin-bottom:0;} +.nav-list>li>a,.nav-list .nav-header{display:block;padding:3px 15px;margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} +.nav-list .nav-header{font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-transform:uppercase;} +.nav-list>li+.nav-header{margin-top:9px;} +.nav-list .active>a,.nav-list .active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} +.nav-list [class^="icon-"]{margin-right:2px;} +.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";} +.nav-tabs:after,.nav-pills:after{clear:both;} +.nav-tabs>li,.nav-pills>li{float:left;} +.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} +.nav-tabs{border-bottom:1px solid #ddd;} +.nav-tabs>li{margin-bottom:-1px;} +.nav-tabs>li>a{padding-top:9px;padding-bottom:9px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} +.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} +.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.nav-pills .active>a,.nav-pills .active>a:hover{color:#ffffff;background-color:#0088cc;} +.nav-stacked>li{float:none;} +.nav-stacked>li>a{margin-right:0;} +.nav-tabs.nav-stacked{border-bottom:0;} +.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} +.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} +.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} +.nav-pills.nav-stacked>li>a{margin-bottom:3px;} +.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} +.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;} +.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;margin-top:6px;} +.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;} +.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;} +.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;} +.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} +.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;opacity:1;filter:alpha(opacity=100);} +.tabs-stacked .open>a:hover{border-color:#999999;} +.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";} +.tabbable:after{clear:both;} +.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;} +.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} +.tab-content>.active,.pill-content>.active{display:block;} +.tabs-below .nav-tabs{border-top:1px solid #ddd;} +.tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;} +.tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} +.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;} +.tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;} +.tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} +.tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} +.tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} +.tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} +.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} +.tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} +.tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} +.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} +.navbar{overflow:visible;margin-bottom:18px;} +.navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);} +.btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;} +.btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;} +.btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} +.btn-navbar .icon-bar+.icon-bar{margin-top:3px;} +.nav-collapse.collapse{height:auto;} +.navbar .brand:hover{text-decoration:none;} +.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;} +.navbar .navbar-text{margin-bottom:0;line-height:40px;color:#999999;}.navbar .navbar-text a:hover{color:#ffffff;background-color:transparent;} +.navbar .btn,.navbar .btn-group{margin-top:5px;} +.navbar .btn-group .btn{margin-top:0;} +.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";} +.navbar-form:after{clear:both;} +.navbar-form input,.navbar-form select{display:inline-block;margin-top:5px;margin-bottom:0;} +.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} +.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} +.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;color:rgba(255, 255, 255, 0.75);background:#666;background:rgba(255, 255, 255, 0.3);border:1px solid #111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query :-moz-placeholder{color:#eeeeee;} +.navbar-search .search-query::-webkit-input-placeholder{color:#eeeeee;} +.navbar-search .search-query:hover{color:#ffffff;background-color:#999999;background-color:rgba(255, 255, 255, 0.5);} +.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} +.navbar-fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030;} +.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} +.navbar .nav.pull-right{float:right;} +.navbar .nav>li{display:block;float:left;} +.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} +.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;} +.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;background-color:rgba(0, 0, 0, 0.5);} +.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;} +.navbar .nav.pull-right{margin-left:10px;margin-right:0;} +.navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} +.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} +.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;} +.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);} +.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;} +.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;} +.navbar .nav.pull-right .dropdown-menu{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before{left:auto;right:12px;} +.navbar .nav.pull-right .dropdown-menu:after{left:auto;right:13px;} +.breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;} +.breadcrumb .divider{padding:0 5px;color:#999999;} +.breadcrumb .active a{color:#333333;} +.pagination{height:36px;margin:18px 0;} +.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} +.pagination li{display:inline;} +.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;} +.pagination a:hover,.pagination .active a{background-color:#f5f5f5;} +.pagination .active a{color:#999999;cursor:default;} +.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;} +.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.pagination-centered{text-align:center;} +.pagination-right{text-align:right;} +.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";} +.pager:after{clear:both;} +.pager li{display:inline;} +.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} +.pager a:hover{text-decoration:none;background-color:#f5f5f5;} +.pager .next a{float:right;} +.pager .previous a{float:left;} +.modal-open .dropdown-menu{z-index:2050;} +.modal-open .dropdown.open{*z-index:2050;} +.modal-open .popover{z-index:2060;} +.modal-open .tooltip{z-index:2070;} +.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} +.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} +.modal{position:fixed;top:50%;left:50%;z-index:1050;max-height:500px;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} +.modal.fade.in{top:50%;} +.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} +.modal-body{padding:15px;} +.modal-footer{padding:14px 15px 15px;margin-bottom:0;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";} +.modal-footer:after{clear:both;} +.modal-footer .btn{float:right;margin-left:5px;margin-bottom:0;} +.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} +.tooltip.top{margin-top:-2px;} +.tooltip.right{margin-left:2px;} +.tooltip.bottom{margin-top:2px;} +.tooltip.left{margin-left:-2px;} +.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.tooltip-arrow{position:absolute;width:0;height:0;} +.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;} +.popover.right{margin-left:5px;} +.popover.bottom{margin-top:5px;} +.popover.left{margin-left:-5px;} +.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.popover .arrow{position:absolute;width:0;height:0;} +.popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);} +.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;} +.popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;} +.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";} +.thumbnails:after{clear:both;} +.thumbnails>li{float:left;margin:0 0 18px 20px;} +.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);} +a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} +.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} +.thumbnail .caption{padding:9px;} +.label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.label-important{background-color:#b94a48;} +.label-warning{background-color:#f89406;} +.label-success{background-color:#468847;} +.label-info{background-color:#3a87ad;} +@-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} +.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} +.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} +.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);} +.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);} +.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);} +.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.accordion{margin-bottom:18px;} +.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.accordion-heading{border-bottom:0;} +.accordion-heading .accordion-toggle{display:block;padding:8px 15px;} +.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} +.carousel{position:relative;margin-bottom:18px;line-height:1;} +.carousel-inner{overflow:hidden;width:100%;position:relative;} +.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;} +.carousel .item>img{display:block;line-height:1;} +.carousel .active,.carousel .next,.carousel .prev{display:block;} +.carousel .active{left:0;} +.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;} +.carousel .next{left:100%;} +.carousel .prev{left:-100%;} +.carousel .next.left,.carousel .prev.right{left:0;} +.carousel .active.left{left:-100%;} +.carousel .active.right{left:100%;} +.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} +.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} +.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);} +.carousel-caption h4,.carousel-caption p{color:#ffffff;} +.hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;} +.hero-unit p{font-size:18px;font-weight:200;line-height:27px;} +.pull-right{float:right;} +.pull-left{float:left;} +.hide{display:none;} +.show{display:block;} +.invisible{visibility:hidden;} diff --git a/public/css/style.css b/public/css/style.css new file mode 100644 index 00000000..28af8659 --- /dev/null +++ b/public/css/style.css @@ -0,0 +1,37 @@ +body { + padding-top: 60px; + padding-bottom: 40px; +} + +.zf-green { + color: #68b604; +} + +.btn-success { + background-color: #57a900; + background-image: -moz-linear-gradient(top, #70d900, #57a900); + background-image: -ms-linear-gradient(top, #70d900, #57a900); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#70d900), to(#57a900)); + background-image: -webkit-linear-gradient(top, #70d900, #57a900); + background-image: -o-linear-gradient(top, #70d900, #57a900); + background-image: linear-gradient(top, #70d900, #57a900); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#70d900', endColorstr='#57a900', GradientType=0); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #57a900; +} + +.btn-success:active, .btn-success.active { + background-color: #57a900; +} + +div.container a.brand { + background: url("../images/zf2-logo.png") no-repeat scroll 0 10px transparent; + margin-left: 0; + padding: 8px 20px 12px 40px; +} diff --git a/public/images/favicon.ico b/public/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..17f119909ffcba66c8a48cba1050d724ab0a51aa GIT binary patch literal 1406 zcmeH{u@S;B3`L(4!_kq77D~2&f)%m@8>CIi3Rxj5&{O4(F&KaWl5ZuLa4BgmpX9H9 z`YL`QaC$|7#dQTcp`$WT2c=`93TJ2EqV#>w00001b5ch_0Itp) z=>Px#24YJ`L;!yP_W%GgN~tse000SaNLh0L04^f{04^f|c%?sf00007bV*G`2iyV+ z0u~zPmpWDe00Lr3L_t(I%azo>i(FL{2k_6yUMCTM712~SHnN3^LXZ#>#6mD{K>q+S zX(BTq2r-aC&_W?)Kx6SHAYz+Fn|-UGg{D#q@kj43WQ(W}QBZutvDmjev$Joqn*)z` zx!n6b_xnBHb7I_-lIg1mkJx`4z((?5a5tV$o(yi!+&@Tx2+;xVFVZx_aXf%ea3pTw zz=& z*KA7NE5{=1(-GdEtJD{D)gIf$xG8VowH+1R9lzF9d;hp8Cvg#v;TN1QJ&Es)a4EB6 zlK#nXw&z@AdSR|r`@17O)2%PzXt!R)mC_@{hd3M|rRdt~`z5`4L;AAE*sb(4E>DKr zcVERJ{Dg0?5({kJiSSaU?AW|pSMAxQrfkZjWC_xn=92RG&mP?K#vF4 za9gH`@MmYF>p7EgOP%X=)!yiw{*-V5$C87=q2#_v)&Aa-_&C;awXWJ1OP6>h_%s*lEe?=BYch#lx|Y3run(); diff --git a/public/js/html5.js b/public/js/html5.js new file mode 100644 index 00000000..6692336c --- /dev/null +++ b/public/js/html5.js @@ -0,0 +1,4 @@ +// iepp v2.1pre @jon_neal & @aFarkas github.com/aFarkas/iepp +// html5shiv @rem remysharp.com/html5-enabling-script +// Dual licensed under the MIT or GPL Version 2 licenses +/*@cc_on(function(a,b){function r(a){var b=-1;while(++b").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( +a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f +.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); diff --git a/vendor/.gitignore b/vendor/.gitignore new file mode 100644 index 00000000..4578c85a --- /dev/null +++ b/vendor/.gitignore @@ -0,0 +1,5 @@ +!.gitignore +.composer +composer +zendframework +autoload.php diff --git a/vendor/README.md b/vendor/README.md new file mode 100644 index 00000000..52144c94 --- /dev/null +++ b/vendor/README.md @@ -0,0 +1 @@ +This vendor/ directory is where third-party modules should be installed. diff --git a/vendor/doctrine/common/.gitignore b/vendor/doctrine/common/.gitignore new file mode 100644 index 00000000..fb5e79d6 --- /dev/null +++ b/vendor/doctrine/common/.gitignore @@ -0,0 +1,4 @@ +build/ +logs/ +reports/ +dist/ diff --git a/vendor/doctrine/common/.gitmodules b/vendor/doctrine/common/.gitmodules new file mode 100644 index 00000000..51f08435 --- /dev/null +++ b/vendor/doctrine/common/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/vendor/doctrine-build-common"] + path = lib/vendor/doctrine-build-common + url = git://github.com/doctrine/doctrine-build-common.git diff --git a/vendor/doctrine/common/.travis.yml b/vendor/doctrine/common/.travis.yml new file mode 100644 index 00000000..4464d4f7 --- /dev/null +++ b/vendor/doctrine/common/.travis.yml @@ -0,0 +1,5 @@ +language: php + +php: + - 5.3 + - 5.4 diff --git a/vendor/doctrine/common/LICENSE b/vendor/doctrine/common/LICENSE new file mode 100644 index 00000000..1c03f74b --- /dev/null +++ b/vendor/doctrine/common/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/vendor/doctrine/common/README.md b/vendor/doctrine/common/README.md new file mode 100644 index 00000000..c63f7627 --- /dev/null +++ b/vendor/doctrine/common/README.md @@ -0,0 +1,12 @@ +# Doctrine Common + +[![Build Status](https://secure.travis-ci.org/doctrine/common.png)](http://travis-ci.org/doctrine/common) + +The Doctrine Common project is a library that provides extensions to core PHP functionality. + +## More resources: + +* [Website](http://www.doctrine-project.org) +* [Documentation](http://www.doctrine-project.org/projects/common/current/docs/en) +* [Issue Tracker](http://www.doctrine-project.org/jira/browse/DCOM) +* [Downloads](http://github.com/doctrine/common/downloads) diff --git a/vendor/doctrine/common/UPGRADE_TO_2_1 b/vendor/doctrine/common/UPGRADE_TO_2_1 new file mode 100644 index 00000000..891a2e5c --- /dev/null +++ b/vendor/doctrine/common/UPGRADE_TO_2_1 @@ -0,0 +1,39 @@ +This document details all the possible changes that you should investigate when updating +your project from Doctrine Common 2.0.x to 2.1 + +## AnnotationReader changes + +The annotation reader was heavily refactored between 2.0 and 2.1-RC1. In theory the operation of the new reader should be backwards compatible, but it has to be setup differently to work that way: + + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\'); + // new code necessary starting here + $reader->setIgnoreNotImportedAnnotations(true); + $reader->setEnableParsePhpImports(false); + $reader = new \Doctrine\Common\Annotations\CachedReader( + new \Doctrine\Common\Annotations\IndexedReader($reader), new ArrayCache() + ); + +## Annotation Base class or @Annotation + +Beginning after 2.1-RC2 you have to either extend ``Doctrine\Common\Annotations\Annotation`` or add @Annotation to your annotations class-level docblock, otherwise the class will simply be ignored. + +## Removed methods on AnnotationReader + +* AnnotationReader::setAutoloadAnnotations() +* AnnotationReader::getAutoloadAnnotations() +* AnnotationReader::isAutoloadAnnotations() + +## AnnotationRegistry + +Autoloading through the PHP autoloader is removed from the 2.1 AnnotationReader. Instead you have to use the global AnnotationRegistry for loading purposes: + + \Doctrine\Common\Annotations\AnnotationRegistry::registerFile($fileWithAnnotations); + \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespace($namespace, $dirs = null); + \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespaces($namespaces); + \Doctrine\Common\Annotations\AnnotationRegistry::registerLoader($callable); + +The $callable for registering a loader accepts a class as first and only parameter and must try to silently autoload it. On success true has to be returned. +The registerAutoloadNamespace function registers a PSR-0 compatible silent autoloader for all classes with the given namespace in the given directories. +If null is passed as directory the include path will be used. + diff --git a/vendor/doctrine/common/UPGRADE_TO_2_2 b/vendor/doctrine/common/UPGRADE_TO_2_2 new file mode 100644 index 00000000..1d93a131 --- /dev/null +++ b/vendor/doctrine/common/UPGRADE_TO_2_2 @@ -0,0 +1,61 @@ +This document details all the possible changes that you should investigate when +updating your project from Doctrine Common 2.1 to 2.2: + +## Annotation Changes + +- AnnotationReader::setIgnoreNotImportedAnnotations has been removed, you need to + add ignore annotation names which are supposed to be ignored via + AnnotationReader::addGlobalIgnoredName + +- AnnotationReader::setAutoloadAnnotations was deprecated by the AnnotationRegistry + in 2.1 and has been removed in 2.2 + +- AnnotationReader::setEnableParsePhpImports was added to ease transition to the new + annotation mechanism in 2.1 and is removed in 2.2 + +- AnnotationReader::isParsePhpImportsEnabled is removed (see above) + +- AnnotationReader::setDefaultAnnotationNamespace was deprecated in favor of explicit + configuration in 2.1 and will be removed in 2.2 (for isolated projects where you + have full-control over _all_ available annotations, we offer a dedicated reader + class ``SimpleAnnotationReader``) + +- AnnotationReader::setAnnotationCreationFunction was deprecated in 2.1 and will be + removed in 2.2. We only offer two creation mechanisms which cannot be changed + anymore to allow the same reader instance to work with all annotations regardless + of which library they are coming from. + +- AnnotationReader::setAnnotationNamespaceAlias was deprecated in 2.1 and will be + removed in 2.2 (see setDefaultAnnotationNamespace) + +- If you use a class as annotation which has not the @Annotation marker in it's + class block, we will now throw an exception instead of silently ignoring it. You + can however still achieve the previous behavior using the @IgnoreAnnotation, or + AnnotationReader::addGlobalIgnoredName (the exception message will contain detailed + instructions when you run into this problem). + +## Cache Changes + +- Renamed old AbstractCache to CacheProvider + +- Dropped the support to the following functions of all cache providers: + + - CacheProvider::deleteByWildcard + + - CacheProvider::deleteByRegEx + + - CacheProvider::deleteByPrefix + + - CacheProvider::deleteBySuffix + +- CacheProvider::deleteAll will not remove ALL entries, it will only mark them as invalid + +- CacheProvider::flushAll will remove ALL entries, namespaced or not + +- Added support to MemcachedCache + +- Added support to WincacheCache + +## ClassLoader Changes + +- ClassLoader::fileExistsInIncludePath() no longer exists. Use the native stream_resolve_include_path() PHP function \ No newline at end of file diff --git a/vendor/doctrine/common/build.properties b/vendor/doctrine/common/build.properties new file mode 100644 index 00000000..ff311a45 --- /dev/null +++ b/vendor/doctrine/common/build.properties @@ -0,0 +1,6 @@ +# Project Name +project.name=DoctrineCommon + +# Version class and file +project.version_class = Doctrine\Common\Version +project.version_file = lib/Doctrine/Common/Version.php diff --git a/vendor/doctrine/common/build.xml b/vendor/doctrine/common/build.xml new file mode 100644 index 00000000..71a9a500 --- /dev/null +++ b/vendor/doctrine/common/build.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DoctrineCommon + Doctrine Common PHP Extensions + pear.doctrine-project.org + The Doctrine Common package contains shared code between the other packages. + + + + + LGPL + + + - + + + + + + + diff --git a/vendor/doctrine/common/composer.json b/vendor/doctrine/common/composer.json new file mode 100644 index 00000000..f995f6c6 --- /dev/null +++ b/vendor/doctrine/common/composer.json @@ -0,0 +1,21 @@ +{ + "name": "doctrine/common", + "type": "library","version":"2.2.3", + "description": "Common Library for Doctrine projects", + "keywords": ["collections", "spl", "eventmanager", "annotations", "persistence"], + "homepage": "http://www.doctrine-project.org", + "license": "LGPL", + "authors": [ + {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"}, + {"name": "Roman Borschel", "email": "roman@code-factory.org"}, + {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"}, + {"name": "Jonathan Wage", "email": "jonwage@gmail.com"}, + {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"} + ], + "require": { + "php": ">=5.3.2" + }, + "autoload": { + "psr-0": { "Doctrine\\Common": "lib/" } + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php new file mode 100644 index 00000000..62512522 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php @@ -0,0 +1,75 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Annotations class + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class Annotation +{ + /** + * Value property. Common among all derived classes. + * + * @var string + */ + public $value; + + /** + * Constructor + * + * @param array $data Key-value for properties to be defined in this class + */ + public final function __construct(array $data) + { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + /** + * Error handler for unknown property accessor in Annotation class. + * + * @param string $name Unknown property name + */ + public function __get($name) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } + + /** + * Error handler for unknown property mutator in Annotation class. + * + * @param string $name Unkown property name + * @param mixed $value Property value + */ + public function __set($name, $value) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php new file mode 100644 index 00000000..21597b14 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php @@ -0,0 +1,47 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the attribute type during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attribute +{ + /** + * @var string + */ + public $name; + + /** + * @var string + */ + public $type; + + /** + * @var boolean + */ + public $required = false; +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php new file mode 100644 index 00000000..6e314be4 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php @@ -0,0 +1,37 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the types of all declared attributes during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attributes +{ + /** + * @var array + */ + public $value; +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php new file mode 100644 index 00000000..1b2b20ac --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php @@ -0,0 +1,44 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser to ignore specific + * annotations during the parsing process. + * + * @Annotation + * @author Johannes M. Schmitt + */ +final class IgnoreAnnotation +{ + public $names; + + public function __construct(array $values) + { + if (is_string($values['value'])) { + $values['value'] = array($values['value']); + } + if (!is_array($values['value'])) { + throw new \RuntimeException(sprintf('@IgnoreAnnotation expects either a string name, or an array of strings, but got %s.', json_encode($values['value']))); + } + + $this->names = $values['value']; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php new file mode 100644 index 00000000..7b89a022 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php @@ -0,0 +1,33 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check if that attribute is required during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Required +{ +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php new file mode 100644 index 00000000..c41896ad --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php @@ -0,0 +1,105 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the annotation target during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Target +{ + const TARGET_CLASS = 1; + const TARGET_METHOD = 2; + const TARGET_PROPERTY = 4; + const TARGET_ANNOTATION = 8; + const TARGET_ALL = 15; + + /** + * @var array + */ + private static $map = array( + 'ALL' => self::TARGET_ALL, + 'CLASS' => self::TARGET_CLASS, + 'METHOD' => self::TARGET_METHOD, + 'PROPERTY' => self::TARGET_PROPERTY, + 'ANNOTATION' => self::TARGET_ANNOTATION, + ); + + /** + * @var array + */ + public $value; + + /** + * Targets as bitmask. + * + * @var integer + */ + public $targets; + + /** + * Literal target declaration. + * + * @var integer + */ + public $literal; + + /** + * Annotation construct + * + * @param array $values + */ + public function __construct(array $values) + { + if (!isset($values['value'])){ + $values['value'] = null; + } + if (is_string($values['value'])){ + $values['value'] = array($values['value']); + } + if (!is_array($values['value'])){ + throw new \InvalidArgumentException( + sprintf('@Target expects either a string value, or an array of strings, "%s" given.', + is_object($values['value']) ? get_class($values['value']) : gettype($values['value']) + ) + ); + } + + $bitmask = 0; + foreach ($values['value'] as $literal) { + if(!isset(self::$map[$literal])){ + throw new \InvalidArgumentException( + sprintf('Invalid Target "%s". Available targets: [%s]', + $literal, implode(', ', array_keys(self::$map))) + ); + } + $bitmask += self::$map[$literal]; + } + + $this->targets = $bitmask; + $this->value = $values['value']; + $this->literal = implode(', ', $this->value); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php new file mode 100644 index 00000000..fdc1913a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php @@ -0,0 +1,111 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Description of AnnotationException + * + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class AnnotationException extends \Exception +{ + /** + * Creates a new AnnotationException describing a Syntax error. + * + * @param string $message Exception message + * @return AnnotationException + */ + public static function syntaxError($message) + { + return new self('[Syntax Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing a Semantical error. + * + * @param string $message Exception message + * @return AnnotationException + */ + public static function semanticalError($message) + { + return new self('[Semantical Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing an error which occurred during + * the creation of the annotation. + * + * @since 2.2 + * @param string $message + * @return AnnotationException + */ + public static function creationError($message) + { + return new self('[Creation Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing an type error of an attribute. + * + * @since 2.2 + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * @param mixed $actual + * @return AnnotationException + */ + public static function typeError($attributeName, $annotationName, $context, $expected, $actual) + { + return new self(sprintf( + '[Type Error] Attribute "%s" of @%s declared on %s expects %s, but got %s.', + $attributeName, + $annotationName, + $context, + $expected, + is_object($actual) ? 'an instance of '.get_class($actual) : gettype($actual) + )); + } + + /** + * Creates a new AnnotationException describing an required error of an attribute. + * + * @since 2.2 + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * @return AnnotationException + */ + public static function requiredError($attributeName, $annotationName, $context, $expected) + { + return new self(sprintf( + '[Type Error] Attribute "%s" of @%s declared on %s expects %s. This value should not be null.', + $attributeName, + $annotationName, + $context, + $expected + )); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php new file mode 100644 index 00000000..be87728b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php @@ -0,0 +1,303 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\IgnoreAnnotation; +use Doctrine\Common\Annotations\Annotation\Target; +use Closure; +use ReflectionClass; +use ReflectionMethod; +use ReflectionProperty; + +/** + * A reader for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +final class AnnotationReader implements Reader +{ + /** + * Global map for imports. + * + * @var array + */ + private static $globalImports = array( + 'ignoreannotation' => 'Doctrine\Common\Annotations\Annotation\IgnoreAnnotation', + ); + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names are case sensitive. + * + * @var array + */ + private static $globalIgnoredNames = array( + 'access'=> true, 'author'=> true, 'copyright'=> true, 'deprecated'=> true, + 'example'=> true, 'ignore'=> true, 'internal'=> true, 'link'=> true, 'see'=> true, + 'since'=> true, 'tutorial'=> true, 'version'=> true, 'package'=> true, + 'subpackage'=> true, 'name'=> true, 'global'=> true, 'param'=> true, + 'return'=> true, 'staticvar'=> true, 'category'=> true, 'staticVar'=> true, + 'static'=> true, 'var'=> true, 'throws'=> true, 'inheritdoc'=> true, + 'inheritDoc'=> true, 'license'=> true, 'todo'=> true, 'deprecated'=> true, + 'deprec'=> true, 'author'=> true, 'property' => true, 'method' => true, + 'abstract'=> true, 'exception'=> true, 'magic' => true, 'api' => true, + 'final'=> true, 'filesource'=> true, 'throw' => true, 'uses' => true, + 'usedby'=> true, 'private' => true, 'Annotation' => true, 'override' => true, + 'codeCoverageIgnore' => true, 'codeCoverageIgnoreStart' => true, 'codeCoverageIgnoreEnd' => true, + 'Required' => true, 'Attribute' => true, 'Attributes' => true, + 'Target' => true, 'SuppressWarnings' => true, + 'ingroup' => true, 'code' => true, 'endcode' => true, + 'package_version' => true, + ); + + /** + * Add a new annotation to the globally ignored annotation names with regard to exception handling. + * + * @param string $name + */ + static public function addGlobalIgnoredName($name) + { + self::$globalIgnoredNames[$name] = true; + } + + /** + * Annotations Parser + * + * @var Doctrine\Common\Annotations\DocParser + */ + private $parser; + + /** + * Annotations Parser used to collect parsing metadata + * + * @var Doctrine\Common\Annotations\DocParser + */ + private $preParser; + + /** + * PHP Parser used to collect imports. + * + * @var Doctrine\Common\Annotations\PhpParser + */ + private $phpParser; + + /** + * In-memory cache mechanism to store imported annotations per class. + * + * @var array + */ + private $imports = array(); + + /** + * In-memory cache mechanism to store ignored annotations per class. + * + * @var array + */ + private $ignoredAnnotationNames = array(); + + /** + * Constructor. + * + * Initializes a new AnnotationReader. + */ + public function __construct() + { + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/IgnoreAnnotation.php'); + + $this->parser = new DocParser; + + $this->preParser = new DocParser; + $this->preParser->setImports(self::$globalImports); + $this->preParser->setIgnoreNotImportedAnnotations(true); + + $this->phpParser = new PhpParser; + } + + /** + * Gets the annotations applied to a class. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @return array An array of Annotations. + */ + public function getClassAnnotations(ReflectionClass $class) + { + $this->parser->setTarget(Target::TARGET_CLASS); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($class->getDocComment(), 'class ' . $class->getName()); + } + + /** + * Gets a class annotation. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getClassAnnotation(ReflectionClass $class, $annotationName) + { + $annotations = $this->getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets the annotations applied to a property. + * + * @param ReflectionProperty $property The ReflectionProperty of the property + * from which the annotations should be read. + * @return array An array of Annotations. + */ + public function getPropertyAnnotations(ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + $this->parser->setTarget(Target::TARGET_PROPERTY); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($property->getDocComment(), $context); + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets the annotations applied to a method. + * + * @param ReflectionMethod $property The ReflectionMethod of the method from which + * the annotations should be read. + * @return array An array of Annotations. + */ + public function getMethodAnnotations(ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + $this->parser->setTarget(Target::TARGET_METHOD); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($method->getDocComment(), $context); + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Returns the ignored annotations for the given class. + * + * @param ReflectionClass $class + * @return array + */ + private function getIgnoredAnnotationNames(ReflectionClass $class) + { + if (isset($this->ignoredAnnotationNames[$name = $class->getName()])) { + return $this->ignoredAnnotationNames[$name]; + } + $this->collectParsingMetadata($class); + + return $this->ignoredAnnotationNames[$name]; + } + + private function getImports(ReflectionClass $class) + { + if (isset($this->imports[$name = $class->getName()])) { + return $this->imports[$name]; + } + $this->collectParsingMetadata($class); + + return $this->imports[$name]; + } + + /** + * Collects parsing metadata for a given class + * + * @param ReflectionClass $class + */ + private function collectParsingMetadata(ReflectionClass $class) + { + $ignoredAnnotationNames = self::$globalIgnoredNames; + + $annotations = $this->preParser->parse($class->getDocComment(), 'class '.$class->name); + foreach ($annotations as $annotation) { + if ($annotation instanceof IgnoreAnnotation) { + foreach ($annotation->names AS $annot) { + $ignoredAnnotationNames[$annot] = true; + } + } + } + + $name = $class->getName(); + $this->imports[$name] = array_merge( + self::$globalImports, + $this->phpParser->parseClass($class), + array('__NAMESPACE__' => $class->getNamespaceName()) + ); + $this->ignoredAnnotationNames[$name] = $ignoredAnnotationNames; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php new file mode 100644 index 00000000..60b00f51 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php @@ -0,0 +1,129 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +final class AnnotationRegistry +{ + /** + * A map of namespaces to use for autoloading purposes based on a PSR-0 convention. + * + * Contains the namespace as key and an array of directories as value. If the value is NULL + * the include path is used for checking for the corresponding file. + * + * This autoloading mechanism does not utilize the PHP autoloading but implements autoloading on its own. + * + * @var array + */ + static private $autoloadNamespaces = array(); + + /** + * A map of autoloader callables. + * + * @var array + */ + static private $loaders = array(); + + static public function reset() + { + self::$autoloadNamespaces = array(); + self::$loaders = array(); + } + + static public function registerFile($file) + { + require_once $file; + } + + /** + * Add a namespace with one or many directories to look for files or null for the include path. + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param string $namespace + * @param string|array|null $dirs + */ + static public function registerAutoloadNamespace($namespace, $dirs = null) + { + self::$autoloadNamespaces[$namespace] = $dirs; + } + + /** + * Register multiple namespaces + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param array $namespaces + */ + static public function registerAutoloadNamespaces(array $namespaces) + { + self::$autoloadNamespaces = array_merge(self::$autoloadNamespaces, $namespaces); + } + + /** + * Register an autoloading callabale for annotations, much like spl_autoload_register(). + * + * NOTE: These class loaders HAVE to be silent when a class was not found! + * IMPORTANT: Loaders have to return true if they loaded a class that could contain the searched annotation class. + * + * @param callabale $callabale + */ + static public function registerLoader($callabale) + { + if (!is_callable($callabale)) { + throw new \InvalidArgumentException("A callable is expected in AnnotationRegistry::registerLoader()."); + } + self::$loaders[] = $callabale; + } + + /** + * Autoload an annotation class silently. + * + * @param string $class + * @return void + */ + static public function loadAnnotationClass($class) + { + foreach (self::$autoloadNamespaces AS $namespace => $dirs) { + if (strpos($class, $namespace) === 0) { + $file = str_replace("\\", DIRECTORY_SEPARATOR, $class) . ".php"; + if ($dirs === null) { + if ($path = stream_resolve_include_path($file)) { + require $path; + return true; + } + } else { + foreach((array)$dirs AS $dir) { + if (file_exists($dir . DIRECTORY_SEPARATOR . $file)) { + require $dir . DIRECTORY_SEPARATOR . $file; + return true; + } + } + } + } + } + + foreach (self::$loaders AS $loader) { + if (call_user_func($loader, $class) === true) { + return true; + } + } + return false; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php new file mode 100644 index 00000000..6ea47c6a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php @@ -0,0 +1,179 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Cache\Cache; + +/** + * A cache aware annotation reader. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + */ +final class CachedReader implements Reader +{ + private static $CACHE_SALT = '@[Annot]'; + + /** + * @var Reader + */ + private $delegate; + + /** + * @var Cache + */ + private $cache; + + /** + * @var boolean + */ + private $debug; + + /** + * @var array + */ + private $loadedAnnotations; + + /** + * @param Reader $reader + * @param Cache $cache + */ + public function __construct(Reader $reader, Cache $cache, $debug = false) + { + $this->delegate = $reader; + $this->cache = $cache; + $this->debug = $debug; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $cacheKey = $class->getName() . self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getClassAnnotations($class); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $cacheKey = $class->getName().'$'.$property->getName().self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getPropertyAnnotations($property); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $cacheKey = $class->getName().'#'.$method->getName().self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getMethodAnnotations($method); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = array(); + } + + private function isCacheFresh($cacheKey, \ReflectionClass $class) + { + if (false === $filename = $class->getFilename()) { + return true; + } + + return $this->cache->fetch('[C]'.$cacheKey) >= filemtime($filename); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php new file mode 100644 index 00000000..c6223e36 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php @@ -0,0 +1,140 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Lexer; + +/** + * Simple lexer for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +final class DocLexer extends Lexer +{ + const T_NONE = 1; + const T_IDENTIFIER = 2; + const T_INTEGER = 3; + const T_STRING = 4; + const T_FLOAT = 5; + + const T_AT = 101; + const T_CLOSE_CURLY_BRACES = 102; + const T_CLOSE_PARENTHESIS = 103; + const T_COMMA = 104; + const T_EQUALS = 105; + const T_FALSE = 106; + const T_NAMESPACE_SEPARATOR = 107; + const T_OPEN_CURLY_BRACES = 108; + const T_OPEN_PARENTHESIS = 109; + const T_TRUE = 110; + const T_NULL = 111; + const T_COLON = 112; + + /** + * @inheritdoc + */ + protected function getCatchablePatterns() + { + return array( + '[a-z_][a-z0-9_:]*', + '(?:[+-]?[0-9]+(?:[\.][0-9]+)*)(?:[eE][+-]?[0-9]+)?', + '"(?:[^"]|"")*"', + ); + } + + /** + * @inheritdoc + */ + protected function getNonCatchablePatterns() + { + return array('\s+', '\*+', '(.)'); + } + + /** + * @inheritdoc + */ + protected function getType(&$value) + { + $type = self::T_NONE; + + // Checking numeric value + if (is_numeric($value)) { + return (strpos($value, '.') !== false || stripos($value, 'e') !== false) + ? self::T_FLOAT : self::T_INTEGER; + } + + if ($value[0] === '"') { + $value = str_replace('""', '"', substr($value, 1, strlen($value) - 2)); + + return self::T_STRING; + } else { + switch (strtolower($value)) { + case '@': + return self::T_AT; + + case ',': + return self::T_COMMA; + + case '(': + return self::T_OPEN_PARENTHESIS; + + case ')': + return self::T_CLOSE_PARENTHESIS; + + case '{': + return self::T_OPEN_CURLY_BRACES; + + case '}': + return self::T_CLOSE_CURLY_BRACES; + + case '=': + return self::T_EQUALS; + + case '\\': + return self::T_NAMESPACE_SEPARATOR; + + case 'true': + return self::T_TRUE; + + case 'false': + return self::T_FALSE; + + case 'null': + return self::T_NULL; + + case ':': + return self::T_COLON; + + default: + if (ctype_alpha($value[0]) || $value[0] === '_') { + return self::T_IDENTIFIER; + } + + break; + } + } + + return $type; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php new file mode 100644 index 00000000..9d16b176 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php @@ -0,0 +1,891 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Closure; +use ReflectionClass; +use Doctrine\Common\Annotations\Annotation\Target; +use Doctrine\Common\Annotations\Annotation\Attribute; +use Doctrine\Common\Annotations\Annotation\Attributes; + +/** + * A parser for docblock annotations. + * + * It is strongly discouraged to change the default annotation parsing process. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +final class DocParser +{ + /** + * An array of all valid tokens for a class name. + * + * @var array + */ + private static $classIdentifiers = array(DocLexer::T_IDENTIFIER, DocLexer::T_TRUE, DocLexer::T_FALSE, DocLexer::T_NULL); + + /** + * The lexer. + * + * @var Doctrine\Common\Annotations\DocLexer + */ + private $lexer; + + /** + * Current target context + * + * @var string + */ + private $target; + + /** + * Doc Parser used to collect annotation target + * + * @var Doctrine\Common\Annotations\DocParser + */ + private static $metadataParser; + + /** + * Flag to control if the current annotation is nested or not. + * + * @var boolean + */ + private $isNestedAnnotation = false; + + /** + * Hashmap containing all use-statements that are to be used when parsing + * the given doc block. + * + * @var array + */ + private $imports = array(); + + /** + * This hashmap is used internally to cache results of class_exists() + * look-ups. + * + * @var array + */ + private $classExists = array(); + + /** + * Whether annotations that have not been imported should be ignored. + * + * @var boolean + */ + private $ignoreNotImportedAnnotations = false; + + /** + * An array of default namespaces if operating in simple mode. + * + * @var array + */ + private $namespaces = array(); + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names must be the raw names as used in the class, not the fully qualified + * class names. + * + * @var array + */ + private $ignoredAnnotationNames = array(); + + /** + * @var string + */ + private $context = ''; + + /** + * Hash-map for caching annotation metadata + * @var array + */ + private static $annotationMetadata = array( + 'Doctrine\Common\Annotations\Annotation\Target' => array( + 'is_annotation' => true, + 'has_constructor' => true, + 'properties' => array(), + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'attribute_types' => array( + 'value' => array( + 'required' => false, + 'type' =>'array', + 'array_type'=>'string', + 'value' =>'array' + ) + ), + ), + 'Doctrine\Common\Annotations\Annotation\Attribute' => array( + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_ANNOTATION', + 'targets' => Target::TARGET_ANNOTATION, + 'default_property' => 'name', + 'properties' => array( + 'name' => 'name', + 'type' => 'type', + 'required' => 'required' + ), + 'attribute_types' => array( + 'value' => array( + 'required' => true, + 'type' =>'string', + 'value' =>'string' + ), + 'type' => array( + 'required' =>true, + 'type' =>'string', + 'value' =>'string' + ), + 'required' => array( + 'required' =>false, + 'type' =>'boolean', + 'value' =>'boolean' + ) + ), + ), + 'Doctrine\Common\Annotations\Annotation\Attributes' => array( + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'properties' => array( + 'value' => 'value' + ), + 'attribute_types' => array( + 'value' => array( + 'type' =>'array', + 'required' =>true, + 'array_type'=>'Doctrine\Common\Annotations\Annotation\Attribute', + 'value' =>'array' + ) + ), + ), + ); + + /** + * Hash-map for handle types declaration + * + * @var array + */ + private static $typeMap = array( + 'float' => 'double', + 'bool' => 'boolean', + // allow uppercase Boolean in honor of George Boole + 'Boolean' => 'boolean', + 'int' => 'integer', + ); + + /** + * Constructs a new DocParser. + */ + public function __construct() + { + $this->lexer = new DocLexer; + } + + /** + * Sets the annotation names that are ignored during the parsing process. + * + * The names are supposed to be the raw names as used in the class, not the + * fully qualified class names. + * + * @param array $names + */ + public function setIgnoredAnnotationNames(array $names) + { + $this->ignoredAnnotationNames = $names; + } + + public function setIgnoreNotImportedAnnotations($bool) + { + $this->ignoreNotImportedAnnotations = (Boolean) $bool; + } + + /** + * Sets the default namespaces. + * @param array $namespaces + */ + public function addNamespace($namespace) + { + if ($this->imports) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + $this->namespaces[] = $namespace; + } + + public function setImports(array $imports) + { + if ($this->namespaces) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + $this->imports = $imports; + } + + /** + * Sets current target context as bitmask. + * + * @param integer $target + */ + public function setTarget($target) + { + $this->target = $target; + } + + /** + * Parses the given docblock string for annotations. + * + * @param string $input The docblock string to parse. + * @param string $context The parsing context. + * @return array Array of annotations. If no annotations are found, an empty array is returned. + */ + public function parse($input, $context = '') + { + if (false === $pos = strpos($input, '@')) { + return array(); + } + + // also parse whatever character is before the @ + if ($pos > 0) { + $pos -= 1; + } + + $this->context = $context; + $this->lexer->setInput(trim(substr($input, $pos), '* /')); + $this->lexer->moveNext(); + + return $this->Annotations(); + } + + /** + * Attempts to match the given token with the current lookahead token. + * If they match, updates the lookahead token; otherwise raises a syntax error. + * + * @param int Token type. + * @return bool True if tokens match; false otherwise. + */ + private function match($token) + { + if ( ! $this->lexer->isNextToken($token) ) { + $this->syntaxError($this->lexer->getLiteral($token)); + } + + return $this->lexer->moveNext(); + } + + /** + * Attempts to match the current lookahead token with any of the given tokens. + * + * If any of them matches, this method updates the lookahead token; otherwise + * a syntax error is raised. + * + * @param array $tokens + * @return bool + */ + private function matchAny(array $tokens) + { + if ( ! $this->lexer->isNextTokenAny($tokens)) { + $this->syntaxError(implode(' or ', array_map(array($this->lexer, 'getLiteral'), $tokens))); + } + + return $this->lexer->moveNext(); + } + + /** + * Generates a new syntax error. + * + * @param string $expected Expected string. + * @param array $token Optional token. + * @throws SyntaxException + */ + private function syntaxError($expected, $token = null) + { + if ($token === null) { + $token = $this->lexer->lookahead; + } + + $message = "Expected {$expected}, got "; + + if ($this->lexer->lookahead === null) { + $message .= 'end of string'; + } else { + $message .= "'{$token['value']}' at position {$token['position']}"; + } + + if (strlen($this->context)) { + $message .= ' in ' . $this->context; + } + + $message .= '.'; + + throw AnnotationException::syntaxError($message); + } + + /** + * Attempt to check if a class exists or not. This never goes through the PHP autoloading mechanism + * but uses the {@link AnnotationRegistry} to load classes. + * + * @param string $fqcn + * @return boolean + */ + private function classExists($fqcn) + { + if (isset($this->classExists[$fqcn])) { + return $this->classExists[$fqcn]; + } + + // first check if the class already exists, maybe loaded through another AnnotationReader + if (class_exists($fqcn, false)) { + return $this->classExists[$fqcn] = true; + } + + // final check, does this class exist? + return $this->classExists[$fqcn] = AnnotationRegistry::loadAnnotationClass($fqcn); + } + + /** + * Collects parsing metadata for a given annotation class + * + * @param string $name The annotation name + */ + private function collectAnnotationMetadata($name) + { + if (self::$metadataParser == null){ + self::$metadataParser = new self(); + self::$metadataParser->setTarget(Target::TARGET_CLASS); + self::$metadataParser->setIgnoreNotImportedAnnotations(true); + self::$metadataParser->setImports(array( + 'target' => 'Doctrine\Common\Annotations\Annotation\Target', + 'attribute' => 'Doctrine\Common\Annotations\Annotation\Attribute', + 'attributes' => 'Doctrine\Common\Annotations\Annotation\Attributes' + )); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Target.php'); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attribute.php'); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attributes.php'); + } + + $class = new \ReflectionClass($name); + $docComment = $class->getDocComment(); + + // Sets default values for annotation metadata + $metadata = array( + 'default_property' => null, + 'has_constructor' => (null !== $constructor = $class->getConstructor()) && $constructor->getNumberOfParameters() > 0, + 'properties' => array(), + 'property_types' => array(), + 'attribute_types' => array(), + 'targets_literal' => null, + 'targets' => Target::TARGET_ALL, + 'is_annotation' => false !== strpos($docComment, '@Annotation'), + ); + + // verify that the class is really meant to be an annotation + if ($metadata['is_annotation']) { + foreach (self::$metadataParser->parse($docComment, 'class @' . $name) as $annotation) { + if ($annotation instanceof Target) { + $metadata['targets'] = $annotation->targets; + $metadata['targets_literal'] = $annotation->literal; + + } elseif ($annotation instanceof Attributes) { + foreach ($annotation->value as $attrib) { + // handle internal type declaration + $type = isset(self::$typeMap[$attrib->type]) ? self::$typeMap[$attrib->type] : $attrib->type; + + // handle the case if the property type is mixed + if ('mixed' !== $type) { + // Checks if the property has array + if (false !== $pos = strpos($type, '<')) { + $arrayType = substr($type, $pos+1, -1); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$attrib->name]['array_type'] = $arrayType; + } + + $metadata['attribute_types'][$attrib->name]['type'] = $type; + $metadata['attribute_types'][$attrib->name]['value'] = $attrib->type; + $metadata['attribute_types'][$attrib->name]['required'] = $attrib->required; + } + } + } + } + + // if not has a constructor will inject values into public properties + if (false === $metadata['has_constructor']) { + // collect all public properties + foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) { + $metadata['properties'][$property->name] = $property->name; + + // checks if the property has @var annotation + if ((false !== $propertyComment = $property->getDocComment()) + && false !== strpos($propertyComment, '@var') + && preg_match('/@var\s+([^\s]+)/',$propertyComment, $matches)) { + // literal type declaration + $value = $matches[1]; + + // handle internal type declaration + $type = isset(self::$typeMap[$value]) ? self::$typeMap[$value] : $value; + + // handle the case if the property type is mixed + if ('mixed' !== $type) { + // Checks if the property has @var array annotation + if (false !== $pos = strpos($type, '<')) { + $arrayType = substr($type, $pos+1, -1); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$property->name]['array_type'] = $arrayType; + } + + $metadata['attribute_types'][$property->name]['type'] = $type; + $metadata['attribute_types'][$property->name]['value'] = $value; + $metadata['attribute_types'][$property->name]['required'] = false !== strpos($propertyComment, '@Required'); + } + } + } + + // choose the first property as default property + $metadata['default_property'] = reset($metadata['properties']); + } + } + + self::$annotationMetadata[$name] = $metadata; + } + + /** + * Annotations ::= Annotation {[ "*" ]* [Annotation]}* + * + * @return array + */ + private function Annotations() + { + $annotations = array(); + + while (null !== $this->lexer->lookahead) { + if (DocLexer::T_AT !== $this->lexer->lookahead['type']) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is preceded by non-catchable pattern + if (null !== $this->lexer->token && $this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value'])) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is followed by either a namespace separator, or + // an identifier token + if ((null === $peek = $this->lexer->glimpse()) + || (DocLexer::T_NAMESPACE_SEPARATOR !== $peek['type'] && !in_array($peek['type'], self::$classIdentifiers, true)) + || $peek['position'] !== $this->lexer->lookahead['position'] + 1) { + $this->lexer->moveNext(); + continue; + } + + $this->isNestedAnnotation = false; + if (false !== $annot = $this->Annotation()) { + $annotations[] = $annot; + } + } + + return $annotations; + } + + /** + * Annotation ::= "@" AnnotationName ["(" [Values] ")"] + * AnnotationName ::= QualifiedName | SimpleName + * QualifiedName ::= NameSpacePart "\" {NameSpacePart "\"}* SimpleName + * NameSpacePart ::= identifier | null | false | true + * SimpleName ::= identifier | null | false | true + * + * @return mixed False if it is not a valid annotation. + */ + private function Annotation() + { + $this->match(DocLexer::T_AT); + + // check if we have an annotation + if ($this->lexer->isNextTokenAny(self::$classIdentifiers)) { + $this->lexer->moveNext(); + $name = $this->lexer->token['value']; + } else if ($this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) { + $name = ''; + } else { + $this->syntaxError('namespace separator or identifier'); + } + + while ($this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value']) && $this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) { + $this->match(DocLexer::T_NAMESPACE_SEPARATOR); + $this->matchAny(self::$classIdentifiers); + $name .= '\\'.$this->lexer->token['value']; + } + + // only process names which are not fully qualified, yet + // fully qualified names must start with a \ + $originalName = $name; + if ('\\' !== $name[0]) { + $alias = (false === $pos = strpos($name, '\\'))? $name : substr($name, 0, $pos); + + $found = false; + if ($this->namespaces) { + foreach ($this->namespaces as $namespace) { + if ($this->classExists($namespace.'\\'.$name)) { + $name = $namespace.'\\'.$name; + $found = true; + break; + } + } + } elseif (isset($this->imports[$loweredAlias = strtolower($alias)])) { + if (false !== $pos) { + $name = $this->imports[$loweredAlias].substr($name, $pos); + } else { + $name = $this->imports[$loweredAlias]; + } + $found = true; + } elseif (isset($this->imports['__NAMESPACE__']) && $this->classExists($this->imports['__NAMESPACE__'].'\\'.$name)) { + $name = $this->imports['__NAMESPACE__'].'\\'.$name; + $found = true; + } elseif ($this->classExists($name)) { + $found = true; + } + + if (!$found) { + if ($this->ignoreNotImportedAnnotations || isset($this->ignoredAnnotationNames[$name])) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s was never imported. Did you maybe forget to add a "use" statement for this annotation?', $name, $this->context)); + } + } + + if (!$this->classExists($name)) { + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s does not exist, or could not be auto-loaded.', $name, $this->context)); + } + + // at this point, $name contains the fully qualified class name of the + // annotation, and it is also guaranteed that this class exists, and + // that it is loaded + + + // collects the metadata annotation only if there is not yet + if (!isset(self::$annotationMetadata[$name])) { + $this->collectAnnotationMetadata($name); + } + + // verify that the class is really meant to be an annotation and not just any ordinary class + if (self::$annotationMetadata[$name]['is_annotation'] === false) { + if (isset($this->ignoredAnnotationNames[$originalName])) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The class "%s" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "%s". If it is indeed no annotation, then you need to add @IgnoreAnnotation("%s") to the _class_ doc comment of %s.', $name, $name, $originalName, $this->context)); + } + + //if target is nested annotation + $target = $this->isNestedAnnotation ? Target::TARGET_ANNOTATION : $this->target; + + // Next will be nested + $this->isNestedAnnotation = true; + + //if annotation does not support current target + if (0 === (self::$annotationMetadata[$name]['targets'] & $target) && $target) { + throw AnnotationException::semanticalError( + sprintf('Annotation @%s is not allowed to be declared on %s. You may only use this annotation on these code elements: %s.', + $originalName, $this->context, self::$annotationMetadata[$name]['targets_literal']) + ); + } + + $values = array(); + if ($this->lexer->isNextToken(DocLexer::T_OPEN_PARENTHESIS)) { + $this->match(DocLexer::T_OPEN_PARENTHESIS); + + if ( ! $this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) { + $values = $this->Values(); + } + + $this->match(DocLexer::T_CLOSE_PARENTHESIS); + } + + // checks all declared attributes + foreach (self::$annotationMetadata[$name]['attribute_types'] as $property => $type) { + if ($property === self::$annotationMetadata[$name]['default_property'] + && !isset($values[$property]) && isset($values['value'])) { + $property = 'value'; + } + + // handle a not given attribute or null value + if (!isset($values[$property])) { + if ($type['required']) { + throw AnnotationException::requiredError($property, $originalName, $this->context, 'a(n) '.$type['value']); + } + + continue; + } + + if ($type['type'] === 'array') { + // handle the case of a single value + if (!is_array($values[$property])) { + $values[$property] = array($values[$property]); + } + + // checks if the attribute has array type declaration, such as "array" + if (isset($type['array_type'])) { + foreach ($values[$property] as $item) { + if (gettype($item) !== $type['array_type'] && !$item instanceof $type['array_type']) { + throw AnnotationException::typeError($property, $originalName, $this->context, 'either a(n) '.$type['array_type'].', or an array of '.$type['array_type'].'s', $item); + } + } + } + } elseif (gettype($values[$property]) !== $type['type'] && !$values[$property] instanceof $type['type']) { + throw AnnotationException::typeError($property, $originalName, $this->context, 'a(n) '.$type['value'], $values[$property]); + } + } + + // check if the annotation expects values via the constructor, + // or directly injected into public properties + if (self::$annotationMetadata[$name]['has_constructor'] === true) { + return new $name($values); + } + + $instance = new $name(); + foreach ($values as $property => $value) { + if (!isset(self::$annotationMetadata[$name]['properties'][$property])) { + if ('value' !== $property) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not have a property named "%s". Available properties: %s', $originalName, $this->context, $property, implode(', ', self::$annotationMetadata[$name]['properties']))); + } + + // handle the case if the property has no annotations + if (!$property = self::$annotationMetadata[$name]['default_property']) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not accept any values, but got %s.', $originalName, $this->context, json_encode($values))); + } + } + + $instance->{$property} = $value; + } + + return $instance; + } + + /** + * Values ::= Array | Value {"," Value}* + * + * @return array + */ + private function Values() + { + $values = array(); + + // Handle the case of a single array as value, i.e. @Foo({....}) + if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { + $values['value'] = $this->Value(); + return $values; + } + + $values[] = $this->Value(); + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + $token = $this->lexer->lookahead; + $value = $this->Value(); + + if ( ! is_object($value) && ! is_array($value)) { + $this->syntaxError('Value', $token); + } + + $values[] = $value; + } + + foreach ($values as $k => $value) { + if (is_object($value) && $value instanceof \stdClass) { + $values[$value->name] = $value->value; + } else if ( ! isset($values['value'])){ + $values['value'] = $value; + } else { + if ( ! is_array($values['value'])) { + $values['value'] = array($values['value']); + } + + $values['value'][] = $value; + } + + unset($values[$k]); + } + + return $values; + } + + /** + * Value ::= PlainValue | FieldAssignment + * + * @return mixed + */ + private function Value() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type']) { + return $this->FieldAssignment(); + } + + return $this->PlainValue(); + } + + /** + * PlainValue ::= integer | string | float | boolean | Array | Annotation + * + * @return mixed + */ + private function PlainValue() + { + if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { + return $this->Arrayx(); + } + + if ($this->lexer->isNextToken(DocLexer::T_AT)) { + return $this->Annotation(); + } + + switch ($this->lexer->lookahead['type']) { + case DocLexer::T_STRING: + $this->match(DocLexer::T_STRING); + return $this->lexer->token['value']; + + case DocLexer::T_INTEGER: + $this->match(DocLexer::T_INTEGER); + return (int)$this->lexer->token['value']; + + case DocLexer::T_FLOAT: + $this->match(DocLexer::T_FLOAT); + return (float)$this->lexer->token['value']; + + case DocLexer::T_TRUE: + $this->match(DocLexer::T_TRUE); + return true; + + case DocLexer::T_FALSE: + $this->match(DocLexer::T_FALSE); + return false; + + case DocLexer::T_NULL: + $this->match(DocLexer::T_NULL); + return null; + + default: + $this->syntaxError('PlainValue'); + } + } + + /** + * FieldAssignment ::= FieldName "=" PlainValue + * FieldName ::= identifier + * + * @return array + */ + private function FieldAssignment() + { + $this->match(DocLexer::T_IDENTIFIER); + $fieldName = $this->lexer->token['value']; + + $this->match(DocLexer::T_EQUALS); + + $item = new \stdClass(); + $item->name = $fieldName; + $item->value = $this->PlainValue(); + + return $item; + } + + /** + * Array ::= "{" ArrayEntry {"," ArrayEntry}* [","] "}" + * + * @return array + */ + private function Arrayx() + { + $array = $values = array(); + + $this->match(DocLexer::T_OPEN_CURLY_BRACES); + $values[] = $this->ArrayEntry(); + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + + // optional trailing comma + if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) { + break; + } + + $values[] = $this->ArrayEntry(); + } + + $this->match(DocLexer::T_CLOSE_CURLY_BRACES); + + foreach ($values as $value) { + list ($key, $val) = $value; + + if ($key !== null) { + $array[$key] = $val; + } else { + $array[] = $val; + } + } + + return $array; + } + + /** + * ArrayEntry ::= Value | KeyValuePair + * KeyValuePair ::= Key ("=" | ":") PlainValue + * Key ::= string | integer + * + * @return array + */ + private function ArrayEntry() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type'] + || DocLexer::T_COLON === $peek['type']) { + $this->matchAny(array(DocLexer::T_INTEGER, DocLexer::T_STRING)); + + $key = $this->lexer->token['value']; + $this->matchAny(array(DocLexer::T_EQUALS, DocLexer::T_COLON)); + + return array($key, $this->PlainValue()); + } + + return array(null, $this->Value()); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php new file mode 100644 index 00000000..4a42b583 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php @@ -0,0 +1,209 @@ +. + */ + +namespace Doctrine\Common\Annotations; + + +/** + * File cache reader for annotations. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + */ +class FileCacheReader implements Reader +{ + /** + * @var Reader + */ + private $reader; + private $dir; + private $debug; + private $loadedAnnotations = array(); + + public function __construct(Reader $reader, $cacheDir, $debug = false) + { + $this->reader = $reader; + if (!is_dir($cacheDir) && !@mkdir($cacheDir, 0777, true)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist and could not be created.', $cacheDir)); + } + if (!is_writable($cacheDir)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" is not writable. Both, the webserver and the console user need access. You can manage access rights for multiple users with "chmod +a". If your system does not support this, check out the acl package.', $cacheDir)); + } + + $this->dir = rtrim($cacheDir, '\\/'); + $this->debug = $debug; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $key = $class->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + @unlink($path); + + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $key = $class->getName().'$'.$property->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + unlink($path); + + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $key = $class->getName().'#'.$method->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + unlink($path); + + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + private function saveCacheFile($path, $data) + { + file_put_contents($path, 'getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = array(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php new file mode 100644 index 00000000..1eea4921 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php @@ -0,0 +1,94 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Reader; + +/** + * Allows the reader to be used in-place of Doctrine's reader. + * + * @author Johannes M. Schmitt + */ +class IndexedReader implements Reader +{ + private $delegate; + + public function __construct(Reader $reader) + { + $this->delegate = $reader; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $annotations = array(); + foreach ($this->delegate->getClassAnnotations($class) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getClassAnnotation(\ReflectionClass $class, $annotation) + { + return $this->delegate->getClassAnnotation($class, $annotation); + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $annotations = array(); + foreach ($this->delegate->getMethodAnnotations($method) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getMethodAnnotation(\ReflectionMethod $method, $annotation) + { + return $this->delegate->getMethodAnnotation($method, $annotation); + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $annotations = array(); + foreach ($this->delegate->getPropertyAnnotations($property) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getPropertyAnnotation(\ReflectionProperty $property, $annotation) + { + return $this->delegate->getPropertyAnnotation($property, $annotation); + } + + /** + * Proxy all methods to the delegate. + * + * @param type $method + * @param type $args + * @return type + */ + public function __call($method, $args) + { + return call_user_func_array(array($this->delegate, $method), $args); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php new file mode 100644 index 00000000..a14f8f5b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php @@ -0,0 +1,203 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use SplFileObject; + +/** + * Parses a file for namespaces/use/class declarations. + * + * @author Fabien Potencier + * @author Christian Kaps + */ +final class PhpParser +{ + /** + * The token list. + * + * @var array + */ + private $tokens; + + /** + * The number of tokens. + * + * @var int + */ + private $numTokens = 0; + + /** + * The current array pointer. + * + * @var int + */ + private $pointer = 0; + + /** + * Parses a class. + * + * @param \ReflectionClass $class A ReflectionClass object. + * @return array A list with use statements in the form (Alias => FQN). + */ + public function parseClass(\ReflectionClass $class) + { + if (false === $filename = $class->getFilename()) { + return array(); + } + + $content = $this->getFileContent($filename, $class->getStartLine()); + $namespace = str_replace('\\', '\\\\', $class->getNamespaceName()); + $content = preg_replace('/^.*?(\bnamespace\s+' . $namespace . '\s*[;{].*)$/s', '\\1', $content); + $this->tokens = token_get_all('numTokens = count($this->tokens); + $this->pointer = 0; + + $statements = $this->parseUseStatements($class->getNamespaceName()); + + return $statements; + } + + /** + * Get the content of the file right up to the given line number. + * + * @param string $filename The name of the file to load. + * @param int $lineNumber The number of lines to read from file. + * @return string The content of the file. + */ + private function getFileContent($filename, $lineNumber) + { + $content = ''; + $lineCnt = 0; + $file = new SplFileObject($filename); + while(!$file->eof()) { + if ($lineCnt++ == $lineNumber) { + break; + } + + $content .= $file->fgets(); + } + + return $content; + } + + /** + * Gets the next non whitespace and non comment token. + * + * @return array The token if exists, null otherwise. + */ + private function next() + { + for ($i = $this->pointer; $i < $this->numTokens; $i++) { + $this->pointer++; + if ($this->tokens[$i][0] === T_WHITESPACE || + $this->tokens[$i][0] === T_COMMENT || + $this->tokens[$i][0] === T_DOC_COMMENT) { + + continue; + } + + return $this->tokens[$i]; + } + + return null; + } + + /** + * Get all use statements. + * + * @param string $namespaceName The namespace name of the reflected class. + * @return array A list with all found use statements. + */ + private function parseUseStatements($namespaceName) + { + $statements = array(); + while (($token = $this->next())) { + if ($token[0] === T_USE) { + $statements = array_merge($statements, $this->parseUseStatement()); + continue; + } else if ($token[0] !== T_NAMESPACE || $this->parseNamespace() != $namespaceName) { + continue; + } + + // Get fresh array for new namespace. This is to prevent the parser to collect the use statements + // for a previous namespace with the same name. This is the case if a namespace is defined twice + // or if a namespace with the same name is commented out. + $statements = array(); + } + + return $statements; + } + + /** + * Get the namespace name. + * + * @return string The found namespace name. + */ + private function parseNamespace() + { + $namespace = ''; + while (($token = $this->next())){ + if ($token[0] === T_STRING || $token[0] === T_NS_SEPARATOR) { + $namespace .= $token[1]; + } else { + break; + } + } + + return $namespace; + } + + /** + * Parse a single use statement. + * + * @return array A list with all found class names for a use statement. + */ + private function parseUseStatement() + { + $class = ''; + $alias = ''; + $statements = array(); + $explicitAlias = false; + while (($token = $this->next())) { + $isNameToken = $token[0] === T_STRING || $token[0] === T_NS_SEPARATOR; + if (!$explicitAlias && $isNameToken) { + $class .= $token[1]; + $alias = $token[1]; + } else if ($explicitAlias && $isNameToken) { + $alias .= $token[1]; + } else if ($token[0] === T_AS) { + $explicitAlias = true; + $alias = ''; + } else if ($token === ',') { + $statements[strtolower($alias)] = $class; + $class = ''; + $alias = ''; + $explicitAlias = false; + } else if ($token === ';') { + $statements[strtolower($alias)] = $class; + break; + } else { + break; + } + } + + return $statements; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php new file mode 100644 index 00000000..8e85d392 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php @@ -0,0 +1,35 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Interface for annotation readers. + * + * @author Johannes M. Schmitt + */ +interface Reader +{ + function getClassAnnotations(\ReflectionClass $class); + function getClassAnnotation(\ReflectionClass $class, $annotationName); + function getMethodAnnotations(\ReflectionMethod $method); + function getMethodAnnotation(\ReflectionMethod $method, $annotationName); + function getPropertyAnnotations(\ReflectionProperty $property); + function getPropertyAnnotation(\ReflectionProperty $property, $annotationName); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php new file mode 100644 index 00000000..a13c7fa0 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php @@ -0,0 +1,152 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\Target; + +/** + * Simple Annotation Reader. + * + * This annotation reader is intended to be used in projects where you have + * full-control over all annotations that are available. + * + * @since 2.2 + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +class SimpleAnnotationReader implements Reader +{ + /** + * @var DocParser + */ + private $parser; + + /** + * Constructor. + * + * Initializes a new SimpleAnnotationReader. + */ + public function __construct() + { + $this->parser = new DocParser(); + $this->parser->setIgnoreNotImportedAnnotations(true); + } + + /** + * Adds a namespace in which we will look for annotations. + * + * @param string $namespace + */ + public function addNamespace($namespace) + { + $this->parser->addNamespace($namespace); + } + + /** + * Gets the annotations applied to a class. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @return array An array of Annotations. + */ + public function getClassAnnotations(\ReflectionClass $class) + { + return $this->parser->parse($class->getDocComment(), 'class '.$class->getName()); + } + + /** + * Gets the annotations applied to a method. + * + * @param ReflectionMethod $property The ReflectionMethod of the method from which + * the annotations should be read. + * @return array An array of Annotations. + */ + public function getMethodAnnotations(\ReflectionMethod $method) + { + return $this->parser->parse($method->getDocComment(), 'method '.$method->getDeclaringClass()->name.'::'.$method->getName().'()'); + } + + /** + * Gets the annotations applied to a property. + * + * @param ReflectionProperty $property The ReflectionProperty of the property + * from which the annotations should be read. + * @return array An array of Annotations. + */ + public function getPropertyAnnotations(\ReflectionProperty $property) + { + return $this->parser->parse($property->getDocComment(), 'property '.$property->getDeclaringClass()->name.'::$'.$property->getName()); + } + + /** + * Gets a class annotation. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php new file mode 100644 index 00000000..a59296f5 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php @@ -0,0 +1,97 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * APC cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class ApcCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return apc_fetch($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + $found = false; + + apc_fetch($id, $found); + + return $found; + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return (bool) apc_store($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return apc_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return apc_clear_cache() && apc_clear_cache('user'); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = apc_cache_info(); + $sma = apc_sma_info(); + + return array( + Cache::STATS_HITS => $info['num_hits'], + Cache::STATS_MISSES => $info['num_misses'], + Cache::STATS_UPTIME => $info['start_time'], + Cache::STATS_MEMORY_USAGE => $info['mem_size'], + Cache::STATS_MEMORY_AVAILIABLE => $sma['avail_mem'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php new file mode 100644 index 00000000..8a0b982b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php @@ -0,0 +1,96 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Array cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class ArrayCache extends CacheProvider +{ + /** + * @var array $data + */ + private $data = array(); + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return (isset($this->data[$id])) ? $this->data[$id] : false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return isset($this->data[$id]); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + $this->data[$id] = $data; + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + unset($this->data[$id]); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->data = array(); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php new file mode 100644 index 00000000..d303bde4 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php @@ -0,0 +1,102 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Interface for cache drivers. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Fabio B. Silva + */ +interface Cache +{ + const STATS_HITS = 'hits'; + const STATS_MISSES = 'misses'; + const STATS_UPTIME = 'uptime'; + const STATS_MEMORY_USAGE = 'memory_usage'; + const STATS_MEMORY_AVAILIABLE = 'memory_available'; + + /** + * Fetches an entry from the cache. + * + * @param string $id cache id The id of the cache entry to fetch. + * @return string The cached data or FALSE, if no cache entry exists for the given id. + */ + function fetch($id); + + /** + * Test if an entry exists in the cache. + * + * @param string $id cache id The cache id of the entry to check for. + * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. + */ + function contains($id); + + /** + * Puts data into the cache. + * + * @param string $id The cache id. + * @param string $data The cache entry/data. + * @param int $lifeTime The lifetime. If != 0, sets a specific lifetime for this cache entry (0 => infinite lifeTime). + * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. + */ + function save($id, $data, $lifeTime = 0); + + /** + * Deletes a cache entry. + * + * @param string $id cache id + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + function delete($id); + + /** + * Retrieves cached information from data store + * + * The server's statistics array has the following values: + * + * - hits + * Number of keys that have been requested and found present. + * + * - misses + * Number of items that have been requested and not found. + * + * - uptime + * Time that the server is running. + * + * - memory_usage + * Memory used by this server to store items. + * + * - memory_available + * Memory allowed to use for storage. + * + * @since 2.2 + * @var array Associative array with server's statistics if available, NULL otherwise. + */ + function getStats(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php new file mode 100644 index 00000000..fa11fc22 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php @@ -0,0 +1,188 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Base class for cache provider implementations. + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Fabio B. Silva + */ +abstract class CacheProvider implements Cache +{ + const DOCTRINE_NAMESPACE_CACHEKEY = 'DoctrineNamespaceCacheKey[%s]'; + + /** + * @var string The namespace to prefix all cache ids with + */ + private $namespace = ''; + + /** + * Set the namespace to prefix all cache ids with. + * + * @param string $namespace + * @return void + */ + public function setNamespace($namespace) + { + $this->namespace = (string) $namespace; + } + + /** + * Retrieve the namespace that prefixes all cache ids. + * + * @return string + */ + public function getNamespace() + { + return $this->namespace; + } + + /** + * {@inheritdoc} + */ + public function fetch($id) + { + return $this->doFetch($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function contains($id) + { + return $this->doContains($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function save($id, $data, $lifeTime = 0) + { + return $this->doSave($this->getNamespacedId($id), $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + public function delete($id) + { + return $this->doDelete($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function getStats() + { + return $this->doGetStats(); + } + + /** + * Deletes all cache entries. + * + * @return boolean TRUE if the cache entries were successfully flushed, FALSE otherwise. + */ + public function flushAll() + { + return $this->doFlush(); + } + + /** + * Delete all cache entries. + * + * @return boolean TRUE if the cache entries were successfully deleted, FALSE otherwise. + */ + public function deleteAll() + { + $namespaceCacheKey = sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); + $namespaceVersion = ($this->doContains($namespaceCacheKey)) ? $this->doFetch($namespaceCacheKey) : 1; + + return $this->doSave($namespaceCacheKey, $namespaceVersion + 1); + } + + /** + * Prefix the passed id with the configured namespace value + * + * @param string $id The id to namespace + * @return string $id The namespaced id + */ + private function getNamespacedId($id) + { + $namespaceCacheKey = sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); + $namespaceVersion = ($this->doContains($namespaceCacheKey)) ? $this->doFetch($namespaceCacheKey) : 1; + + return sprintf('%s[%s][%s]', $this->namespace, $id, $namespaceVersion); + } + + /** + * Fetches an entry from the cache. + * + * @param string $id cache id The id of the cache entry to fetch. + * @return string The cached data or FALSE, if no cache entry exists for the given id. + */ + abstract protected function doFetch($id); + + /** + * Test if an entry exists in the cache. + * + * @param string $id cache id The cache id of the entry to check for. + * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. + */ + abstract protected function doContains($id); + + /** + * Puts data into the cache. + * + * @param string $id The cache id. + * @param string $data The cache entry/data. + * @param int $lifeTime The lifetime. If != false, sets a specific lifetime for this cache entry (null => infinite lifeTime). + * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. + */ + abstract protected function doSave($id, $data, $lifeTime = false); + + /** + * Deletes a cache entry. + * + * @param string $id cache id + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + abstract protected function doDelete($id); + + /** + * Deletes all cache entries. + * + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + abstract protected function doFlush(); + + /** + * Retrieves cached information from data store + * + * @since 2.2 + * @return array An associative array with server's statistics if available, NULL otherwise. + */ + abstract protected function doGetStats(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php new file mode 100644 index 00000000..dd6d1e31 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php @@ -0,0 +1,121 @@ +. + */ + +namespace Doctrine\Common\Cache; + +use \Memcache; + +/** + * Memcache cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class MemcacheCache extends CacheProvider +{ + /** + * @var Memcache + */ + private $memcache; + + /** + * Sets the memcache instance to use. + * + * @param Memcache $memcache + */ + public function setMemcache(Memcache $memcache) + { + $this->memcache = $memcache; + } + + /** + * Gets the memcache instance used by the cache. + * + * @return Memcache + */ + public function getMemcache() + { + return $this->memcache; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcache->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (bool) $this->memcache->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + return $this->memcache->set($id, $data, 0, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->memcache->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcache->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcache->getStats(); + return array( + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php new file mode 100644 index 00000000..4675fae7 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php @@ -0,0 +1,124 @@ +. + */ + +namespace Doctrine\Common\Cache; + +use \Memcached; + +/** + * Memcached cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class MemcachedCache extends CacheProvider +{ + /** + * @var Memcached + */ + private $memcached; + + /** + * Sets the memcache instance to use. + * + * @param Memcached $memcached + */ + public function setMemcached(Memcached $memcached) + { + $this->memcached = $memcached; + } + + /** + * Gets the memcached instance used by the cache. + * + * @return Memcached + */ + public function getMemcached() + { + return $this->memcached; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcached->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (false !== $this->memcached->get($id)); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + return $this->memcached->set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->memcached->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcached->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcached->getStats(); + $servers = $this->memcached->getServerList(); + $key = $servers[0]['host'] . ':' . $servers[0]['port']; + $stats = $stats[$key]; + return array( + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php new file mode 100644 index 00000000..ed8ca74a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php @@ -0,0 +1,92 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * WinCache cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class WincacheCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return wincache_ucache_get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return wincache_ucache_exists($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return (bool) wincache_ucache_set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return wincache_ucache_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return wincache_ucache_clear(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = wincache_ucache_info(); + $meminfo= wincache_ucache_meminfo(); + return array( + Cache::STATS_HITS => $info['total_hit_count'], + Cache::STATS_MISSES => $info['total_miss_count'], + Cache::STATS_UPTIME => $info['total_cache_uptime'], + Cache::STATS_MEMORY_USAGE => $meminfo['memory_total'], + Cache::STATS_MEMORY_AVAILIABLE => $meminfo['memory_free'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php new file mode 100644 index 00000000..6e22d265 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php @@ -0,0 +1,110 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Xcache cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class XcacheCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->doContains($id) ? unserialize(xcache_get($id)) : false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return xcache_isset($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return xcache_set($id, serialize($data), (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return xcache_unset($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->checkAuthorization(); + + xcache_clear_cache(XC_TYPE_VAR, 0); + + return true; + } + + /** + * Checks that xcache.admin.enable_auth is Off + * + * @throws \BadMethodCallException When xcache.admin.enable_auth is On + * @return void + */ + protected function checkAuthorization() + { + if (ini_get('xcache.admin.enable_auth')) { + throw new \BadMethodCallException('To use all features of \Doctrine\Common\Cache\XcacheCache, you must set "xcache.admin.enable_auth" to "Off" in your php.ini.'); + } + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $this->checkAuthorization(); + + $info = xcache_info(XC_TYPE_VAR, 0); + return array( + Cache::STATS_HITS => $info['hits'], + Cache::STATS_MISSES => $info['misses'], + Cache::STATS_UPTIME => null, + Cache::STATS_MEMORY_USAGE => $info['size'], + Cache::STATS_MEMORY_AVAILIABLE => $info['avail'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php new file mode 100644 index 00000000..4e4dabe7 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php @@ -0,0 +1,84 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Zend Data Cache cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Ralph Schindler + * @author Guilherme Blanco + */ +class ZendDataCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return zend_shm_cache_fetch($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (false !== zend_shm_cache_fetch($id)); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return zend_shm_cache_store($id, $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return zend_shm_cache_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $namespace = $this->getNamespace(); + if (empty($namespace)) { + return zend_shm_cache_clear(); + } + return zend_shm_cache_clear($namespace); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php new file mode 100644 index 00000000..375b0d6b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php @@ -0,0 +1,262 @@ +. + */ + +namespace Doctrine\Common; + +/** + * A ClassLoader is an autoloader for class files that can be + * installed on the SPL autoload stack. It is a class loader that either loads only classes + * of a specific namespace or all namespaces and it is suitable for working together + * with other autoloaders in the SPL autoload stack. + * + * If no include path is configured through the constructor or {@link setIncludePath}, a ClassLoader + * relies on the PHP include_path. + * + * @author Roman Borschel + * @since 2.0 + */ +class ClassLoader +{ + /** + * @var string PHP file extension + */ + protected $fileExtension = '.php'; + + /** + * @var string Current namespace + */ + protected $namespace; + + /** + * @var string Current include path + */ + protected $includePath; + + /** + * @var string PHP namespace separator + */ + protected $namespaceSeparator = '\\'; + + /** + * Creates a new ClassLoader that loads classes of the + * specified namespace from the specified include path. + * + * If no include path is given, the ClassLoader relies on the PHP include_path. + * If neither a namespace nor an include path is given, the ClassLoader will + * be responsible for loading all classes, thereby relying on the PHP include_path. + * + * @param string $ns The namespace of the classes to load. + * @param string $includePath The base include path to use. + */ + public function __construct($ns = null, $includePath = null) + { + $this->namespace = $ns; + $this->includePath = $includePath; + } + + /** + * Sets the namespace separator used by classes in the namespace of this ClassLoader. + * + * @param string $sep The separator to use. + */ + public function setNamespaceSeparator($sep) + { + $this->namespaceSeparator = $sep; + } + + /** + * Gets the namespace separator used by classes in the namespace of this ClassLoader. + * + * @return string + */ + public function getNamespaceSeparator() + { + return $this->namespaceSeparator; + } + + /** + * Sets the base include path for all class files in the namespace of this ClassLoader. + * + * @param string $includePath + */ + public function setIncludePath($includePath) + { + $this->includePath = $includePath; + } + + /** + * Gets the base include path for all class files in the namespace of this ClassLoader. + * + * @return string + */ + public function getIncludePath() + { + return $this->includePath; + } + + /** + * Sets the file extension of class files in the namespace of this ClassLoader. + * + * @param string $fileExtension + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * Gets the file extension of class files in the namespace of this ClassLoader. + * + * @return string + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Registers this ClassLoader on the SPL autoload stack. + */ + public function register() + { + spl_autoload_register(array($this, 'loadClass')); + } + + /** + * Removes this ClassLoader from the SPL autoload stack. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $classname The name of the class to load. + * @return boolean TRUE if the class has been successfully loaded, FALSE otherwise. + */ + public function loadClass($className) + { + if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) { + return false; + } + + require ($this->includePath !== null ? $this->includePath . DIRECTORY_SEPARATOR : '') + . str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) + . $this->fileExtension; + + return true; + } + + /** + * Asks this ClassLoader whether it can potentially load the class (file) with + * the given name. + * + * @param string $className The fully-qualified name of the class. + * @return boolean TRUE if this ClassLoader can load the class, FALSE otherwise. + */ + public function canLoadClass($className) + { + if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) { + return false; + } + + $file = str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) . $this->fileExtension; + + if ($this->includePath !== null) { + return file_exists($this->includePath . DIRECTORY_SEPARATOR . $file); + } + + return (false !== stream_resolve_include_path($file)); + } + + /** + * Checks whether a class with a given name exists. A class "exists" if it is either + * already defined in the current request or if there is an autoloader on the SPL + * autoload stack that is a) responsible for the class in question and b) is able to + * load a class file in which the class definition resides. + * + * If the class is not already defined, each autoloader in the SPL autoload stack + * is asked whether it is able to tell if the class exists. If the autoloader is + * a ClassLoader, {@link canLoadClass} is used, otherwise the autoload + * function of the autoloader is invoked and expected to return a value that + * evaluates to TRUE if the class (file) exists. As soon as one autoloader reports + * that the class exists, TRUE is returned. + * + * Note that, depending on what kinds of autoloaders are installed on the SPL + * autoload stack, the class (file) might already be loaded as a result of checking + * for its existence. This is not the case with a ClassLoader, who separates + * these responsibilities. + * + * @param string $className The fully-qualified name of the class. + * @return boolean TRUE if the class exists as per the definition given above, FALSE otherwise. + */ + public static function classExists($className) + { + if (class_exists($className, false) || interface_exists($className, false)) { + return true; + } + + foreach (spl_autoload_functions() as $loader) { + if (is_array($loader)) { // array(???, ???) + if (is_object($loader[0])) { + if ($loader[0] instanceof ClassLoader) { // array($obj, 'methodName') + if ($loader[0]->canLoadClass($className)) { + return true; + } + } else if ($loader[0]->{$loader[1]}($className)) { + return true; + } + } else if ($loader[0]::$loader[1]($className)) { // array('ClassName', 'methodName') + return true; + } + } else if ($loader instanceof \Closure) { // function($className) {..} + if ($loader($className)) { + return true; + } + } else if (is_string($loader) && $loader($className)) { // "MyClass::loadClass" + return true; + } + } + + return class_exists($className, false) || interface_exists($className, false); + } + + /** + * Gets the ClassLoader from the SPL autoload stack that is responsible + * for (and is able to load) the class with the given name. + * + * @param string $className The name of the class. + * @return The ClassLoader for the class or NULL if no such ClassLoader exists. + */ + public static function getClassLoader($className) + { + foreach (spl_autoload_functions() as $loader) { + if (is_array($loader) + && $loader[0] instanceof ClassLoader + && $loader[0]->canLoadClass($className) + ) { + return $loader[0]; + } + } + + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php new file mode 100644 index 00000000..2a7d4eaf --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php @@ -0,0 +1,447 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Closure, ArrayIterator; + +/** + * An ArrayCollection is a Collection implementation that wraps a regular PHP array. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class ArrayCollection implements Collection +{ + /** + * An array containing the entries of this collection. + * + * @var array + */ + private $_elements; + + /** + * Initializes a new ArrayCollection. + * + * @param array $elements + */ + public function __construct(array $elements = array()) + { + $this->_elements = $elements; + } + + /** + * Gets the PHP array representation of this collection. + * + * @return array The PHP array representation of this collection. + */ + public function toArray() + { + return $this->_elements; + } + + /** + * Sets the internal iterator to the first element in the collection and + * returns this element. + * + * @return mixed + */ + public function first() + { + return reset($this->_elements); + } + + /** + * Sets the internal iterator to the last element in the collection and + * returns this element. + * + * @return mixed + */ + public function last() + { + return end($this->_elements); + } + + /** + * Gets the current key/index at the current internal iterator position. + * + * @return mixed + */ + public function key() + { + return key($this->_elements); + } + + /** + * Moves the internal iterator position to the next element. + * + * @return mixed + */ + public function next() + { + return next($this->_elements); + } + + /** + * Gets the element of the collection at the current internal iterator position. + * + * @return mixed + */ + public function current() + { + return current($this->_elements); + } + + /** + * Removes an element with a specific key/index from the collection. + * + * @param mixed $key + * @return mixed The removed element or NULL, if no element exists for the given key. + */ + public function remove($key) + { + if (isset($this->_elements[$key])) { + $removed = $this->_elements[$key]; + unset($this->_elements[$key]); + + return $removed; + } + + return null; + } + + /** + * Removes the specified element from the collection, if it is found. + * + * @param mixed $element The element to remove. + * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. + */ + public function removeElement($element) + { + $key = array_search($element, $this->_elements, true); + + if ($key !== false) { + unset($this->_elements[$key]); + + return true; + } + + return false; + } + + /** + * ArrayAccess implementation of offsetExists() + * + * @see containsKey() + */ + public function offsetExists($offset) + { + return $this->containsKey($offset); + } + + /** + * ArrayAccess implementation of offsetGet() + * + * @see get() + */ + public function offsetGet($offset) + { + return $this->get($offset); + } + + /** + * ArrayAccess implementation of offsetGet() + * + * @see add() + * @see set() + */ + public function offsetSet($offset, $value) + { + if ( ! isset($offset)) { + return $this->add($value); + } + return $this->set($offset, $value); + } + + /** + * ArrayAccess implementation of offsetUnset() + * + * @see remove() + */ + public function offsetUnset($offset) + { + return $this->remove($offset); + } + + /** + * Checks whether the collection contains a specific key/index. + * + * @param mixed $key The key to check for. + * @return boolean TRUE if the given key/index exists, FALSE otherwise. + */ + public function containsKey($key) + { + return isset($this->_elements[$key]); + } + + /** + * Checks whether the given element is contained in the collection. + * Only element values are compared, not keys. The comparison of two elements + * is strict, that means not only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element + * @return boolean TRUE if the given element is contained in the collection, + * FALSE otherwise. + */ + public function contains($element) + { + foreach ($this->_elements as $collectionElement) { + if ($element === $collectionElement) { + return true; + } + } + + return false; + } + + /** + * Tests for the existance of an element that satisfies the given predicate. + * + * @param Closure $p The predicate. + * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. + */ + public function exists(Closure $p) + { + foreach ($this->_elements as $key => $element) { + if ($p($key, $element)) { + return true; + } + } + return false; + } + + /** + * Searches for a given element and, if found, returns the corresponding key/index + * of that element. The comparison of two elements is strict, that means not + * only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element The element to search for. + * @return mixed The key/index of the element or FALSE if the element was not found. + */ + public function indexOf($element) + { + return array_search($element, $this->_elements, true); + } + + /** + * Gets the element with the given key/index. + * + * @param mixed $key The key. + * @return mixed The element or NULL, if no element exists for the given key. + */ + public function get($key) + { + if (isset($this->_elements[$key])) { + return $this->_elements[$key]; + } + return null; + } + + /** + * Gets all keys/indexes of the collection elements. + * + * @return array + */ + public function getKeys() + { + return array_keys($this->_elements); + } + + /** + * Gets all elements. + * + * @return array + */ + public function getValues() + { + return array_values($this->_elements); + } + + /** + * Returns the number of elements in the collection. + * + * Implementation of the Countable interface. + * + * @return integer The number of elements in the collection. + */ + public function count() + { + return count($this->_elements); + } + + /** + * Adds/sets an element in the collection at the index / with the specified key. + * + * When the collection is a Map this is like put(key,value)/add(key,value). + * When the collection is a List this is like add(position,value). + * + * @param mixed $key + * @param mixed $value + */ + public function set($key, $value) + { + $this->_elements[$key] = $value; + } + + /** + * Adds an element to the collection. + * + * @param mixed $value + * @return boolean Always TRUE. + */ + public function add($value) + { + $this->_elements[] = $value; + return true; + } + + /** + * Checks whether the collection is empty. + * + * Note: This is preferrable over count() == 0. + * + * @return boolean TRUE if the collection is empty, FALSE otherwise. + */ + public function isEmpty() + { + return ! $this->_elements; + } + + /** + * Gets an iterator for iterating over the elements in the collection. + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_elements); + } + + /** + * Applies the given function to each element in the collection and returns + * a new collection with the elements returned by the function. + * + * @param Closure $func + * @return Collection + */ + public function map(Closure $func) + { + return new static(array_map($func, $this->_elements)); + } + + /** + * Returns all the elements of this collection that satisfy the predicate p. + * The order of the elements is preserved. + * + * @param Closure $p The predicate used for filtering. + * @return Collection A collection with the results of the filter operation. + */ + public function filter(Closure $p) + { + return new static(array_filter($this->_elements, $p)); + } + + /** + * Applies the given predicate p to all elements of this collection, + * returning true, if the predicate yields true for all elements. + * + * @param Closure $p The predicate. + * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. + */ + public function forAll(Closure $p) + { + foreach ($this->_elements as $key => $element) { + if ( ! $p($key, $element)) { + return false; + } + } + + return true; + } + + /** + * Partitions this collection in two collections according to a predicate. + * Keys are preserved in the resulting collections. + * + * @param Closure $p The predicate on which to partition. + * @return array An array with two elements. The first element contains the collection + * of elements where the predicate returned TRUE, the second element + * contains the collection of elements where the predicate returned FALSE. + */ + public function partition(Closure $p) + { + $coll1 = $coll2 = array(); + foreach ($this->_elements as $key => $element) { + if ($p($key, $element)) { + $coll1[$key] = $element; + } else { + $coll2[$key] = $element; + } + } + return array(new static($coll1), new static($coll2)); + } + + /** + * Returns a string representation of this object. + * + * @return string + */ + public function __toString() + { + return __CLASS__ . '@' . spl_object_hash($this); + } + + /** + * Clears the collection. + */ + public function clear() + { + $this->_elements = array(); + } + + /** + * Extract a slice of $length elements starting at position $offset from the Collection. + * + * If $length is null it returns all elements from $offset to the end of the Collection. + * Keys have to be preserved by this method. Calling this method will only return the + * selected slice and NOT change the elements contained in the collection slice is called on. + * + * @param int $offset + * @param int $length + * @return array + */ + public function slice($offset, $length = null) + { + return array_slice($this->_elements, $offset, $length, true); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php new file mode 100644 index 00000000..9fca659c --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php @@ -0,0 +1,243 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Closure, Countable, IteratorAggregate, ArrayAccess; + +/** + * The missing (SPL) Collection/Array/OrderedMap interface. + * + * A Collection resembles the nature of a regular PHP array. That is, + * it is essentially an ordered map that can also be used + * like a list. + * + * A Collection has an internal iterator just like a PHP array. In addition, + * a Collection can be iterated with external iterators, which is preferrable. + * To use an external iterator simply use the foreach language construct to + * iterate over the collection (which calls {@link getIterator()} internally) or + * explicitly retrieve an iterator though {@link getIterator()} which can then be + * used to iterate over the collection. + * You can not rely on the internal iterator of the collection being at a certain + * position unless you explicitly positioned it before. Prefer iteration with + * external iterators. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface Collection extends Countable, IteratorAggregate, ArrayAccess +{ + /** + * Adds an element at the end of the collection. + * + * @param mixed $element The element to add. + * @return boolean Always TRUE. + */ + function add($element); + + /** + * Clears the collection, removing all elements. + */ + function clear(); + + /** + * Checks whether an element is contained in the collection. + * This is an O(n) operation, where n is the size of the collection. + * + * @param mixed $element The element to search for. + * @return boolean TRUE if the collection contains the element, FALSE otherwise. + */ + function contains($element); + + /** + * Checks whether the collection is empty (contains no elements). + * + * @return boolean TRUE if the collection is empty, FALSE otherwise. + */ + function isEmpty(); + + /** + * Removes the element at the specified index from the collection. + * + * @param string|integer $key The kex/index of the element to remove. + * @return mixed The removed element or NULL, if the collection did not contain the element. + */ + function remove($key); + + /** + * Removes the specified element from the collection, if it is found. + * + * @param mixed $element The element to remove. + * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. + */ + function removeElement($element); + + /** + * Checks whether the collection contains an element with the specified key/index. + * + * @param string|integer $key The key/index to check for. + * @return boolean TRUE if the collection contains an element with the specified key/index, + * FALSE otherwise. + */ + function containsKey($key); + + /** + * Gets the element at the specified key/index. + * + * @param string|integer $key The key/index of the element to retrieve. + * @return mixed + */ + function get($key); + + /** + * Gets all keys/indices of the collection. + * + * @return array The keys/indices of the collection, in the order of the corresponding + * elements in the collection. + */ + function getKeys(); + + /** + * Gets all values of the collection. + * + * @return array The values of all elements in the collection, in the order they + * appear in the collection. + */ + function getValues(); + + /** + * Sets an element in the collection at the specified key/index. + * + * @param string|integer $key The key/index of the element to set. + * @param mixed $value The element to set. + */ + function set($key, $value); + + /** + * Gets a native PHP array representation of the collection. + * + * @return array + */ + function toArray(); + + /** + * Sets the internal iterator to the first element in the collection and + * returns this element. + * + * @return mixed + */ + function first(); + + /** + * Sets the internal iterator to the last element in the collection and + * returns this element. + * + * @return mixed + */ + function last(); + + /** + * Gets the key/index of the element at the current iterator position. + * + */ + function key(); + + /** + * Gets the element of the collection at the current iterator position. + * + */ + function current(); + + /** + * Moves the internal iterator position to the next element. + * + */ + function next(); + + /** + * Tests for the existence of an element that satisfies the given predicate. + * + * @param Closure $p The predicate. + * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. + */ + function exists(Closure $p); + + /** + * Returns all the elements of this collection that satisfy the predicate p. + * The order of the elements is preserved. + * + * @param Closure $p The predicate used for filtering. + * @return Collection A collection with the results of the filter operation. + */ + function filter(Closure $p); + + /** + * Applies the given predicate p to all elements of this collection, + * returning true, if the predicate yields true for all elements. + * + * @param Closure $p The predicate. + * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. + */ + function forAll(Closure $p); + + /** + * Applies the given function to each element in the collection and returns + * a new collection with the elements returned by the function. + * + * @param Closure $func + * @return Collection + */ + function map(Closure $func); + + /** + * Partitions this collection in two collections according to a predicate. + * Keys are preserved in the resulting collections. + * + * @param Closure $p The predicate on which to partition. + * @return array An array with two elements. The first element contains the collection + * of elements where the predicate returned TRUE, the second element + * contains the collection of elements where the predicate returned FALSE. + */ + function partition(Closure $p); + + /** + * Gets the index/key of a given element. The comparison of two elements is strict, + * that means not only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element The element to search for. + * @return mixed The key/index of the element or FALSE if the element was not found. + */ + function indexOf($element); + + /** + * Extract a slice of $length elements starting at position $offset from the Collection. + * + * If $length is null it returns all elements from $offset to the end of the Collection. + * Keys have to be preserved by this method. Calling this method will only return the + * selected slice and NOT change the elements contained in the collection slice is called on. + * + * @param int $offset + * @param int $length + * @return array + */ + function slice($offset, $length = null); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php new file mode 100644 index 00000000..8c5669be --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php @@ -0,0 +1,28 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Base exception class for package Doctrine\Common + * @author heinrich + * + */ +class CommonException extends \Exception { +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php new file mode 100644 index 00000000..bc95d303 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php @@ -0,0 +1,47 @@ +. + */ + + +namespace Doctrine\Common; + +/** + * Comparable interface that allows to compare two value objects to each other for similarity. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.com + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + */ +interface Comparable +{ + /** + * Compare the current object to the passed $other. + * + * Returns 0 if they are semantically equal, 1 if the other object + * is less than the current one, or -1 if its more than the current one. + * + * This method should not check for identity using ===, only for semantical equality for example + * when two different DateTime instances point to the exact same Date + TZ. + * + * @return int + */ + public function compareTo($other); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php new file mode 100644 index 00000000..6a3c0699 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php @@ -0,0 +1,69 @@ +. + */ + +namespace Doctrine\Common; + +/** + * EventArgs is the base class for classes containing event data. + * + * This class contains no event data. It is used by events that do not pass state + * information to an event handler when an event is raised. The single empty EventArgs + * instance can be obtained through {@link getEmptyInstance}. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class EventArgs +{ + /** + * @var EventArgs Single instance of EventArgs + * @static + */ + private static $_emptyEventArgsInstance; + + /** + * Gets the single, empty and immutable EventArgs instance. + * + * This instance will be used when events are dispatched without any parameter, + * like this: EventManager::dispatchEvent('eventname'); + * + * The benefit from this is that only one empty instance is instantiated and shared + * (otherwise there would be instances for every dispatched in the abovementioned form) + * + * @see EventManager::dispatchEvent + * @link http://msdn.microsoft.com/en-us/library/system.eventargs.aspx + * @static + * @return EventArgs + */ + public static function getEmptyInstance() + { + if ( ! self::$_emptyEventArgsInstance) { + self::$_emptyEventArgsInstance = new EventArgs; + } + + return self::$_emptyEventArgsInstance; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php new file mode 100644 index 00000000..a1f11ed2 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php @@ -0,0 +1,136 @@ +. + */ + +namespace Doctrine\Common; + +/** + * The EventManager is the central point of Doctrine's event listener system. + * Listeners are registered on the manager and events are dispatched through the + * manager. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class EventManager +{ + /** + * Map of registered listeners. + * => + * + * @var array + */ + private $_listeners = array(); + + /** + * Dispatches an event to all registered listeners. + * + * @param string $eventName The name of the event to dispatch. The name of the event is + * the name of the method that is invoked on listeners. + * @param EventArgs $eventArgs The event arguments to pass to the event handlers/listeners. + * If not supplied, the single empty EventArgs instance is used. + * @return boolean + */ + public function dispatchEvent($eventName, EventArgs $eventArgs = null) + { + if (isset($this->_listeners[$eventName])) { + $eventArgs = $eventArgs === null ? EventArgs::getEmptyInstance() : $eventArgs; + + foreach ($this->_listeners[$eventName] as $listener) { + $listener->$eventName($eventArgs); + } + } + } + + /** + * Gets the listeners of a specific event or all listeners. + * + * @param string $event The name of the event. + * @return array The event listeners for the specified event, or all event listeners. + */ + public function getListeners($event = null) + { + return $event ? $this->_listeners[$event] : $this->_listeners; + } + + /** + * Checks whether an event has any registered listeners. + * + * @param string $event + * @return boolean TRUE if the specified event has any listeners, FALSE otherwise. + */ + public function hasListeners($event) + { + return isset($this->_listeners[$event]) && $this->_listeners[$event]; + } + + /** + * Adds an event listener that listens on the specified events. + * + * @param string|array $events The event(s) to listen on. + * @param object $listener The listener object. + */ + public function addEventListener($events, $listener) + { + // Picks the hash code related to that listener + $hash = spl_object_hash($listener); + + foreach ((array) $events as $event) { + // Overrides listener if a previous one was associated already + // Prevents duplicate listeners on same event (same instance only) + $this->_listeners[$event][$hash] = $listener; + } + } + + /** + * Removes an event listener from the specified events. + * + * @param string|array $events + * @param object $listener + */ + public function removeEventListener($events, $listener) + { + // Picks the hash code related to that listener + $hash = spl_object_hash($listener); + + foreach ((array) $events as $event) { + // Check if actually have this listener associated + if (isset($this->_listeners[$event][$hash])) { + unset($this->_listeners[$event][$hash]); + } + } + } + + /** + * Adds an EventSubscriber. The subscriber is asked for all the events he is + * interested in and added as a listener for these events. + * + * @param Doctrine\Common\EventSubscriber $subscriber The subscriber. + */ + public function addEventSubscriber(EventSubscriber $subscriber) + { + $this->addEventListener($subscriber->getSubscribedEvents(), $subscriber); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php new file mode 100644 index 00000000..ed3383fa --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php @@ -0,0 +1,45 @@ +. + */ + +namespace Doctrine\Common; + +/** + * An EventSubscriber knows himself what events he is interested in. + * If an EventSubscriber is added to an EventManager, the manager invokes + * {@link getSubscribedEvents} and registers the subscriber as a listener for all + * returned events. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface EventSubscriber +{ + /** + * Returns an array of events this subscriber wants to listen to. + * + * @return array + */ + function getSubscribedEvents(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php new file mode 100644 index 00000000..8df3b843 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php @@ -0,0 +1,266 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Base class for writing simple lexers, i.e. for creating small DSLs. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @todo Rename: AbstractLexer + */ +abstract class Lexer +{ + /** + * @var array Array of scanned tokens + */ + private $tokens = array(); + + /** + * @var integer Current lexer position in input string + */ + private $position = 0; + + /** + * @var integer Current peek of current lexer position + */ + private $peek = 0; + + /** + * @var array The next token in the input. + */ + public $lookahead; + + /** + * @var array The last matched/seen token. + */ + public $token; + + /** + * Sets the input data to be tokenized. + * + * The Lexer is immediately reset and the new input tokenized. + * Any unprocessed tokens from any previous input are lost. + * + * @param string $input The input to be tokenized. + */ + public function setInput($input) + { + $this->tokens = array(); + $this->reset(); + $this->scan($input); + } + + /** + * Resets the lexer. + */ + public function reset() + { + $this->lookahead = null; + $this->token = null; + $this->peek = 0; + $this->position = 0; + } + + /** + * Resets the peek pointer to 0. + */ + public function resetPeek() + { + $this->peek = 0; + } + + /** + * Resets the lexer position on the input to the given position. + * + * @param integer $position Position to place the lexical scanner + */ + public function resetPosition($position = 0) + { + $this->position = $position; + } + + /** + * Checks whether a given token matches the current lookahead. + * + * @param integer|string $token + * @return boolean + */ + public function isNextToken($token) + { + return null !== $this->lookahead && $this->lookahead['type'] === $token; + } + + /** + * Checks whether any of the given tokens matches the current lookahead + * + * @param array $tokens + * @return boolean + */ + public function isNextTokenAny(array $tokens) + { + return null !== $this->lookahead && in_array($this->lookahead['type'], $tokens, true); + } + + /** + * Moves to the next token in the input string. + * + * A token is an associative array containing three items: + * - 'value' : the string value of the token in the input string + * - 'type' : the type of the token (identifier, numeric, string, input + * parameter, none) + * - 'position' : the position of the token in the input string + * + * @return array|null the next token; null if there is no more tokens left + */ + public function moveNext() + { + $this->peek = 0; + $this->token = $this->lookahead; + $this->lookahead = (isset($this->tokens[$this->position])) + ? $this->tokens[$this->position++] : null; + + return $this->lookahead !== null; + } + + /** + * Tells the lexer to skip input tokens until it sees a token with the given value. + * + * @param $type The token type to skip until. + */ + public function skipUntil($type) + { + while ($this->lookahead !== null && $this->lookahead['type'] !== $type) { + $this->moveNext(); + } + } + + /** + * Checks if given value is identical to the given token + * + * @param mixed $value + * @param integer $token + * @return boolean + */ + public function isA($value, $token) + { + return $this->getType($value) === $token; + } + + /** + * Moves the lookahead token forward. + * + * @return array | null The next token or NULL if there are no more tokens ahead. + */ + public function peek() + { + if (isset($this->tokens[$this->position + $this->peek])) { + return $this->tokens[$this->position + $this->peek++]; + } else { + return null; + } + } + + /** + * Peeks at the next token, returns it and immediately resets the peek. + * + * @return array|null The next token or NULL if there are no more tokens ahead. + */ + public function glimpse() + { + $peek = $this->peek(); + $this->peek = 0; + return $peek; + } + + /** + * Scans the input string for tokens. + * + * @param string $input a query string + */ + protected function scan($input) + { + static $regex; + + if ( ! isset($regex)) { + $regex = '/(' . implode(')|(', $this->getCatchablePatterns()) . ')|' + . implode('|', $this->getNonCatchablePatterns()) . '/i'; + } + + $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE; + $matches = preg_split($regex, $input, -1, $flags); + + foreach ($matches as $match) { + // Must remain before 'value' assignment since it can change content + $type = $this->getType($match[0]); + + $this->tokens[] = array( + 'value' => $match[0], + 'type' => $type, + 'position' => $match[1], + ); + } + } + + /** + * Gets the literal for a given token. + * + * @param integer $token + * @return string + */ + public function getLiteral($token) + { + $className = get_class($this); + $reflClass = new \ReflectionClass($className); + $constants = $reflClass->getConstants(); + + foreach ($constants as $name => $value) { + if ($value === $token) { + return $className . '::' . $name; + } + } + + return $token; + } + + /** + * Lexical catchable patterns. + * + * @return array + */ + abstract protected function getCatchablePatterns(); + + /** + * Lexical non-catchable patterns. + * + * @return array + */ + abstract protected function getNonCatchablePatterns(); + + /** + * Retrieve token type. Also processes the token value if necessary. + * + * @param string $value + * @return integer + */ + abstract protected function getType(&$value); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php new file mode 100644 index 00000000..93e504ae --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php @@ -0,0 +1,45 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Contract for classes that provide the service of notifying listeners of + * changes to their properties. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface NotifyPropertyChanged +{ + /** + * Adds a listener that wants to be notified about property changes. + * + * @param PropertyChangedListener $listener + */ + function addPropertyChangedListener(PropertyChangedListener $listener); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php new file mode 100644 index 00000000..9fff343c --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php @@ -0,0 +1,224 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\ManagerRegistry; + +/** + * Abstract implementation of the ManagerRegistry contract. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +abstract class AbstractManagerRegistry implements ManagerRegistry +{ + private $name; + private $connections; + private $managers; + private $defaultConnection; + private $defaultManager; + private $proxyInterfaceName; + + public function __construct($name, array $connections, array $managers, $defaultConnection, $defaultManager, $proxyInterfaceName) + { + $this->name = $name; + $this->connections = $connections; + $this->managers = $managers; + $this->defaultConnection = $defaultConnection; + $this->defaultManager = $defaultManager; + $this->proxyInterfaceName = $proxyInterfaceName; + } + + /** + * Fetches/creates the given services + * + * A service in this context is connection or a manager instance + * + * @param string $name name of the service + * @return object instance of the given service + */ + abstract protected function getService($name); + + /** + * Resets the given services + * + * A service in this context is connection or a manager instance + * + * @param string $name name of the service + * @return void + */ + abstract protected function resetService($name); + + /** + * Get the name of the registry + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @inheritdoc + */ + public function getConnection($name = null) + { + if (null === $name) { + $name = $this->defaultConnection; + } + + if (!isset($this->connections[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Connection named "%s" does not exist.', $this->name, $name)); + } + + return $this->getService($this->connections[$name]); + } + + /** + * @inheritdoc + */ + public function getConnectionNames() + { + return $this->connections; + } + + /** + * @inheritdoc + */ + public function getConnections() + { + $connections = array(); + foreach ($this->connections as $name => $id) { + $connections[$name] = $this->getService($id); + } + + return $connections; + } + + /** + * @inheritdoc + */ + public function getDefaultConnectionName() + { + return $this->defaultConnection; + } + + /** + * @inheritdoc + */ + public function getDefaultManagerName() + { + return $this->defaultManager; + } + + /** + * @inheritdoc + */ + public function getManager($name = null) + { + if (null === $name) { + $name = $this->defaultManager; + } + + if (!isset($this->managers[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); + } + + return $this->getService($this->managers[$name]); + } + + /** + * @inheritdoc + */ + public function getManagerForClass($class) + { + // Check for namespace alias + if (strpos($class, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $class); + $class = $this->getAliasNamespace($namespaceAlias) . '\\' . $simpleClassName; + } + + $proxyClass = new \ReflectionClass($class); + if ($proxyClass->implementsInterface($this->proxyInterfaceName)) { + $class = $proxyClass->getParentClass()->getName(); + } + + foreach ($this->managers as $id) { + $manager = $this->getService($id); + + if (!$manager->getMetadataFactory()->isTransient($class)) { + return $manager; + } + } + } + + /** + * @inheritdoc + */ + public function getManagerNames() + { + return $this->managers; + } + + /** + * @inheritdoc + */ + public function getManagers() + { + $dms = array(); + foreach ($this->managers as $name => $id) { + $dms[$name] = $this->getService($id); + } + + return $dms; + } + + /** + * @inheritdoc + */ + public function getRepository($persistentObjectName, $persistentManagerName = null) + { + return $this->getManager($persistentManagerName)->getRepository($persistentObjectName); + } + + /** + * @inheritdoc + */ + public function resetManager($name = null) + { + if (null === $name) { + $name = $this->defaultManager; + } + + if (!isset($this->managers[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); + } + + // force the creation of a new document manager + // if the current one is closed + $this->resetService($this->managers[$name]); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php new file mode 100644 index 00000000..a47727fa --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php @@ -0,0 +1,63 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract covering connection for a Doctrine persistence layer ManagerRegistry class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +interface ConnectionRegistry +{ + /** + * Gets the default connection name. + * + * @return string The default connection name + */ + function getDefaultConnectionName(); + + /** + * Gets the named connection. + * + * @param string $name The connection name (null for the default one) + * + * @return Connection + */ + function getConnection($name = null); + + /** + * Gets an array of all registered connections + * + * @return array An array of Connection instances + */ + function getConnections(); + + /** + * Gets all connection names. + * + * @return array An array of connection names + */ + function getConnectionNames(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php new file mode 100644 index 00000000..8055b66d --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php @@ -0,0 +1,77 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs; +use Doctrine\Common\Persistence\ObjectManager; + +/** + * Lifecycle Events are triggered by the UnitOfWork during lifecycle transitions + * of entities. + * + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class LifecycleEventArgs extends EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var object + */ + private $entity; + + /** + * Constructor + * + * @param object $entity + * @param ObjectManager $objectManager + */ + public function __construct($entity, ObjectManager $objectManager) + { + $this->entity = $entity; + $this->objectManager = $objectManager; + } + + /** + * Retireve associated Entity. + * + * @return object + */ + public function getEntity() + { + return $this->entity; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php new file mode 100644 index 00000000..4a18d167 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php @@ -0,0 +1,76 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs; +use Doctrine\Common\Persistence\ObjectManager; +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Class that holds event arguments for a loadMetadata event. + * + * @author Jonathan H. Wage + * @since 2.2 + */ +class LoadClassMetadataEventArgs extends EventArgs +{ + /** + * @var ClassMetadata + */ + private $classMetadata; + + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * Constructor. + * + * @param ClasseMetadata $classMetadata + * @param ObjectManager $objectManager + */ + public function __construct(ClassMetadata $classMetadata, ObjectManager $objectManager) + { + $this->classMetadata = $classMetadata; + $this->objectManager = $objectManager; + } + + /** + * Retrieve associated ClassMetadata. + * + * @return ClassMetadata + */ + public function getClassMetadata() + { + return $this->classMetadata; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php new file mode 100644 index 00000000..33c4d796 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php @@ -0,0 +1,59 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\Persistence\ObjectManager; + +/** + * Provides event arguments for the preFlush event. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class ManagerEventArgs extends \Doctrine\Common\EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * Constructor. + * + * @param ObjectManager $objectManager + */ + public function __construct(ObjectManager $objectManager) + { + $this->objectManager = $objectManager; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php new file mode 100644 index 00000000..f67ab50e --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php @@ -0,0 +1,84 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +/** + * Provides event arguments for the onClear event. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class OnClearEventArgs extends \Doctrine\Common\EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var string + */ + private $entityClass; + + /** + * Constructor. + * + * @param ObjectManager $objectManager + * @param string $entityClass Optional entity class + */ + public function __construct($objectManager, $entityClass = null) + { + $this->objectManager = $objectManager; + $this->entityClass = $entityClass; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } + + /** + * Name of the entity class that is cleared, or empty if all are cleared. + * + * @return string + */ + public function getEntityClass() + { + return $this->entityClass; + } + + /** + * Check if event clears all entities. + * + * @return bool + */ + public function clearsAllEntities() + { + return ($this->entityClass === null); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php new file mode 100644 index 00000000..191d053a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php @@ -0,0 +1,129 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs, + Doctrine\Common\Persistence\ObjectManager; + +/** + * Class that holds event arguments for a preUpdate event. + * + * @author Guilherme Blanco + * @author Roman Borschel + * @author Benjamin Eberlei + * @since 2.2 + */ +class PreUpdateEventArgs extends LifecycleEventArgs +{ + /** + * @var array + */ + private $entityChangeSet; + + /** + * Constructor. + * + * @param object $entity + * @param ObjectManager $objectManager + * @param array $changeSet + */ + public function __construct($entity, ObjectManager $objectManager, array &$changeSet) + { + parent::__construct($entity, $objectManager); + + $this->entityChangeSet = &$changeSet; + } + + /** + * Retrieve entity changeset. + * + * @return array + */ + public function getEntityChangeSet() + { + return $this->entityChangeSet; + } + + /** + * Check if field has a changeset. + * + * @return boolean + */ + public function hasChangedField($field) + { + return isset($this->entityChangeSet[$field]); + } + + /** + * Get the old value of the changeset of the changed field. + * + * @param string $field + * @return mixed + */ + public function getOldValue($field) + { + $this->assertValidField($field); + + return $this->entityChangeSet[$field][0]; + } + + /** + * Get the new value of the changeset of the changed field. + * + * @param string $field + * @return mixed + */ + public function getNewValue($field) + { + $this->assertValidField($field); + + return $this->entityChangeSet[$field][1]; + } + + /** + * Set the new value of this field. + * + * @param string $field + * @param mixed $value + */ + public function setNewValue($field, $value) + { + $this->assertValidField($field); + + $this->entityChangeSet[$field][1] = $value; + } + + /** + * Assert the field exists in changeset. + * + * @param string $field + */ + private function assertValidField($field) + { + if ( ! isset($this->entityChangeSet[$field])) { + throw new \InvalidArgumentException(sprintf( + 'Field "%s" is not a valid field of the entity "%s" in PreUpdateEventArgs.', + $field, + get_class($this->getEntity()) + )); + } + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php new file mode 100644 index 00000000..4d92426b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php @@ -0,0 +1,112 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract covering object managers for a Doctrine persistence layer ManagerRegistry class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +interface ManagerRegistry extends ConnectionRegistry +{ + /** + * Gets the default object manager name. + * + * @return string The default object manager name + */ + function getDefaultManagerName(); + + /** + * Gets a named object manager. + * + * @param string $name The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectManager + */ + function getManager($name = null); + + /** + * Gets an array of all registered object managers + * + * @return array An array of ObjectManager instances + */ + function getManagers(); + + /** + * Resets a named object manager. + * + * This method is useful when an object manager has been closed + * because of a rollbacked transaction AND when you think that + * it makes sense to get a new one to replace the closed one. + * + * Be warned that you will get a brand new object manager as + * the existing one is not useable anymore. This means that any + * other object with a dependency on this object manager will + * hold an obsolete reference. You can inject the registry instead + * to avoid this problem. + * + * @param string $name The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectManager + */ + function resetManager($name = null); + + /** + * Resolves a registered namespace alias to the full namespace. + * + * This method looks for the alias in all registered object managers. + * + * @param string $alias The alias + * + * @return string The full namespace + */ + function getAliasNamespace($alias); + + /** + * Gets all connection names. + * + * @return array An array of connection names + */ + function getManagerNames(); + + /** + * Gets the ObjectRepository for an persistent object. + * + * @param string $persistentObject The name of the persistent object. + * @param string $persistentManagerName The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectRepository + */ + function getRepository($persistentObject, $persistentManagerName = null); + + /** + * Gets the object manager associated with a given class. + * + * @param string $class A persistent object class name + * + * @return \Doctrine\Common\Persistence\ObjectManager|null + */ + function getManagerForClass($class); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php new file mode 100644 index 00000000..a2a61850 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php @@ -0,0 +1,359 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use Doctrine\Common\Cache\Cache; + +/** + * The ClassMetadataFactory is used to create ClassMetadata objects that contain all the + * metadata mapping informations of a class which describes how a class should be mapped + * to a relational database. + * + * This class was abstracted from the ORM ClassMetadataFactory + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +abstract class AbstractClassMetadataFactory implements ClassMetadataFactory +{ + /** + * Salt used by specific Object Manager implementation. + * + * @var string + */ + protected $cacheSalt = "\$CLASSMETADATA"; + + /** + * @var \Doctrine\Common\Cache\Cache + */ + private $cacheDriver; + + /** + * @var array + */ + private $loadedMetadata = array(); + + /** + * @var bool + */ + protected $initialized = false; + + /** + * @var ReflectionService + */ + private $reflectionService; + + /** + * Sets the cache driver used by the factory to cache ClassMetadata instances. + * + * @param Doctrine\Common\Cache\Cache $cacheDriver + */ + public function setCacheDriver(Cache $cacheDriver = null) + { + $this->cacheDriver = $cacheDriver; + } + + /** + * Gets the cache driver used by the factory to cache ClassMetadata instances. + * + * @return Doctrine\Common\Cache\Cache + */ + public function getCacheDriver() + { + return $this->cacheDriver; + } + + /** + * Return an array of all the loaded metadata currently in memory. + * + * @return array + */ + public function getLoadedMetadata() + { + return $this->loadedMetadata; + } + + /** + * Forces the factory to load the metadata of all classes known to the underlying + * mapping driver. + * + * @return array The ClassMetadata instances of all mapped classes. + */ + public function getAllMetadata() + { + if ( ! $this->initialized) { + $this->initialize(); + } + + $driver = $this->getDriver(); + $metadata = array(); + foreach ($driver->getAllClassNames() as $className) { + $metadata[] = $this->getMetadataFor($className); + } + + return $metadata; + } + + /** + * Lazy initialization of this stuff, especially the metadata driver, + * since these are not needed at all when a metadata cache is active. + * + * @return void + */ + abstract protected function initialize(); + + /** + * Get the fully qualified class-name from the namespace alias. + * + * @param string $namespaceAlias + * @param string $simpleClassName + * @return string + */ + abstract protected function getFqcnFromAlias($namespaceAlias, $simpleClassName); + + /** + * Return the mapping driver implementation. + * + * @return MappingDriver + */ + abstract protected function getDriver(); + + /** + * Wakeup reflection after ClassMetadata gets unserialized from cache. + * + * @param ClassMetadata $class + * @param ReflectionService $reflService + * @return void + */ + abstract protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService); + + /** + * Initialize Reflection after ClassMetadata was constructed. + * + * @param ClassMetadata $class + * @param ReflectionSErvice $reflService + * @return void + */ + abstract protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService); + + /** + * Gets the class metadata descriptor for a class. + * + * @param string $className The name of the class. + * @return Doctrine\Common\Persistence\Mapping\ClassMetadata + */ + public function getMetadataFor($className) + { + if ( ! isset($this->loadedMetadata[$className])) { + $realClassName = $className; + + // Check for namespace alias + if (strpos($className, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $className); + $realClassName = $this->getFqcnFromAlias($namespaceAlias, $simpleClassName); + + if (isset($this->loadedMetadata[$realClassName])) { + // We do not have the alias name in the map, include it + $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; + + return $this->loadedMetadata[$realClassName]; + } + } + + if ($this->cacheDriver) { + if (($cached = $this->cacheDriver->fetch($realClassName . $this->cacheSalt)) !== false) { + $this->loadedMetadata[$realClassName] = $cached; + $this->wakeupReflection($cached, $this->getReflectionService()); + } else { + foreach ($this->loadMetadata($realClassName) as $loadedClassName) { + $this->cacheDriver->save( + $loadedClassName . $this->cacheSalt, $this->loadedMetadata[$loadedClassName], null + ); + } + } + } else { + $this->loadMetadata($realClassName); + } + + if ($className != $realClassName) { + // We do not have the alias name in the map, include it + $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; + } + } + + return $this->loadedMetadata[$className]; + } + + /** + * Checks whether the factory has the metadata for a class loaded already. + * + * @param string $className + * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. + */ + public function hasMetadataFor($className) + { + return isset($this->loadedMetadata[$className]); + } + + /** + * Sets the metadata descriptor for a specific class. + * + * NOTE: This is only useful in very special cases, like when generating proxy classes. + * + * @param string $className + * @param ClassMetadata $class + */ + public function setMetadataFor($className, $class) + { + $this->loadedMetadata[$className] = $class; + } + + /** + * Get array of parent classes for the given entity class + * + * @param string $name + * @return array $parentClasses + */ + protected function getParentClasses($name) + { + // Collect parent classes, ignoring transient (not-mapped) classes. + $parentClasses = array(); + foreach (array_reverse($this->getReflectionService()->getParentClasses($name)) as $parentClass) { + if ( ! $this->getDriver()->isTransient($parentClass)) { + $parentClasses[] = $parentClass; + } + } + return $parentClasses; + } + + /** + * Loads the metadata of the class in question and all it's ancestors whose metadata + * is still not loaded. + * + * @param string $name The name of the class for which the metadata should get loaded. + * @param array $tables The metadata collection to which the loaded metadata is added. + */ + protected function loadMetadata($name) + { + if ( ! $this->initialized) { + $this->initialize(); + } + + $loaded = array(); + + $parentClasses = $this->getParentClasses($name); + $parentClasses[] = $name; + + // Move down the hierarchy of parent classes, starting from the topmost class + $parent = null; + $rootEntityFound = false; + $visited = array(); + $reflService = $this->getReflectionService(); + foreach ($parentClasses as $className) { + if (isset($this->loadedMetadata[$className])) { + $parent = $this->loadedMetadata[$className]; + if (isset($parent->isMappedSuperclass) && $parent->isMappedSuperclass === false) { + $rootEntityFound = true; + array_unshift($visited, $className); + } + continue; + } + + $class = $this->newClassMetadataInstance($className); + $this->initializeReflection($class, $reflService); + + $this->doLoadMetadata($class, $parent, $rootEntityFound); + + $this->loadedMetadata[$className] = $class; + + $parent = $class; + + if (isset($parent->isMappedSuperclass) && $class->isMappedSuperclass === false) { + $rootEntityFound = true; + array_unshift($visited, $className); + } + + $this->wakeupReflection($class, $reflService); + + $loaded[] = $className; + } + + return $loaded; + } + + /** + * Actually load the metadata from the underlying metadata + * + * @param ClassMetadata $class + * @param ClassMetadata $parent + * @param bool $rootEntityFound + * @return void + */ + abstract protected function doLoadMetadata($class, $parent, $rootEntityFound); + + /** + * Creates a new ClassMetadata instance for the given class name. + * + * @param string $className + * @return ClassMetadata + */ + abstract protected function newClassMetadataInstance($className); + + /** + * Check if this class is mapped by this Object Manager + ClassMetadata configuration + * + * @param $class + * @return bool + */ + public function isTransient($class) + { + if ( ! $this->initialized) { + $this->initialize(); + } + + return $this->getDriver()->isTransient($class); + } + + /** + * Set reflectionService. + * + * @param ReflectionService $reflectionService + */ + public function setReflectionService(ReflectionService $reflectionService) + { + $this->reflectionService = $reflectionService; + } + + /** + * Get the reflection service associated with this metadata factory. + * + * @return ReflectionService + */ + public function getReflectionService() + { + if ($this->reflectionService === null) { + $this->reflectionService = new RuntimeReflectionService(); + } + return $this->reflectionService; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php new file mode 100644 index 00000000..705d59ac --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php @@ -0,0 +1,165 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ClassMetadata +{ + /** + * Get fully-qualified class name of this persistent class. + * + * @return string + */ + function getName(); + + /** + * Gets the mapped identifier field name. + * + * The returned structure is an array of the identifier field names. + * + * @return array + */ + function getIdentifier(); + + /** + * Gets the ReflectionClass instance for this mapped class. + * + * @return ReflectionClass + */ + function getReflectionClass(); + + /** + * Checks if the given field name is a mapped identifier for this class. + * + * @param string $fieldName + * @return boolean + */ + function isIdentifier($fieldName); + + /** + * Checks if the given field is a mapped property for this class. + * + * @param string $fieldName + * @return boolean + */ + function hasField($fieldName); + + /** + * Checks if the given field is a mapped association for this class. + * + * @param string $fieldName + * @return boolean + */ + function hasAssociation($fieldName); + + /** + * Checks if the given field is a mapped single valued association for this class. + * + * @param string $fieldName + * @return boolean + */ + function isSingleValuedAssociation($fieldName); + + /** + * Checks if the given field is a mapped collection valued association for this class. + * + * @param string $fieldName + * @return boolean + */ + function isCollectionValuedAssociation($fieldName); + + /** + * A numerically indexed list of field names of this persistent class. + * + * This array includes identifier fields if present on this class. + * + * @return array + */ + function getFieldNames(); + + /** + * Returns an array of identifier field names numerically indexed. + * + * @return array + */ + function getIdentifierFieldNames(); + + /** + * A numerically indexed list of association names of this persistent class. + * + * This array includes identifier associations if present on this class. + * + * @return array + */ + function getAssociationNames(); + + /** + * Returns a type name of this field. + * + * This type names can be implementation specific but should at least include the php types: + * integer, string, boolean, float/double, datetime. + * + * @param string $fieldName + * @return string + */ + function getTypeOfField($fieldName); + + /** + * Returns the target class name of the given association. + * + * @param string $assocName + * @return string + */ + function getAssociationTargetClass($assocName); + + /** + * Checks if the association is the inverse side of a bidirectional association + * + * @param string $assocName + * @return boolean + */ + function isAssociationInverseSide($assocName); + + /** + * Returns the target field of the owning side of the association + * + * @param string $assocName + * @return string + */ + function getAssociationMappedByTargetField($assocName); + + /** + * Return the identifier of this object as an array with field name as key. + * + * Has to return an empty array if no identifier isset. + * + * @param object $object + * @return array + */ + function getIdentifierValues($object); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php new file mode 100644 index 00000000..bf27ba9a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php @@ -0,0 +1,74 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ClassMetadataFactory +{ + /** + * Forces the factory to load the metadata of all classes known to the underlying + * mapping driver. + * + * @return array The ClassMetadata instances of all mapped classes. + */ + function getAllMetadata(); + + /** + * Gets the class metadata descriptor for a class. + * + * @param string $className The name of the class. + * @return ClassMetadata + */ + function getMetadataFor($className); + + /** + * Checks whether the factory has the metadata for a class loaded already. + * + * @param string $className + * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. + */ + function hasMetadataFor($className); + + /** + * Sets the metadata descriptor for a specific class. + * + * @param string $className + * @param ClassMetadata $class + */ + function setMetadataFor($className, $class); + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped directly or as a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + function isTransient($className); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php new file mode 100644 index 00000000..f52d37ee --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php @@ -0,0 +1,214 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Cache\ArrayCache, + Doctrine\Common\Annotations\AnnotationReader, + Doctrine\Common\Annotations\AnnotationRegistry, + Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The AnnotationDriver reads the mapping metadata from docblock annotations. + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +abstract class AnnotationDriver implements MappingDriver +{ + /** + * The AnnotationReader. + * + * @var AnnotationReader + */ + protected $reader; + + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * The file extension of mapping documents. + * + * @var string + */ + protected $fileExtension = '.php'; + + /** + * Cache for AnnotationDriver#getAllClassNames() + * + * @var array + */ + protected $classNames; + + /** + * Name of the entity annotations as keys + * + * @var array + */ + protected $entityAnnotationClasses = array(); + + /** + * Initializes a new AnnotationDriver that uses the given AnnotationReader for reading + * docblock annotations. + * + * @param AnnotationReader $reader The AnnotationReader to use, duck-typed. + * @param string|array $paths One or multiple paths where mapping classes can be found. + */ + public function __construct($reader, $paths = null) + { + $this->reader = $reader; + if ($paths) { + $this->addPaths((array) $paths); + } + } + + /** + * Append lookup paths to metadata driver. + * + * @param array $paths + */ + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * Retrieve the defined metadata lookup paths. + * + * @return array + */ + public function getPaths() + { + return $this->paths; + } + + /** + * Retrieve the current annotation reader + * + * @return AnnotationReader + */ + public function getReader() + { + return $this->reader; + } + + /** + * Get the file extension used to look for mapping files under + * + * @return void + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * Whether the class with the specified name is transient. Only non-transient + * classes, that is entities and mapped superclasses, should have their metadata loaded. + * + * A class is non-transient if it is annotated with an annotation + * from the {@see AnnotationDriver::entityAnnotationClasses}. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + $classAnnotations = $this->reader->getClassAnnotations(new \ReflectionClass($className)); + + foreach ($classAnnotations as $annot) { + if (isset($this->entityAnnotationClasses[get_class($annot)])) { + return false; + } + } + return true; + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames() + { + if ($this->classNames !== null) { + return $this->classNames; + } + + if (!$this->paths) { + throw MappingException::pathRequired(); + } + + $classes = array(); + $includedFiles = array(); + + foreach ($this->paths as $path) { + if ( ! is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RegexIterator( + new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS), + \RecursiveIteratorIterator::LEAVES_ONLY + ), + '/^.+' . str_replace('.', '\.', $this->fileExtension) . '$/i', + \RecursiveRegexIterator::GET_MATCH + ); + + foreach ($iterator as $file) { + $sourceFile = realpath($file[0]); + + require_once $sourceFile; + + $includedFiles[] = $sourceFile; + } + } + + $declared = get_declared_classes(); + + foreach ($declared as $className) { + $rc = new \ReflectionClass($className); + $sourceFile = $rc->getFileName(); + if (in_array($sourceFile, $includedFiles) && ! $this->isTransient($className)) { + $classes[] = $className; + } + } + + $this->classNames = $classes; + + return $classes; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php new file mode 100644 index 00000000..efaf545e --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php @@ -0,0 +1,169 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * Locate the file that contains the metadata information for a given class name. + * + * This behavior is inpependent of the actual content of the file. It just detects + * the file which is responsible for the given class name. + * + * @author Benjamin Eberlei + * @author Johannes M. Schmitt + */ +class DefaultFileLocator implements FileLocator +{ + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * The file extension of mapping documents. + * + * @var string + */ + protected $fileExtension; + + /** + * Initializes a new FileDriver that looks in the given path(s) for mapping + * documents and operates in the specified operating mode. + * + * @param string|array $paths One or multiple paths where mapping documents can be found. + */ + public function __construct($paths, $fileExtension = null) + { + $this->addPaths((array) $paths); + $this->fileExtension = $fileExtension; + } + + /** + * Append lookup paths to metadata driver. + * + * @param array $paths + */ + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * Retrieve the defined metadata lookup paths. + * + * @return array + */ + public function getPaths() + { + return $this->paths; + } + + /** + * Get the file extension used to look for mapping files under + * + * @return void + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * {@inheritDoc} + */ + public function findMappingFile($className) + { + $fileName = str_replace('\\', '.', $className) . $this->fileExtension; + + // Check whether file exists + foreach ($this->paths as $path) { + if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { + return $path . DIRECTORY_SEPARATOR . $fileName; + } + } + + throw MappingException::mappingFileNotFound($className, $fileName); + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames($globalBasename) + { + $classes = array(); + + if ($this->paths) { + foreach ($this->paths as $path) { + if ( ! is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + $fileName = $file->getBasename($this->fileExtension); + + if ($fileName == $file->getBasename() || $fileName == $globalBasename) { + continue; + } + + // NOTE: All files found here means classes are not transient! + $classes[] = str_replace('.', '\\', $fileName); + } + } + } + + return $classes; + } + + /** + * {@inheritDoc} + */ + public function fileExists($className) + { + $fileName = str_replace('\\', '.', $className) . $this->fileExtension; + + // Check whether file exists + foreach ((array) $this->paths as $path) { + if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php new file mode 100644 index 00000000..22cf117d --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php @@ -0,0 +1,178 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * Base driver for file-based metadata drivers. + * + * A file driver operates in a mode where it loads the mapping files of individual + * classes on demand. This requires the user to adhere to the convention of 1 mapping + * file per class and the file names of the mapping files must correspond to the full + * class name, including namespace, with the namespace delimiters '\', replaced by dots '.'. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.com + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +abstract class FileDriver implements MappingDriver +{ + /** + * @var FileLocator + */ + protected $locator; + + /** + * @var array + */ + protected $classCache; + + /** + * @var string + */ + protected $globalBasename; + + /** + * Initializes a new FileDriver that looks in the given path(s) for mapping + * documents and operates in the specified operating mode. + * + * @param string|array|FileLocator $paths A FileLocator or one/multiple paths where mapping documents can be found. + * @param string $fileExtension + */ + public function __construct($locator, $fileExtension = null) + { + if ($locator instanceof FileLocator) { + $this->locator = $locator; + } else { + $this->locator = new DefaultFileLocator((array)$locator, $fileExtension); + } + } + + public function setGlobalBasename($file) + { + $this->globalBasename = $file; + } + + public function getGlobalBasename() + { + return $this->globalBasename; + } + + /** + * Get the element of schema meta data for the class from the mapping file. + * This will lazily load the mapping file if it is not loaded yet + * + * @return array $element The element of schema meta data + */ + public function getElement($className) + { + if ($this->classCache === null) { + $this->initialize(); + } + + if (isset($this->classCache[$className])) { + return $this->classCache[$className]; + } + + $result = $this->loadMappingFile($this->locator->findMappingFile($className)); + + return $result[$className]; + } + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped as an Entity or a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + if ($this->classCache === null) { + $this->initialize(); + } + + if (isset($this->classCache[$className])) { + return false; + } + + return !$this->locator->fileExists($className); + } + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + public function getAllClassNames() + { + if ($this->classCache === null) { + $this->initialize(); + } + + $classNames = (array)$this->locator->getAllClassNames($this->globalBasename); + if ($this->classCache) { + $classNames = array_merge(array_keys($this->classCache), $classNames); + } + return $classNames; + } + + /** + * Loads a mapping file with the given name and returns a map + * from class/entity names to their corresponding file driver elements. + * + * @param string $file The mapping file to load. + * @return array + */ + abstract protected function loadMappingFile($file); + + /** + * Initialize the class cache from all the global files. + * + * Using this feature adds a substantial performance hit to file drivers as + * more metadata has to be loaded into memory than might actually be + * necessary. This may not be relevant to scenarios where caching of + * metadata is in place, however hits very hard in scenarios where no + * caching is used. + * + * @return void + */ + protected function initialize() + { + $this->classCache = array(); + if (null !== $this->globalBasename) { + foreach ($this->locator->getPaths() as $path) { + $file = $path.'/'.$this->globalBasename.$this->locator->getFileExtension(); + if (is_file($file)) { + $this->classCache = array_merge( + $this->classCache, + $this->loadMappingFile($file) + ); + } + } + } + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php new file mode 100644 index 00000000..a1019d71 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php @@ -0,0 +1,69 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +/** + * Locate the file that contains the metadata information for a given class name. + * + * This behavior is inpependent of the actual content of the file. It just detects + * the file which is responsible for the given class name. + * + * @author Benjamin Eberlei + * @author Johannes M. Schmitt + */ +interface FileLocator +{ + /** + * Locate mapping file for the given class name. + * + * @param string $className + * @return string + */ + function findMappingFile($className); + + /** + * Get all class names that are found with this file locator. + * + * @param string $globalBasename Passed to allow excluding the basename + * @return array + */ + function getAllClassNames($globalBasename); + + /** + * Check if a file can be found for this class name. + * + * @return bool + */ + function fileExists($className); + + /** + * Get all the paths that this file locator looks for mapping files. + * + * @return array + */ + function getPaths(); + + /** + * Get the file extension that mapping files are suffixed with. + * + * @return string + */ + function getFileExtension(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php new file mode 100644 index 00000000..c050d323 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php @@ -0,0 +1,56 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Contract for metadata drivers. + * + * @since 2.2 + * @author Jonathan H. Wage + */ +interface MappingDriver +{ + /** + * Loads the metadata for the specified class into the provided container. + * + * @param string $className + * @param ClassMetadata $metadata + */ + function loadMetadataForClass($className, ClassMetadata $metadata); + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + function getAllClassNames(); + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped as an Entity or a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + function isTransient($className); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php new file mode 100644 index 00000000..c7c14527 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php @@ -0,0 +1,125 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\Driver\MappingDriver, + Doctrine\Common\Persistence\Mapping\ClassMetadata, + Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The DriverChain allows you to add multiple other mapping drivers for + * certain namespaces + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class MappingDriverChain implements MappingDriver +{ + /** + * @var array + */ + private $drivers = array(); + + /** + * Add a nested driver. + * + * @param Driver $nestedDriver + * @param string $namespace + */ + public function addDriver(MappingDriver $nestedDriver, $namespace) + { + $this->drivers[$namespace] = $nestedDriver; + } + + /** + * Get the array of nested drivers. + * + * @return array $drivers + */ + public function getDrivers() + { + return $this->drivers; + } + + /** + * Loads the metadata for the specified class into the provided container. + * + * @param string $className + * @param ClassMetadataInfo $metadata + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + foreach ($this->drivers as $namespace => $driver) { + if (strpos($className, $namespace) === 0) { + $driver->loadMetadataForClass($className, $metadata); + return; + } + } + + throw MappingException::classNotFoundInNamespaces($className, array_keys($this->drivers)); + } + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + public function getAllClassNames() + { + $classNames = array(); + $driverClasses = array(); + foreach ($this->drivers AS $namespace => $driver) { + $oid = spl_object_hash($driver); + if (!isset($driverClasses[$oid])) { + $driverClasses[$oid] = $driver->getAllClassNames(); + } + + foreach ($driverClasses[$oid] AS $className) { + if (strpos($className, $namespace) === 0) { + $classNames[$className] = true; + } + } + } + return array_keys($classNames); + } + + /** + * Whether the class with the specified name should have its metadata loaded. + * + * This is only the case for non-transient classes either mapped as an Entity or MappedSuperclass. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + foreach ($this->drivers AS $namespace => $driver) { + if (strpos($className, $namespace) === 0) { + return $driver->isTransient($className); + } + } + + // class isTransient, i.e. not an entity or mapped superclass + return true; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php new file mode 100644 index 00000000..7751dae3 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * The PHPDriver includes php files which just populate ClassMetadataInfo + * instances with plain php code + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class PHPDriver extends FileDriver +{ + /** + * {@inheritdoc} + */ + protected $metadata; + + /** + * {@inheritDoc} + */ + public function __construct($locator, $fileExtension = null) + { + $fileExtension = ".php"; + parent::__construct($locator, $fileExtension); + } + + /** + * {@inheritdoc} + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + $this->metadata = $metadata; + $this->loadMappingFile($this->locator->findMappingFile($className)); + } + + /** + * {@inheritdoc} + */ + protected function loadMappingFile($file) + { + $metadata = $this->metadata; + include $file; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php new file mode 100644 index 00000000..9103ed86 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php @@ -0,0 +1,131 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The StaticPHPDriver calls a static loadMetadata() method on your entity + * classes where you can manually populate the ClassMetadata instance. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class StaticPHPDriver implements MappingDriver +{ + /** + * Paths of entity directories. + * + * @var array + */ + private $paths = array(); + + /** + * Map of all class names. + * + * @var array + */ + private $classNames; + + public function __construct($paths) + { + $this->addPaths((array) $paths); + } + + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * {@inheritdoc} + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + $className::loadMetadata($metadata); + } + + /** + * {@inheritDoc} + * @todo Same code exists in AnnotationDriver, should we re-use it somehow or not worry about it? + */ + public function getAllClassNames() + { + if ($this->classNames !== null) { + return $this->classNames; + } + + if (!$this->paths) { + throw MappingException::pathRequired(); + } + + $classes = array(); + $includedFiles = array(); + + foreach ($this->paths as $path) { + if (!is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + if ($file->getBasename('.php') == $file->getBasename()) { + continue; + } + + $sourceFile = realpath($file->getPathName()); + require_once $sourceFile; + $includedFiles[] = $sourceFile; + } + } + + $declared = get_declared_classes(); + + foreach ($declared as $className) { + $rc = new \ReflectionClass($className); + $sourceFile = $rc->getFileName(); + if (in_array($sourceFile, $includedFiles) && !$this->isTransient($className)) { + $classes[] = $className; + } + } + + $this->classNames = $classes; + + return $classes; + } + + /** + * {@inheritdoc} + */ + public function isTransient($className) + { + return ! method_exists($className, 'loadMetadata'); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php new file mode 100644 index 00000000..d338cf60 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php @@ -0,0 +1,198 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The Symfony File Locator makes a simplifying assumptions compared + * to the DefaultFileLocator. By assuming paths only contain entities of a certain + * namespace the mapping files consists of the short classname only. + * + * @author Fabien Potencier + * @author Benjamin Eberlei + * @license MIT + */ +class SymfonyFileLocator implements FileLocator +{ + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * A map of mapping directory path to namespace prefix used to expand class shortnames. + * + * @var array + */ + protected $prefixes = array(); + + /** + * File extension that is searched for. + * + * @var string + */ + protected $fileExtension; + + public function __construct(array $prefixes, $fileExtension = null) + { + $this->addNamespacePrefixes($prefixes); + $this->fileExtension = $fileExtension; + } + + public function addNamespacePrefixes(array $prefixes) + { + $this->prefixes = array_merge($this->prefixes, $prefixes); + $this->paths = array_merge($this->paths, array_keys($prefixes)); + } + + public function getNamespacePrefixes() + { + return $this->prefixes; + } + + /** + * {@inheritDoc} + */ + public function getPaths() + { + return $this->paths; + } + + /** + * {@inheritDoc} + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * {@inheritDoc} + */ + public function fileExists($className) + { + $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; + foreach ($this->paths as $path) { + if (!isset($this->prefixes[$path])) { + // global namespace class + if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { + return true; + } + + continue; + } + + $prefix = $this->prefixes[$path]; + + if (0 !== strpos($className, $prefix.'\\')) { + continue; + } + + $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; + return is_file($filename); + } + + return false; + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames($globalBasename = null) + { + $classes = array(); + + if ($this->paths) { + foreach ((array) $this->paths as $path) { + if (!is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + $fileName = $file->getBasename($this->fileExtension); + + if ($fileName == $file->getBasename() || $fileName == $globalBasename) { + continue; + } + + // NOTE: All files found here means classes are not transient! + if (isset($this->prefixes[$path])) { + $classes[] = $this->prefixes[$path].'\\'.str_replace('.', '\\', $fileName); + } else { + $classes[] = str_replace('.', '\\', $fileName); + } + } + } + } + + return $classes; + } + + /** + * {@inheritDoc} + */ + public function findMappingFile($className) + { + $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; + foreach ($this->paths as $path) { + if (!isset($this->prefixes[$path])) { + if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { + return $path.DIRECTORY_SEPARATOR.$defaultFileName; + } + + continue; + } + + $prefix = $this->prefixes[$path]; + + if (0 !== strpos($className, $prefix.'\\')) { + continue; + } + + $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; + if (is_file($filename)) { + return $filename; + } + + throw MappingException::mappingFileNotFound($className, $filename); + } + + throw MappingException::mappingFileNotFound($className, substr($className, strrpos($className, '\\') + 1).$this->fileExtension); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php new file mode 100644 index 00000000..4ecd2ad5 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php @@ -0,0 +1,57 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * A MappingException indicates that something is wrong with the mapping setup. + * + * @since 2.2 + */ +class MappingException extends \Exception +{ + public static function classNotFoundInNamespaces($className, $namespaces) + { + return new self("The class '" . $className . "' was not found in the ". + "chain configured namespaces " . implode(", ", $namespaces)); + } + + public static function pathRequired() + { + return new self("Specifying the paths to your entities is required ". + "in the AnnotationDriver to retrieve all class names."); + } + + public static function fileMappingDriversRequireConfiguredDirectoryPath($path = null) + { + if ( ! empty($path)) { + $path = '[' . $path . ']'; + } + + return new self( + 'File mapping drivers must have a valid directory path, ' . + 'however the given path ' . $path . ' seems to be incorrect!' + ); + } + + public static function mappingFileNotFound($entityName, $fileName) + { + return new self("No mapping file found named '$fileName' for class '$entityName'."); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php new file mode 100644 index 00000000..4e0e312f --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php @@ -0,0 +1,80 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Very simple reflection service abstraction. + * + * This is required inside metadata layers that may require either + * static or runtime reflection. + * + * @author Benjamin Eberlei + */ +interface ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + function getParentClasses($class); + + /** + * Return the shortname of a class. + * + * @param string $class + * @return string + */ + function getClassShortName($class); + + /** + * @param string $class + * @return string + */ + function getClassNamespace($class); + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + function getClass($class); + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + function getAccessibleProperty($class, $property); + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + function hasPublicMethod($class, $method); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php new file mode 100644 index 00000000..abcff581 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php @@ -0,0 +1,102 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use ReflectionClass; +use ReflectionProperty; + +/** + * PHP Runtime Reflection Service + * + * @author Benjamin Eberlei + */ +class RuntimeReflectionService implements ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + public function getParentClasses($class) + { + return class_parents($class); + } + + /** + * Return the shortname of a class. + * + * @param string $class + * @return string + */ + public function getClassShortName($class) + { + $r = new ReflectionClass($class); + return $r->getShortName(); + } + + /** + * @param string $class + * @return string + */ + public function getClassNamespace($class) + { + $r = new ReflectionClass($class); + return $r->getNamespaceName(); + } + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + public function getClass($class) + { + return new ReflectionClass($class); + } + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + public function getAccessibleProperty($class, $property) + { + $property = new ReflectionProperty($class, $property); + $property->setAccessible(true); + return $property; + } + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + public function hasPublicMethod($class, $method) + { + return method_exists($class, $method) && is_callable(array($class, $method)); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php new file mode 100644 index 00000000..2de6e761 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php @@ -0,0 +1,107 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use ReflectionClass; +use ReflectionProperty; + +/** + * PHP Runtime Reflection Service + * + * @author Benjamin Eberlei + */ +class StaticReflectionService implements ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + public function getParentClasses($class) + { + return array(); + } + + /** + * Return the shortname of a class. + * + * @param string $className + * @return string + */ + public function getClassShortName($className) + { + if (strpos($className, '\\') !== false) { + $className = substr($className, strrpos($className, "\\")+1); + } + return $className; + } + + /** + * Return the namespace of a class. + * + * @param string $className + * @return string + */ + public function getClassNamespace($className) + { + $namespace = ''; + if (strpos($className, '\\') !== false) { + $namespace = strrev(substr( strrev($className), strpos(strrev($className), '\\')+1 )); + } + return $namespace; + } + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + public function getClass($class) + { + return null; + } + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + public function getAccessibleProperty($class, $property) + { + return null; + } + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + public function hasPublicMethod($class, $method) + { + return method_exists($class, $method) && is_callable(array($class, $method)); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php new file mode 100644 index 00000000..6d70fc12 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php @@ -0,0 +1,143 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract for a Doctrine persistence layer ObjectManager class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ObjectManager +{ + /** + * Finds a object by its identifier. + * + * This is just a convenient shortcut for getRepository($className)->find($id). + * + * @param string + * @param mixed + * @return object + */ + function find($className, $id); + + /** + * Tells the ObjectManager to make an instance managed and persistent. + * + * The object will be entered into the database as a result of the flush operation. + * + * NOTE: The persist operation always considers objects that are not yet known to + * this ObjectManager as NEW. Do not pass detached objects to the persist operation. + * + * @param object $object The instance to make managed and persistent. + */ + function persist($object); + + /** + * Removes an object instance. + * + * A removed object will be removed from the database as a result of the flush operation. + * + * @param object $object The object instance to remove. + */ + function remove($object); + + /** + * Merges the state of a detached object into the persistence context + * of this ObjectManager and returns the managed copy of the object. + * The object passed to merge will not become associated/managed with this ObjectManager. + * + * @param object $object + */ + function merge($object); + + /** + * Detaches an object from the ObjectManager, causing a managed object to + * become detached. Unflushed changes made to the object if any + * (including removal of the object), will not be synchronized to the database. + * Objects which previously referenced the detached object will continue to + * reference it. + * + * @param object $object The object to detach. + */ + function detach($object); + + /** + * Refreshes the persistent state of an object from the database, + * overriding any local changes that have not yet been persisted. + * + * @param object $object The object to refresh. + */ + function refresh($object); + + /** + * Flushes all changes to objects that have been queued up to now to the database. + * This effectively synchronizes the in-memory state of managed objects with the + * database. + */ + function flush(); + + /** + * Gets the repository for a class. + * + * @param string $className + * @return \Doctrine\Common\Persistence\ObjectRepository + */ + function getRepository($className); + + /** + * Returns the ClassMetadata descriptor for a class. + * + * The class name must be the fully-qualified class name without a leading backslash + * (as it is returned by get_class($obj)). + * + * @param string $className + * @return \Doctrine\Common\Persistence\Mapping\ClassMetadata + */ + function getClassMetadata($className); + + /** + * Gets the metadata factory used to gather the metadata of classes. + * + * @return Doctrine\Common\Persistence\Mapping\ClassMetadataFactory + */ + function getMetadataFactory(); + + /** + * Helper method to initialize a lazy loading proxy or persistent collection. + * + * This method is a no-op for other objects. + * + * @param object $obj + */ + function initializeObject($obj); + + /** + * Check if the object is part of the current UnitOfWork and therefore + * managed. + * + * @param object $object + * @return bool + */ + function contains($object); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php new file mode 100644 index 00000000..015dd3dd --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php @@ -0,0 +1,49 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Makes a Persistent Objects aware of its own object-manager. + * + * Using this interface the managing object manager and class metadata instances + * are injected into the persistent object after construction. This allows + * you to implement ActiveRecord functionality on top of the persistance-ignorance + * that Doctrine propagates. + * + * Word of Warning: This is a very powerful hook to change how you can work with your domain models. + * Using this hook will break the Single Responsibility Principle inside your Domain Objects + * and increase the coupling of database and objects. + * + * Every ObjectManager has to implement this functionality itself. + * + * @author Benjamin Eberlei + */ +interface ObjectManagerAware +{ + /** + * Injects responsible ObjectManager and the ClassMetadata into this persistent object. + * + * @param ObjectManager $objectManager + * @param ClassMetadata $classMetadata + */ + public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php new file mode 100644 index 00000000..22633288 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php @@ -0,0 +1,78 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract for a Doctrine persistence layer ObjectRepository class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ObjectRepository +{ + /** + * Finds an object by its primary key / identifier. + * + * @param $id The identifier. + * @return object The object. + */ + function find($id); + + /** + * Finds all objects in the repository. + * + * @return mixed The objects. + */ + function findAll(); + + /** + * Finds objects by a set of criteria. + * + * Optionally sorting and limiting details can be passed. An implementation may throw + * an UnexpectedValueException if certain values of the sorting or limiting details are + * not supported. + * + * @throws UnexpectedValueException + * @param array $criteria + * @param array|null $orderBy + * @param int|null $limit + * @param int|null $offset + * @return mixed The objects. + */ + function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null); + + /** + * Finds a single object by a set of criteria. + * + * @param array $criteria + * @return object The object. + */ + function findOneBy(array $criteria); + + /** + * Returns the class name of the object managed by the repository + * + * @return string + */ + function getClassName(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php new file mode 100644 index 00000000..4274af62 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php @@ -0,0 +1,233 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; + +/** + * PersistentObject base class that implements getter/setter methods for all mapped fields and associations + * by overriding __call. + * + * This class is a forward compatible implementation of the PersistentObject trait. + * + * + * Limitations: + * + * 1. All persistent objects have to be associated with a single ObjectManager, multiple + * ObjectManagers are not supported. You can set the ObjectManager with `PersistentObject#setObjectManager()`. + * 2. Setters and getters only work if a ClassMetadata instance was injected into the PersistentObject. + * This is either done on `postLoad` of an object or by accessing the global object manager. + * 3. There are no hooks for setters/getters. Just implement the method yourself instead of relying on __call(). + * 4. Slower than handcoded implementations: An average of 7 method calls per access to a field and 11 for an association. + * 5. Only the inverse side associations get autoset on the owning side aswell. Setting objects on the owning side + * will not set the inverse side associations. + * + * @example + * + * PersistentObject::setObjectManager($em); + * + * class Foo extends PersistentObject + * { + * private $id; + * } + * + * $foo = new Foo(); + * $foo->getId(); // method exists through __call + * + * @author Benjamin Eberlei + */ +abstract class PersistentObject implements ObjectManagerAware +{ + /** + * @var ObjectManager + */ + private static $objectManager; + + /** + * @var ClassMetadata + */ + private $cm; + + /** + * Set the object manager responsible for all persistent object base classes. + * + * @param ObjectManager $objectManager + */ + static public function setObjectManager(ObjectManager $objectManager = null) + { + self::$objectManager = $objectManager; + } + + /** + * @return ObjectManager + */ + static public function getObjectManager() + { + return self::$objectManager; + } + + /** + * Inject Doctrine Object Manager + * + * @param ObjectManager $objectManager + * @param ClassMetadata $classMetadata + */ + public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata) + { + if ($objectManager !== self::$objectManager) { + throw new \RuntimeException("Trying to use PersistentObject with different ObjectManager instances. " . + "Was PersistentObject::setObjectManager() called?"); + } + + $this->cm = $classMetadata; + } + + /** + * Sets a persistent fields value. + * + * @throws InvalidArgumentException - When the wrong target object type is passed to an association + * @throws BadMethodCallException - When no persistent field exists by that name. + * @param string $field + * @param array $args + * @return void + */ + private function set($field, $args) + { + $this->initializeDoctrine(); + + if ($this->cm->hasField($field) && !$this->cm->isIdentifier($field)) { + $this->$field = $args[0]; + } else if ($this->cm->hasAssociation($field) && $this->cm->isSingleValuedAssociation($field)) { + $targetClass = $this->cm->getAssociationTargetClass($field); + if (!($args[0] instanceof $targetClass) && $args[0] !== null) { + throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); + } + $this->$field = $args[0]; + $this->completeOwningSide($field, $targetClass, $args[0]); + } else { + throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); + } + } + + /** + * Get persistent field value. + * + * @throws BadMethodCallException - When no persistent field exists by that name. + * @param string $field + * @return mixed + */ + private function get($field) + { + $this->initializeDoctrine(); + + if ( $this->cm->hasField($field) || $this->cm->hasAssociation($field) ) { + return $this->$field; + } else { + throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); + } + } + + /** + * If this is an inverse side association complete the owning side. + * + * @param string $field + * @param ClassMetadata $targetClass + * @param object $targetObject + */ + private function completeOwningSide($field, $targetClass, $targetObject) + { + // add this object on the owning side aswell, for obvious infinite recursion + // reasons this is only done when called on the inverse side. + if ($this->cm->isAssociationInverseSide($field)) { + $mappedByField = $this->cm->getAssociationMappedByTargetField($field); + $targetMetadata = self::$objectManager->getClassMetadata($targetClass); + + $setter = ($targetMetadata->isCollectionValuedAssociation($mappedByField) ? "add" : "set").$mappedByField; + $targetObject->$setter($this); + } + } + + /** + * Add an object to a collection + * + * @param type $field + * @param assoc $args + */ + private function add($field, $args) + { + $this->initializeDoctrine(); + + if ($this->cm->hasAssociation($field) && $this->cm->isCollectionValuedAssociation($field)) { + $targetClass = $this->cm->getAssociationTargetClass($field); + if (!($args[0] instanceof $targetClass)) { + throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); + } + if (!($this->$field instanceof Collection)) { + $this->$field = new ArrayCollection($this->$field ?: array()); + } + $this->$field->add($args[0]); + $this->completeOwningSide($field, $targetClass, $args[0]); + } else { + throw new \BadMethodCallException("There is no method add".$field."() on ".$this->cm->getName()); + } + } + + /** + * Initialize Doctrine Metadata for this class. + * + * @return void + */ + private function initializeDoctrine() + { + if ($this->cm !== null) { + return; + } + + if (!self::$objectManager) { + throw new \RuntimeException("No runtime object manager set. Call PersistentObject#setObjectManager()."); + } + + $this->cm = self::$objectManager->getClassMetadata(get_class($this)); + } + + /** + * Magic method that implements + * + * @param string $method + * @param array $args + * @return mixed + */ + public function __call($method, $args) + { + $command = substr($method, 0, 3); + $field = lcfirst(substr($method, 3)); + if ($command == "set") { + $this->set($field, $args); + } else if ($command == "get") { + return $this->get($field); + } else if ($command == "add") { + $this->add($field, $args); + } else { + throw new \BadMethodCallException("There is no method ".$method." on ".$this->cm->getName()); + } + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php new file mode 100644 index 00000000..726979fc --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php @@ -0,0 +1,60 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Interface for proxy classes. + * + * @author Roman Borschel + * @since 2.2 + */ +interface Proxy +{ + /** + * Marker for Proxy class names. + * + * @var string + */ + const MARKER = '__CG__'; + + /** + * Length of the proxy marker + * + * @var int + */ + const MARKER_LENGTH = 6; + + /** + * Initialize this proxy if its not yet initialized. + * + * Acts as a no-op if already initialized. + * + * @return void + */ + public function __load(); + + /** + * Is this proxy initialized or not. + * + * @return bool + */ + public function __isInitialized(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php b/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php new file mode 100644 index 00000000..87c5b413 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php @@ -0,0 +1,48 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Contract for classes that are potential listeners of a NotifyPropertyChanged + * implementor. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface PropertyChangedListener +{ + /** + * Notifies the listener of a property change. + * + * @param object $sender The object on which the property changed. + * @param string $propertyName The name of the property that changed. + * @param mixed $oldValue The old value of the property that changed. + * @param mixed $newValue The new value of the property that changed. + */ + function propertyChanged($sender, $propertyName, $oldValue, $newValue); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php new file mode 100644 index 00000000..c3462782 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php @@ -0,0 +1,103 @@ +. + */ + +namespace Doctrine\Common\Util; + +use Doctrine\Common\Persistence\Proxy; + +/** + * Class and reflection related functionality for objects that + * might or not be proxy objects at the moment. + * + * @author Benjamin Eberlei + * @author Johannes Schmitt + */ +class ClassUtils +{ + /** + * Get the real class name of a class name that could be a proxy. + * + * @param string + * @return string + */ + public static function getRealClass($class) + { + if (false === $pos = strrpos($class, '\\'.Proxy::MARKER.'\\')) { + return $class; + } + + return substr($class, $pos + Proxy::MARKER_LENGTH + 2); + } + + /** + * Get the real class name of an object (even if its a proxy) + * + * @param object + * @return string + */ + public static function getClass($object) + { + return self::getRealClass(get_class($object)); + } + + /** + * Get the real parent class name of a class or object + * + * @param string + * @return string + */ + public static function getParentClass($className) + { + return get_parent_class( self::getRealClass( $className ) ); + } + + /** + * Create a new reflection class + * + * @param string + * @return ReflectionClass + */ + public static function newReflectionClass($class) + { + return new \ReflectionClass( self::getRealClass( $class ) ); + } + + /** + * Create a new reflection object + * + * @param object + * @return ReflectionObject + */ + public static function newReflectionObject($object) + { + return self::newReflectionClass( self::getClass( $object ) ); + } + + /** + * Given a class name and a proxy namespace return the proxy name. + * + * @param string $className + * @param string $proxyNamespace + * @return string + */ + public static function generateProxyClassName($className, $proxyNamespace) + { + return rtrim($proxyNamespace, '\\') . '\\'.Proxy::MARKER.'\\' . ltrim($className, '\\'); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php new file mode 100644 index 00000000..57ae3120 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php @@ -0,0 +1,123 @@ +. + */ + +namespace Doctrine\Common\Util; + +/** + * Static class containing most used debug methods. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Giorgio Sironi + */ +final class Debug +{ + /** + * Private constructor (prevents from instantiation) + * + */ + private function __construct() {} + + /** + * Prints a dump of the public, protected and private properties of $var. + * + * @static + * @link http://xdebug.org/ + * @param mixed $var + * @param integer $maxDepth Maximum nesting level for object properties + * @param boolean $stripTags Flag that indicate if output should strip HTML tags + */ + public static function dump($var, $maxDepth = 2, $stripTags = true) + { + ini_set('html_errors', 'On'); + + if (extension_loaded('xdebug')) { + ini_set('xdebug.var_display_max_depth', $maxDepth); + } + + $var = self::export($var, $maxDepth++); + + ob_start(); + var_dump($var); + $dump = ob_get_contents(); + ob_end_clean(); + + echo ($stripTags ? strip_tags(html_entity_decode($dump)) : $dump); + + ini_set('html_errors', 'Off'); + } + + public static function export($var, $maxDepth) + { + $return = null; + $isObj = is_object($var); + + if ($isObj && in_array('Doctrine\Common\Collections\Collection', class_implements($var))) { + $var = $var->toArray(); + } + + if ($maxDepth) { + if (is_array($var)) { + $return = array(); + + foreach ($var as $k => $v) { + $return[$k] = self::export($v, $maxDepth - 1); + } + } else if ($isObj) { + $return = new \stdclass(); + if ($var instanceof \DateTime) { + $return->__CLASS__ = "DateTime"; + $return->date = $var->format('c'); + $return->timezone = $var->getTimeZone()->getName(); + } else { + $reflClass = ClassUtils::newReflectionObject($var); + $return->__CLASS__ = ClassUtils::getClass($var); + + if ($var instanceof \Doctrine\Common\Persistence\Proxy) { + $return->__IS_PROXY__ = true; + $return->__PROXY_INITIALIZED__ = $var->__isInitialized(); + } + + foreach ($reflClass->getProperties() as $reflProperty) { + $name = $reflProperty->getName(); + + $reflProperty->setAccessible(true); + $return->$name = self::export($reflProperty->getValue($var), $maxDepth - 1); + } + } + } else { + $return = $var; + } + } else { + $return = is_object($var) ? get_class($var) + : (is_array($var) ? 'Array(' . count($var) . ')' : $var); + } + + return $return; + } + + public static function toString($obj) + { + return method_exists('__toString', $obj) ? (string) $obj : get_class($obj) . '@' . spl_object_hash($obj); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php new file mode 100644 index 00000000..ba1eb17b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php @@ -0,0 +1,72 @@ +. + */ + +namespace Doctrine\Common\Util; + +/** + * Doctrine inflector has static methods for inflecting text + * + * The methods in these classes are from several different sources collected + * across several different php projects and several different authors. The + * original author names and emails are not known + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 1.0 + * @version $Revision: 3189 $ + * @author Konsta Vesterinen + * @author Jonathan H. Wage + */ +class Inflector +{ + /** + * Convert word in to the format for a Doctrine table name. Converts 'ModelName' to 'model_name' + * + * @param string $word Word to tableize + * @return string $word Tableized word + */ + public static function tableize($word) + { + return strtolower(preg_replace('~(?<=\\w)([A-Z])~', '_$1', $word)); + } + + /** + * Convert a word in to the format for a Doctrine class name. Converts 'table_name' to 'TableName' + * + * @param string $word Word to classify + * @return string $word Classified word + */ + public static function classify($word) + { + return str_replace(" ", "", ucwords(strtr($word, "_-", " "))); + } + + /** + * Camelize a word. This uses the classify() method and turns the first character to lowercase + * + * @param string $word + * @return string $word + */ + public static function camelize($word) + { + return lcfirst(self::classify($word)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Version.php b/vendor/doctrine/common/lib/Doctrine/Common/Version.php new file mode 100644 index 00000000..7a87311f --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Version.php @@ -0,0 +1,55 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Class to store and retrieve the version of Doctrine + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class Version +{ + /** + * Current Doctrine Version + */ + const VERSION = '2.2.3'; + + /** + * Compares a Doctrine version with the current one. + * + * @param string $version Doctrine version to compare. + * @return int Returns -1 if older, 0 if it is the same, 1 if version + * passed as argument is newer. + */ + public static function compare($version) + { + $currentVersion = str_replace(' ', '', strtolower(self::VERSION)); + $version = str_replace(' ', '', $version); + + return version_compare($version, $currentVersion); + } +} diff --git a/vendor/doctrine/common/phpunit.xml.dist b/vendor/doctrine/common/phpunit.xml.dist new file mode 100644 index 00000000..b9d3b340 --- /dev/null +++ b/vendor/doctrine/common/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + ./tests/Doctrine/ + + + + + + ./lib/Doctrine/ + + + + + + performance + + + diff --git a/vendor/doctrine/common/tests/.gitignore b/vendor/doctrine/common/tests/.gitignore new file mode 100644 index 00000000..72104052 --- /dev/null +++ b/vendor/doctrine/common/tests/.gitignore @@ -0,0 +1,3 @@ +Doctrine/Tests/Proxies/ +Doctrine/Tests/ORM/Proxy/generated/ +Doctrine/Tests/ORM/Tools/Export/export diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php new file mode 100644 index 00000000..0a329a3c --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php @@ -0,0 +1,538 @@ +getReader(); + + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\DummyClass'); + $this->assertEquals(1, count($reader->getClassAnnotations($class))); + $this->assertInstanceOf($annotName = 'Doctrine\Tests\Common\Annotations\DummyAnnotation', $annot = $reader->getClassAnnotation($class, $annotName)); + $this->assertEquals("hello", $annot->dummyValue); + + $field1Prop = $class->getProperty('field1'); + $propAnnots = $reader->getPropertyAnnotations($field1Prop); + $this->assertEquals(1, count($propAnnots)); + $this->assertInstanceOf($annotName, $annot = $reader->getPropertyAnnotation($field1Prop, $annotName)); + $this->assertEquals("fieldHello", $annot->dummyValue); + + $getField1Method = $class->getMethod('getField1'); + $methodAnnots = $reader->getMethodAnnotations($getField1Method); + $this->assertEquals(1, count($methodAnnots)); + $this->assertInstanceOf($annotName, $annot = $reader->getMethodAnnotation($getField1Method, $annotName)); + $this->assertEquals(array(1, 2, "three"), $annot->value); + + $field2Prop = $class->getProperty('field2'); + $propAnnots = $reader->getPropertyAnnotations($field2Prop); + $this->assertEquals(1, count($propAnnots)); + $this->assertInstanceOf($annotName = 'Doctrine\Tests\Common\Annotations\DummyJoinTable', $joinTableAnnot = $reader->getPropertyAnnotation($field2Prop, $annotName)); + $this->assertEquals(1, count($joinTableAnnot->joinColumns)); + $this->assertEquals(1, count($joinTableAnnot->inverseJoinColumns)); + $this->assertTrue($joinTableAnnot->joinColumns[0] instanceof DummyJoinColumn); + $this->assertTrue($joinTableAnnot->inverseJoinColumns[0] instanceof DummyJoinColumn); + $this->assertEquals('col1', $joinTableAnnot->joinColumns[0]->name); + $this->assertEquals('col2', $joinTableAnnot->joinColumns[0]->referencedColumnName); + $this->assertEquals('col3', $joinTableAnnot->inverseJoinColumns[0]->name); + $this->assertEquals('col4', $joinTableAnnot->inverseJoinColumns[0]->referencedColumnName); + + $dummyAnnot = $reader->getMethodAnnotation($class->getMethod('getField1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('', $dummyAnnot->dummyValue); + $this->assertEquals(array(1, 2, 'three'), $dummyAnnot->value); + + $dummyAnnot = $reader->getPropertyAnnotation($class->getProperty('field1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('fieldHello', $dummyAnnot->dummyValue); + + $classAnnot = $reader->getClassAnnotation($class, 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('hello', $classAnnot->dummyValue); + } + + public function testAnnotationsWithValidTargets() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithValidAnnotationTarget'); + + $this->assertEquals(1,count($reader->getClassAnnotations($class))); + $this->assertEquals(1,count($reader->getPropertyAnnotations($class->getProperty('foo')))); + $this->assertEquals(1,count($reader->getMethodAnnotations($class->getMethod('someFunction')))); + $this->assertEquals(1,count($reader->getPropertyAnnotations($class->getProperty('nested')))); + } + + public function testAnnotationsWithVarType() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $this->assertEquals(1,count($fooAnnot = $reader->getPropertyAnnotations($class->getProperty('foo')))); + $this->assertEquals(1,count($barAnnot = $reader->getMethodAnnotations($class->getMethod('bar')))); + + $this->assertInternalType('string', $fooAnnot[0]->string); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', $barAnnot[0]->annotation); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetPropertyMethod is not allowed to be declared on class Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass. You may only use this annotation on these code elements: METHOD, PROPERTY + */ + public function testClassWithInvalidAnnotationTargetAtClassDocBlock() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetClass is not allowed to be declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty::$foo. You may only use this annotation on these code elements: CLASS + */ + public function testClassWithInvalidAnnotationTargetAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty', 'foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetAnnotation is not allowed to be declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty::$bar. You may only use this annotation on these code elements: ANNOTATION + */ + public function testClassWithInvalidNestedAnnotationTargetAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty', 'bar')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetClass is not allowed to be declared on method Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod::functionName(). You may only use this annotation on these code elements: CLASS + */ + public function testClassWithInvalidAnnotationTargetAtMethodDocBlock() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod', 'functionName')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtClassDocBlock() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError','foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtMethodDocBlock() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError','bar')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Type Error] Attribute "string" of @AnnotationWithVarType declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType::$invalidProperty expects a(n) string, but got integer. + */ + public function testClassWithPropertyInvalidVarTypeError() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $reader->getPropertyAnnotations($class->getProperty('invalidProperty')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Type Error] Attribute "annotation" of @AnnotationWithVarType declared on method Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType::invalidMethod() expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll, but got an instance of Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. + */ + public function testClassWithMethodInvalidVarTypeError() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $reader->getMethodAnnotations($class->getMethod('invalidMethod')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in class Doctrine\Tests\Common\Annotations\DummyClassSyntaxError. + */ + public function testClassSyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\DummyClassSyntaxError')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in method Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError::foo(). + */ + public function testMethodSyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError', 'foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in property Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError::$foo. + */ + public function testPropertySyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError', 'foo')); + } + + /** + * @group regression + */ + public function testMultipleAnnotationsOnSameLine() + { + $reader = $this->getReader(); + $annots = $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClass2', 'id')); + $this->assertEquals(3, count($annots)); + } + + public function testNonAnnotationProblem() + { + $reader = $this->getReader(); + + $this->assertNotNull($annot = $reader->getPropertyAnnotation(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClassNonAnnotationProblem', 'foo'), $name = 'Doctrine\Tests\Common\Annotations\DummyAnnotation')); + $this->assertInstanceOf($name, $annot); + } + + public function testImportWithConcreteAnnotation() + { + $reader = $this->getReader(); + $property = new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestImportWithConcreteAnnotation', 'field'); + $annotations = $reader->getPropertyAnnotations($property); + $this->assertEquals(1, count($annotations)); + $this->assertNotNull($reader->getPropertyAnnotation($property, 'Doctrine\Tests\Common\Annotations\DummyAnnotation')); + } + + public function testImportWithInheritance() + { + $reader = $this->getReader(); + + $class = new TestParentClass(); + $ref = new \ReflectionClass($class); + + $childAnnotations = $reader->getPropertyAnnotations($ref->getProperty('child')); + $this->assertEquals(1, count($childAnnotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Foo\Name', reset($childAnnotations)); + + $parentAnnotations = $reader->getPropertyAnnotations($ref->getProperty('parent')); + $this->assertEquals(1, count($parentAnnotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Bar\Name', reset($parentAnnotations)); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation "@NameFoo" in property Doctrine\Tests\Common\Annotations\TestAnnotationNotImportedClass::$field was never imported. + */ + public function testImportDetectsNotImportedAnnotation() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestAnnotationNotImportedClass', 'field')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation "@Foo\Bar\Name" in property Doctrine\Tests\Common\Annotations\TestNonExistentAnnotationClass::$field was never imported. + */ + public function testImportDetectsNonExistentAnnotation() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestNonExistentAnnotationClass', 'field')); + } + + public function testTopLevelAnnotation() + { + $reader = $this->getReader(); + $annotations = $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestTopLevelAnnotationClass', 'field')); + + $this->assertEquals(1, count($annotations)); + $this->assertInstanceOf('\TopLevelAnnotation', reset($annotations)); + } + + public function testIgnoresAnnotationsNotPrefixedWithWhitespace() + { + $reader = $this->getReader(); + + $annotation = $reader->getClassAnnotation(new \ReflectionClass(new TestIgnoresNonAnnotationsClass()), 'Doctrine\Tests\Common\Annotations\Name'); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Name', $annotation); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The class "Doctrine\Tests\Common\Annotations\Fixtures\NoAnnotation" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "Doctrine\Tests\Common\Annotations\Fixtures\NoAnnotation". If it is indeed no annotation, then you need to add @IgnoreAnnotation("NoAnnotation") to the _class_ doc comment of class Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageClass. + */ + public function testErrorWhenInvalidAnnotationIsUsed() + { + $reader = $this->getReader(); + $ref = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageClass'); + $reader->getClassAnnotations($ref); + } + + public function testInvalidAnnotationUsageButIgnoredClass() + { + $reader = $this->getReader(); + $ref = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageButIgnoredClass'); + $annots = $reader->getClassAnnotations($ref); + + $this->assertEquals(2, count($annots)); + } + + /** + * @group DDC-1660 + * @group regression + */ + public function testInvalidAnnotationButIgnored() + { + $reader = $this->getReader(); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassDDC1660'); + + $this->assertTrue(class_exists('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Version')); + $this->assertCount(0, $reader->getClassAnnotations($class)); + $this->assertCount(0, $reader->getMethodAnnotations($class->getMethod('bar'))); + $this->assertCount(0, $reader->getPropertyAnnotations($class->getProperty('foo'))); + } + + abstract protected function getReader(); +} + +/** + * @parseAnnotation("var") + * @author Johannes M. Schmitt + * + */ +class TestParseAnnotationClass +{ + /** + * @var + */ + private $field; +} + +/** + * @Name + * @author Johannes M. Schmitt + */ +class TestIgnoresNonAnnotationsClass +{ +} + +class TestTopLevelAnnotationClass +{ + /** + * @\TopLevelAnnotation + */ + private $field; +} + +class TestNonExistentAnnotationClass +{ + /** + * @Foo\Bar\Name + */ + private $field; +} + +class TestAnnotationNotImportedClass +{ + /** + * @NameFoo + */ + private $field; +} + +class TestChildClass +{ + /** + * @\Doctrine\Tests\Common\Annotations\Foo\Name(name = "foo") + */ + protected $child; +} + +class TestParentClass extends TestChildClass +{ + /** + * @\Doctrine\Tests\Common\Annotations\Bar\Name(name = "bar") + */ + private $parent; +} + +class TestImportWithConcreteAnnotation +{ + /** + * @DummyAnnotation(dummyValue = "bar") + */ + private $field; +} + +/** + * A description of this class. + * + * Let's see if the parser recognizes that this @ is not really referring to an + * annotation. Also make sure that @var \ is not concated to "@var\is". + * + * @author robo + * @since 2.0 + * @DummyAnnotation(dummyValue="hello") + */ +class DummyClass { + /** + * A nice property. + * + * @var mixed + * @DummyAnnotation(dummyValue="fieldHello") + */ + private $field1; + + /** + * @DummyJoinTable(name="join_table", + * joinColumns={@DummyJoinColumn(name="col1", referencedColumnName="col2")}, + * inverseJoinColumns={ + * @DummyJoinColumn(name="col3", referencedColumnName="col4") + * }) + */ + private $field2; + + /** + * Gets the value of field1. + * + * @return mixed + * @DummyAnnotation({1,2,"three"}) + */ + public function getField1() { + } +} + +/** + * @ignoreAnnotation("var") + */ +class DummyClass2 { + /** + * @DummyId @DummyColumn(type="integer") @DummyGeneratedValue + * @var integer + */ + private $id; +} + +/** @Annotation */ +class DummyId extends \Doctrine\Common\Annotations\Annotation {} +/** @Annotation */ +class DummyColumn extends \Doctrine\Common\Annotations\Annotation { + public $type; +} +/** @Annotation */ +class DummyGeneratedValue extends \Doctrine\Common\Annotations\Annotation {} +/** @Annotation */ +class DummyAnnotation extends \Doctrine\Common\Annotations\Annotation { + public $dummyValue; +} +/** @Annotation */ +class DummyJoinColumn extends \Doctrine\Common\Annotations\Annotation { + public $name; + public $referencedColumnName; +} +/** @Annotation */ +class DummyJoinTable extends \Doctrine\Common\Annotations\Annotation { + public $name; + public $joinColumns; + public $inverseJoinColumns; +} + +/** + * @DummyAnnotation(@) + */ +class DummyClassSyntaxError +{ + +} + +class DummyClassMethodSyntaxError +{ + /** + * @DummyAnnotation(@) + */ + public function foo() + { + + } +} + +class DummyClassPropertySyntaxError +{ + /** + * @DummyAnnotation(@) + */ + public $foo; +} + +/** + * @ignoreAnnotation({"since", "var"}) + */ +class DummyClassNonAnnotationProblem +{ + /** + * @DummyAnnotation + * + * @var \Test + * @since 0.1 + */ + public $foo; +} + + +/** +* @DummyAnnotation Foo bar +*/ +class DummyClassWithEmail +{ + +} + +namespace Doctrine\Tests\Common\Annotations\Foo; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation +{ + public $name; +} + +namespace Doctrine\Tests\Common\Annotations\Bar; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation +{ + public $name; +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php new file mode 100644 index 00000000..d2cc6678 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php @@ -0,0 +1,13 @@ +getMock('Doctrine\Common\Cache\Cache'); + $cache + ->expects($this->at(0)) + ->method('fetch') + ->with($this->equalTo($cacheKey)) + ->will($this->returnValue(array())) + ; + $cache + ->expects($this->at(1)) + ->method('fetch') + ->with($this->equalTo('[C]'.$cacheKey)) + ->will($this->returnValue(time() - 10)) + ; + $cache + ->expects($this->at(2)) + ->method('save') + ->with($this->equalTo($cacheKey)) + ; + $cache + ->expects($this->at(3)) + ->method('save') + ->with($this->equalTo('[C]'.$cacheKey)) + ; + + $reader = new CachedReader(new AnnotationReader(), $cache, true); + $route = new Route(); + $route->pattern = '/someprefix'; + $this->assertEquals(array($route), $reader->getClassAnnotations(new \ReflectionClass($name))); + } + + protected function getReader() + { + $this->cache = new ArrayCache(); + return new CachedReader(new AnnotationReader(), $this->cache); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php new file mode 100644 index 00000000..cb080f08 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php @@ -0,0 +1,27 @@ +setInput("@Name"); + $this->assertNull($lexer->token); + $this->assertNull($lexer->lookahead); + + $this->assertTrue($lexer->moveNext()); + $this->assertNull($lexer->token); + $this->assertEquals('@', $lexer->lookahead['value']); + + $this->assertTrue($lexer->moveNext()); + $this->assertEquals('@', $lexer->token['value']); + $this->assertEquals('Name', $lexer->lookahead['value']); + + $this->assertFalse($lexer->moveNext()); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php new file mode 100644 index 00000000..56cae7fd --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php @@ -0,0 +1,1118 @@ +createTestParser(); + + // Nested arrays with nested annotations + $result = $parser->parse('@Name(foo={1,2, {"key"=@Name}})'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertNull($annot->value); + $this->assertEquals(3, count($annot->foo)); + $this->assertEquals(1, $annot->foo[0]); + $this->assertEquals(2, $annot->foo[1]); + $this->assertTrue(is_array($annot->foo[2])); + + $nestedArray = $annot->foo[2]; + $this->assertTrue(isset($nestedArray['key'])); + $this->assertTrue($nestedArray['key'] instanceof Name); + } + + public function testBasicAnnotations() + { + $parser = $this->createTestParser(); + + // Marker annotation + $result = $parser->parse("@Name"); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertNull($annot->value); + $this->assertNull($annot->foo); + + // Associative arrays + $result = $parser->parse('@Name(foo={"key1" = "value1"})'); + $annot = $result[0]; + $this->assertNull($annot->value); + $this->assertTrue(is_array($annot->foo)); + $this->assertTrue(isset($annot->foo['key1'])); + + // Numerical arrays + $result = $parser->parse('@Name({2="foo", 4="bar"})'); + $annot = $result[0]; + $this->assertTrue(is_array($annot->value)); + $this->assertEquals('foo', $annot->value[2]); + $this->assertEquals('bar', $annot->value[4]); + $this->assertFalse(isset($annot->value[0])); + $this->assertFalse(isset($annot->value[1])); + $this->assertFalse(isset($annot->value[3])); + + // Multiple values + $result = $parser->parse('@Name(@Name, @Name)'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertTrue(is_array($annot->value)); + $this->assertTrue($annot->value[0] instanceof Name); + $this->assertTrue($annot->value[1] instanceof Name); + + // Multiple types as values + $result = $parser->parse('@Name(foo="Bar", @Name, {"key1"="value1", "key2"="value2"})'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertTrue(is_array($annot->value)); + $this->assertTrue($annot->value[0] instanceof Name); + $this->assertTrue(is_array($annot->value[1])); + $this->assertEquals('value1', $annot->value[1]['key1']); + $this->assertEquals('value2', $annot->value[1]['key2']); + + // Complete docblock + $docblock = <<parse($docblock); + $this->assertEquals(1, count($result)); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + $this->assertNull($annot->value); + } + + public function testNamespacedAnnotations() + { + $parser = new DocParser; + $parser->setIgnoreNotImportedAnnotations(true); + + $docblock = << + * @Doctrine\Tests\Common\Annotations\Name(foo="bar") + * @ignore + */ +DOCBLOCK; + + $result = $parser->parse($docblock); + $this->assertEquals(1, count($result)); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + } + + /** + * @group debug + */ + public function testTypicalMethodDocBlock() + { + $parser = $this->createTestParser(); + + $docblock = <<parse($docblock); + $this->assertEquals(2, count($result)); + $this->assertTrue(isset($result[0])); + $this->assertTrue(isset($result[1])); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + $marker = $result[1]; + $this->assertTrue($marker instanceof Marker); + } + + + public function testAnnotationWithoutConstructor() + { + $parser = $this->createTestParser(); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertNotNull($annot); + $this->assertTrue($annot instanceof SomeAnnotationClassNameWithoutConstructor); + + $this->assertNull($annot->name); + $this->assertNotNull($annot->data); + $this->assertEquals($annot->data, "Some data"); + + + + +$docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertNotNull($annot); + $this->assertTrue($annot instanceof SomeAnnotationClassNameWithoutConstructor); + + $this->assertEquals($annot->name, "Some Name"); + $this->assertEquals($annot->data, "Some data"); + + + + +$docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->data, "Some data"); + $this->assertNull($annot->name); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertNull($annot->data); + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->data, "Some data"); + $this->assertNull($annot->name); + + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertEquals($annot->data, "Some data"); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertEquals($annot->data, "Some data"); + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $this->assertTrue($result[0] instanceof SomeAnnotationClassNameWithoutConstructorAndProperties); + } + + public function testAnnotationTarget() + { + + $parser = new DocParser; + $parser->setImports(array( + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations\Fixtures', + )); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithValidAnnotationTarget'); + + + $context = 'class ' . $class->getName(); + $docComment = $class->getDocComment(); + + $parser->setTarget(Target::TARGET_CLASS); + $this->assertNotNull($parser->parse($docComment,$context)); + + + $property = $class->getProperty('foo'); + $docComment = $property->getDocComment(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + + $parser->setTarget(Target::TARGET_PROPERTY); + $this->assertNotNull($parser->parse($docComment,$context)); + + + + $method = $class->getMethod('someFunction'); + $docComment = $property->getDocComment(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + + $parser->setTarget(Target::TARGET_METHOD); + $this->assertNotNull($parser->parse($docComment,$context)); + + + try { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass'); + $context = 'class ' . $class->getName(); + $docComment = $class->getDocComment(); + + $parser->setTarget(Target::TARGET_CLASS); + $parser->parse($class->getDocComment(),$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + + try { + + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod'); + $method = $class->getMethod('functionName'); + $docComment = $method->getDocComment(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + + $parser->setTarget(Target::TARGET_METHOD); + $parser->parse($docComment,$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + + try { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty'); + $property = $class->getProperty('foo'); + $docComment = $property->getDocComment(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + + $parser->setTarget(Target::TARGET_PROPERTY); + $parser->parse($docComment,$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + } + + public function getAnnotationVarTypeProviderValid() + { + //({attribute name}, {attribute value}) + return array( + // mixed type + array('mixed', '"String Value"'), + array('mixed', 'true'), + array('mixed', 'false'), + array('mixed', '1'), + array('mixed', '1.2'), + array('mixed', '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll'), + + // boolean type + array('boolean', 'true'), + array('boolean', 'false'), + + // alias for internal type boolean + array('bool', 'true'), + array('bool', 'false'), + + // integer type + array('integer', '0'), + array('integer', '1'), + array('integer', '123456789'), + array('integer', '9223372036854775807'), + + // alias for internal type double + array('float', '0.1'), + array('float', '1.2'), + array('float', '123.456'), + + // string type + array('string', '"String Value"'), + array('string', '"true"'), + array('string', '"123"'), + + // array type + array('array', '{@AnnotationExtendsAnnotationTargetAll}'), + array('array', '{@AnnotationExtendsAnnotationTargetAll,@AnnotationExtendsAnnotationTargetAll}'), + + array('arrayOfIntegers', '1'), + array('arrayOfIntegers', '{1}'), + array('arrayOfIntegers', '{1,2,3,4}'), + array('arrayOfAnnotations', '@AnnotationExtendsAnnotationTargetAll'), + array('arrayOfAnnotations', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll}'), + array('arrayOfAnnotations', '{@AnnotationExtendsAnnotationTargetAll, @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll}'), + + // annotation instance + array('annotation', '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll'), + array('annotation', '@AnnotationExtendsAnnotationTargetAll'), + ); + } + + public function getAnnotationVarTypeProviderInvalid() + { + //({attribute name}, {type declared type}, {attribute value} , {given type or class}) + return array( + // boolean type + array('boolean','boolean','1','integer'), + array('boolean','boolean','1.2','double'), + array('boolean','boolean','"str"','string'), + array('boolean','boolean','{1,2,3}','array'), + array('boolean','boolean','@Name', 'an instance of Doctrine\Tests\Common\Annotations\Name'), + + // alias for internal type boolean + array('bool','bool', '1','integer'), + array('bool','bool', '1.2','double'), + array('bool','bool', '"str"','string'), + array('bool','bool', '{"str"}','array'), + + // integer type + array('integer','integer', 'true','boolean'), + array('integer','integer', 'false','boolean'), + array('integer','integer', '1.2','double'), + array('integer','integer', '"str"','string'), + array('integer','integer', '{"str"}','array'), + array('integer','integer', '{1,2,3,4}','array'), + + // alias for internal type double + array('float','float', 'true','boolean'), + array('float','float', 'false','boolean'), + array('float','float', '123','integer'), + array('float','float', '"str"','string'), + array('float','float', '{"str"}','array'), + array('float','float', '{12.34}','array'), + array('float','float', '{1,2,3}','array'), + + // string type + array('string','string', 'true','boolean'), + array('string','string', 'false','boolean'), + array('string','string', '12','integer'), + array('string','string', '1.2','double'), + array('string','string', '{"str"}','array'), + array('string','string', '{1,2,3,4}','array'), + + // annotation instance + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'true','boolean'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'false','boolean'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '12','integer'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '1.2','double'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{"str"}','array'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{1,2,3,4}','array'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '@Name','an instance of Doctrine\Tests\Common\Annotations\Name'), + ); + } + + public function getAnnotationVarTypeArrayProviderInvalid() + { + //({attribute name}, {type declared type}, {attribute value} , {given type or class}) + return array( + array('arrayOfIntegers','integer', 'true','boolean'), + array('arrayOfIntegers','integer', 'false','boolean'), + array('arrayOfIntegers','integer', '{true,true}','boolean'), + array('arrayOfIntegers','integer', '{1,true}','boolean'), + array('arrayOfIntegers','integer', '{1,2,1.2}','double'), + array('arrayOfIntegers','integer', '{1,2,"str"}','string'), + + + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'true','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'false','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,true}','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,true}','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,1.2}','double'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,@AnnotationExtendsAnnotationTargetAll,"str"}','string'), + ); + } + + /** + * @dataProvider getAnnotationVarTypeProviderValid + */ + public function testAnnotationWithVarType($attribute, $value) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::$invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + $result = $parser->parse($docblock, $context); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType', $result[0]); + $this->assertNotNull($result[0]->$attribute); + } + + /** + * @dataProvider getAnnotationVarTypeProviderInvalid + */ + public function testAnnotationWithVarTypeError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType declared on property SomeClassName::invalidProperty. expects a(n) $type, but got $given.", $exc->getMessage()); + } + } + + + /** + * @dataProvider getAnnotationVarTypeArrayProviderInvalid + */ + public function testAnnotationWithVarTypeArrayError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType declared on property SomeClassName::invalidProperty. expects either a(n) $type, or an array of {$type}s, but got $given.", $exc->getMessage()); + } + } + + /** + * @dataProvider getAnnotationVarTypeProviderValid + */ + public function testAnnotationWithAttributes($attribute, $value) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::$invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + $result = $parser->parse($docblock, $context); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes', $result[0]); + $getter = "get".ucfirst($attribute); + $this->assertNotNull($result[0]->$getter()); + } + + /** + * @dataProvider getAnnotationVarTypeProviderInvalid + */ + public function testAnnotationWithAttributesError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes declared on property SomeClassName::invalidProperty. expects a(n) $type, but got $given.", $exc->getMessage()); + } + } + + + /** + * @dataProvider getAnnotationVarTypeArrayProviderInvalid + */ + public function testAnnotationWithAttributesWithVarTypeArrayError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes declared on property SomeClassName::invalidProperty. expects either a(n) $type, or an array of {$type}s, but got $given.", $exc->getMessage()); + } + } + + public function testAnnotationWithRequiredAttributes() + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $parser->setTarget(Target::TARGET_PROPERTY); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes("Some Value", annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + $result = $parser->parse($docblock); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes', $result[0]); + $this->assertEquals("Some Value",$result[0]->getValue()); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation', $result[0]->getAnnot()); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes("Some Value")'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "annot" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes declared on property SomeClassName::invalidProperty. expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. This value should not be null.', $exc->getMessage()); + } + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes(annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "value" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes declared on property SomeClassName::invalidProperty. expects a(n) string. This value should not be null.', $exc->getMessage()); + } + + } + + public function testAnnotationWithRequiredAttributesWithoutContructor() + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $parser->setTarget(Target::TARGET_PROPERTY); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor("Some Value", annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + $result = $parser->parse($docblock); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor', $result[0]); + $this->assertEquals("Some Value", $result[0]->value); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation', $result[0]->annot); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor("Some Value")'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "annot" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor declared on property SomeClassName::invalidProperty. expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. This value should not be null.', $exc->getMessage()); + } + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor(annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "value" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor declared on property SomeClassName::invalidProperty. expects a(n) string. This value should not be null.', $exc->getMessage()); + } + + } + + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation @SomeAnnotationClassNameWithoutConstructorAndProperties declared on does not accept any values, but got {"value":"Foo"}. + */ + public function testWithoutConstructorWhenIsNotDefaultValue() + { + $parser = $this->createTestParser(); + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation @SomeAnnotationClassNameWithoutConstructorAndProperties declared on does not accept any values, but got {"value":"Foo"}. + */ + public function testWithoutConstructorWhenHasNoProperties() + { + $parser = $this->createTestParser(); + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testAnnotationTargetSyntaxError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Invalid Target "Foo". Available targets: [ALL, CLASS, METHOD, PROPERTY, ANNOTATION] + */ + public function testAnnotationWithInvalidTargetDeclarationError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage @Target expects either a string value, or an array of strings, "NULL" given. + */ + public function testAnnotationWithTargetEmptyError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @group DDC-575 + */ + public function testRegressionDDC575() + { + $parser = $this->createTestParser(); + + $docblock = <<parse($docblock); + + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Name", $result[0]); + + $docblock = <<parse($docblock); + + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Name", $result[0]); + } + + /** + * @group DDC-77 + */ + public function testAnnotationWithoutClassIsIgnoredWithoutWarning() + { + $parser = new DocParser(); + $parser->setIgnoreNotImportedAnnotations(true); + $result = $parser->parse("@param"); + + $this->assertEquals(0, count($result)); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected PlainValue, got ''' at position 10. + */ + public function testAnnotationDontAcceptSingleQuotes() + { + $parser = $this->createTestParser(); + $parser->parse("@Name(foo='bar')"); + } + + /** + * @group DCOM-41 + */ + public function testAnnotationDoesntThrowExceptionWhenAtSignIsNotFollowedByIdentifier() + { + $parser = new DocParser(); + $result = $parser->parse("'@'"); + + $this->assertEquals(0, count($result)); + } + + /** + * @group DCOM-41 + * @expectedException Doctrine\Common\Annotations\AnnotationException + */ + public function testAnnotationThrowsExceptionWhenAtSignIsNotFollowedByIdentifierInNestedAnnotation() + { + $parser = new DocParser(); + $result = $parser->parse("@Doctrine\Tests\Common\Annotations\Name(@')"); + } + + /** + * @group DCOM-56 + */ + public function testAutoloadAnnotation() + { + $this->assertFalse(class_exists('Doctrine\Tests\Common\Annotations\Fixture\Annotation\Autoload', false), 'Pre-condition: Doctrine\Tests\Common\Annotations\Fixture\Annotation\Autoload not allowed to be loaded.'); + + $parser = new DocParser(); + + AnnotationRegistry::registerAutoloadNamespace('Doctrine\Tests\Common\Annotations\Fixtures\Annotation', __DIR__ . '/../../../../'); + + $parser->setImports(array( + 'autoload' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Autoload', + )); + $annotations = $parser->parse('@Autoload'); + + $this->assertEquals(1, count($annotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Autoload', $annotations[0]); + } + + public function createTestParser() + { + $parser = new DocParser(); + $parser->setIgnoreNotImportedAnnotations(true); + $parser->setImports(array( + 'name' => 'Doctrine\Tests\Common\Annotations\Name', + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations', + )); + + return $parser; + } + + /** + * @group DDC-78 + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected PlainValue, got ''' at position 10 in class \Doctrine\Tests\Common\Annotations\Name + */ + public function testSyntaxErrorWithContextDescription() + { + $parser = $this->createTestParser(); + $parser->parse("@Name(foo='bar')", "class \Doctrine\Tests\Common\Annotations\Name"); + } + + /** + * @group DDC-183 + */ + public function testSyntaxErrorWithUnknownCharacters() + { + $docblock = <<setInput(trim($docblock, '/ *')); + //var_dump($lexer); + + try { + $parser = $this->createTestParser(); + $result = $parser->parse($docblock); + } catch (Exception $e) { + $this->fail($e->getMessage()); + } + } + + /** + * @group DCOM-14 + */ + public function testIgnorePHPDocThrowTag() + { + $docblock = <<createTestParser(); + $result = $parser->parse($docblock); + } catch (Exception $e) { + $this->fail($e->getMessage()); + } + } + + /** + * @group DCOM-38 + */ + public function testCastInt() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=1234)"); + $annot = $result[0]; + $this->assertInternalType('int', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastNegativeInt() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=-1234)"); + $annot = $result[0]; + $this->assertInternalType('int', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastFloat() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastNegativeFloat() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=-1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->foo); + + $result = $parser->parse("@Marker(-1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->value); + } + + public function testReservedKeywordsInAnnotations() + { + $parser = $this->createTestParser(); + + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\True'); + $this->assertTrue($result[0] instanceof True); + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\False'); + $this->assertTrue($result[0] instanceof False); + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\Null'); + $this->assertTrue($result[0] instanceof Null); + + $result = $parser->parse('@True'); + $this->assertTrue($result[0] instanceof True); + $result = $parser->parse('@False'); + $this->assertTrue($result[0] instanceof False); + $result = $parser->parse('@Null'); + $this->assertTrue($result[0] instanceof Null); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Creation Error] The annotation @SomeAnnotationClassNameWithoutConstructor declared on some class does not have a property named "invalidaProperty". Available properties: data, name + */ + public function testSetValuesExeption() + { + $docblock = <<createTestParser()->parse($docblock, 'some class'); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Syntax Error] Expected Doctrine\Common\Annotations\DocLexer::T_IDENTIFIER or Doctrine\Common\Annotations\DocLexer::T_TRUE or Doctrine\Common\Annotations\DocLexer::T_FALSE or Doctrine\Common\Annotations\DocLexer::T_NULL, got '3.42' at position 5. + */ + public function testInvalidIdentifierInAnnotation() + { + $parser = $this->createTestParser(); + $parser->parse('@Foo\3.42'); + } + + public function testTrailingCommaIsAllowed() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Name({ + "Foo", + "Bar", + })'); + $this->assertEquals(1, count($annots)); + $this->assertEquals(array('Foo', 'Bar'), $annots[0]->value); + } + + public function testDefaultAnnotationValueIsNotOverwritten() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Doctrine\Tests\Common\Annotations\Fixtures\Annotation\AnnotWithDefaultValue'); + $this->assertEquals(1, count($annots)); + $this->assertEquals('bar', $annots[0]->foo); + } + + public function testArrayWithColon() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Name({"foo": "bar"})'); + $this->assertEquals(1, count($annots)); + $this->assertEquals(array('foo' => 'bar'), $annots[0]->value); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Syntax Error] Expected PlainValue, got 'foo:' at position 6. + */ + public function testColonNotAllowedOnTopLevel() + { + $parser = $this->createTestParser(); + $parser->parse('@Name(foo: "bar")'); + } +} + +/** @Annotation */ +class SomeAnnotationClassNameWithoutConstructor +{ + public $data; + public $name; +} + +/** @Annotation */ +class SomeAnnotationWithConstructorWithoutParams +{ + function __construct() + { + $this->data = "Some data"; + } + public $data; + public $name; +} + +/** @Annotation */ +class SomeAnnotationClassNameWithoutConstructorAndProperties{} + +/** + * @Annotation + * @Target("Foo") + */ +class AnnotationWithInvalidTargetDeclaration{} + +/** + * @Annotation + * @Target + */ +class AnnotationWithTargetEmpty{} + +/** @Annotation */ +class AnnotationExtendsAnnotationTargetAll extends \Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll +{ +} + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation { + public $foo; +} + +/** @Annotation */ +class Marker { + public $value; +} + +/** @Annotation */ +class True {} + +/** @Annotation */ +class False {} + +/** @Annotation */ +class Null {} + +namespace Doctrine\Tests\Common\Annotations\FooBar; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation { +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php new file mode 100644 index 00000000..c84344d8 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php @@ -0,0 +1,40 @@ +cacheDir = sys_get_temp_dir() . "/annotations_". uniqid(); + @mkdir($this->cacheDir); + return new FileCacheReader(new AnnotationReader(), $this->cacheDir); + } + + public function tearDown() + { + foreach (glob($this->cacheDir.'/*.php') AS $file) { + unlink($file); + } + rmdir($this->cacheDir); + } + + /** + * @group DCOM-81 + */ + public function testAttemptToCreateAnnotationCacheDir() + { + $this->cacheDir = sys_get_temp_dir() . "/not_existed_dir_". uniqid(); + + $this->assertFalse(is_dir($this->cacheDir)); + + $cache = new FileCacheReader(new AnnotationReader(), $this->cacheDir); + + $this->assertTrue(is_dir($this->cacheDir)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php new file mode 100644 index 00000000..44108e19 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php @@ -0,0 +1,10 @@ +roles = $values['value']; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php new file mode 100644 index 00000000..b507e602 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php @@ -0,0 +1,14 @@ +name = isset($values['value']) ? $values['value'] : null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php new file mode 100644 index 00000000..09ef0317 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php @@ -0,0 +1,11 @@ +"), + @Attribute("annotation", type = "Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll"), + @Attribute("arrayOfAnnotations", type = "array"), + }) + */ +final class AnnotationWithAttributes +{ + + public final function __construct(array $data) + { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + private $mixed; + private $boolean; + private $bool; + private $float; + private $string; + private $integer; + private $array; + private $annotation; + private $arrayOfIntegers; + private $arrayOfAnnotations; + + /** + * @return mixed + */ + public function getMixed() + { + return $this->mixed; + } + + /** + * @return boolean + */ + public function getBoolean() + { + return $this->boolean; + } + + /** + * @return bool + */ + public function getBool() + { + return $this->bool; + } + + /** + * @return float + */ + public function getFloat() + { + return $this->float; + } + + /** + * @return string + */ + public function getString() + { + return $this->string; + } + + public function getInteger() + { + return $this->integer; + } + + /** + * @return array + */ + public function getArray() + { + return $this->array; + } + + /** + * @return Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll + */ + public function getAnnotation() + { + return $this->annotation; + } + + /** + * @return array + */ + public function getArrayOfIntegers() + { + return $this->arrayOfIntegers; + } + + /** + * @return array + */ + public function getArrayOfAnnotations() + { + return $this->arrayOfAnnotations; + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php new file mode 100644 index 00000000..6eb1bc5a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php @@ -0,0 +1,50 @@ + $value) { + $this->$key = $value; + } + } + + /** + * @var string + */ + private $value; + + /** + * + * @var Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation + */ + private $annot; + + /** + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * @return Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation + */ + public function getAnnot() + { + return $this->annot; + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php new file mode 100644 index 00000000..bf458ee7 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php @@ -0,0 +1,24 @@ + + */ + public $arrayOfIntegers; + + /** + * @var array + */ + public $arrayOfAnnotations; + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php new file mode 100644 index 00000000..4e652e13 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php @@ -0,0 +1,30 @@ + + */ +class Controller +{ + /** + * @Route("/", name="_demo") + * @Template() + */ + public function indexAction() + { + return array(); + } + + /** + * @Route("/hello/{name}", name="_demo_hello") + * @Template() + */ + public function helloAction($name) + { + return array('name' => $name); + } + + /** + * @Route("/contact", name="_demo_contact") + * @Template() + */ + public function contactAction() + { + $form = ContactForm::create($this->get('form.context'), 'contact'); + + $form->bind($this->container->get('request'), $form); + if ($form->isValid()) { + $form->send($this->get('mailer')); + + $this->get('session')->setFlash('notice', 'Message sent!'); + + return new RedirectResponse($this->generateUrl('_demo')); + } + + return array('form' => $form); + } + + /** + * Creates the ACL for the passed object identity + * + * @param ObjectIdentityInterface $oid + * @return void + */ + private function createObjectIdentity(ObjectIdentityInterface $oid) + { + $classId = $this->createOrRetrieveClassId($oid->getType()); + + $this->connection->executeQuery($this->getInsertObjectIdentitySql($oid->getIdentifier(), $classId, true)); + } + + /** + * Returns the primary key for the passed class type. + * + * If the type does not yet exist in the database, it will be created. + * + * @param string $classType + * @return integer + */ + private function createOrRetrieveClassId($classType) + { + if (false !== $id = $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn()) { + return $id; + } + + $this->connection->executeQuery($this->getInsertClassSql($classType)); + + return $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn(); + } + + /** + * Returns the primary key for the passed security identity. + * + * If the security identity does not yet exist in the database, it will be + * created. + * + * @param SecurityIdentityInterface $sid + * @return integer + */ + private function createOrRetrieveSecurityIdentityId(SecurityIdentityInterface $sid) + { + if (false !== $id = $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn()) { + return $id; + } + + $this->connection->executeQuery($this->getInsertSecurityIdentitySql($sid)); + + return $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn(); + } + + /** + * Deletes all ACEs for the given object identity primary key. + * + * @param integer $oidPK + * @return void + */ + private function deleteAccessControlEntries($oidPK) + { + $this->connection->executeQuery($this->getDeleteAccessControlEntriesSql($oidPK)); + } + + /** + * Deletes the object identity from the database. + * + * @param integer $pk + * @return void + */ + private function deleteObjectIdentity($pk) + { + $this->connection->executeQuery($this->getDeleteObjectIdentitySql($pk)); + } + + /** + * Deletes all entries from the relations table from the database. + * + * @param integer $pk + * @return void + */ + private function deleteObjectIdentityRelations($pk) + { + $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk)); + } + + /** + * This regenerates the ancestor table which is used for fast read access. + * + * @param AclInterface $acl + * @return void + */ + private function regenerateAncestorRelations(AclInterface $acl) + { + $pk = $acl->getId(); + $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk)); + $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $pk)); + + $parentAcl = $acl->getParentAcl(); + while (null !== $parentAcl) { + $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $parentAcl->getId())); + + $parentAcl = $parentAcl->getParentAcl(); + } + } + + /** + * This processes changes on an ACE related property (classFieldAces, or objectFieldAces). + * + * @param string $name + * @param array $changes + * @return void + */ + private function updateFieldAceProperty($name, array $changes) + { + $sids = new \SplObjectStorage(); + $classIds = new \SplObjectStorage(); + $currentIds = array(); + foreach ($changes[1] as $field => $new) { + for ($i=0,$c=count($new); $i<$c; $i++) { + $ace = $new[$i]; + + if (null === $ace->getId()) { + if ($sids->contains($ace->getSecurityIdentity())) { + $sid = $sids->offsetGet($ace->getSecurityIdentity()); + } else { + $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity()); + } + + $oid = $ace->getAcl()->getObjectIdentity(); + if ($classIds->contains($oid)) { + $classId = $classIds->offsetGet($oid); + } else { + $classId = $this->createOrRetrieveClassId($oid->getType()); + } + + $objectIdentityId = $name === 'classFieldAces' ? null : $ace->getAcl()->getId(); + + $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, $field, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure())); + $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, $field, $i))->fetchColumn(); + $this->loadedAces[$aceId] = $ace; + + $aceIdProperty = new \ReflectionProperty('Symfony\Component\Security\Acl\Domain\Entry', 'id'); + $aceIdProperty->setAccessible(true); + $aceIdProperty->setValue($ace, intval($aceId)); + } else { + $currentIds[$ace->getId()] = true; + } + } + } + + foreach ($changes[0] as $old) { + for ($i=0,$c=count($old); $i<$c; $i++) { + $ace = $old[$i]; + + if (!isset($currentIds[$ace->getId()])) { + $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId())); + unset($this->loadedAces[$ace->getId()]); + } + } + } + } + + /** + * This processes changes on an ACE related property (classAces, or objectAces). + * + * @param string $name + * @param array $changes + * @return void + */ + private function updateAceProperty($name, array $changes) + { + list($old, $new) = $changes; + + $sids = new \SplObjectStorage(); + $classIds = new \SplObjectStorage(); + $currentIds = array(); + for ($i=0,$c=count($new); $i<$c; $i++) { + $ace = $new[$i]; + + if (null === $ace->getId()) { + if ($sids->contains($ace->getSecurityIdentity())) { + $sid = $sids->offsetGet($ace->getSecurityIdentity()); + } else { + $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity()); + } + + $oid = $ace->getAcl()->getObjectIdentity(); + if ($classIds->contains($oid)) { + $classId = $classIds->offsetGet($oid); + } else { + $classId = $this->createOrRetrieveClassId($oid->getType()); + } + + $objectIdentityId = $name === 'classAces' ? null : $ace->getAcl()->getId(); + + $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, null, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure())); + $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, null, $i))->fetchColumn(); + $this->loadedAces[$aceId] = $ace; + + $aceIdProperty = new \ReflectionProperty($ace, 'id'); + $aceIdProperty->setAccessible(true); + $aceIdProperty->setValue($ace, intval($aceId)); + } else { + $currentIds[$ace->getId()] = true; + } + } + + for ($i=0,$c=count($old); $i<$c; $i++) { + $ace = $old[$i]; + + if (!isset($currentIds[$ace->getId()])) { + $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId())); + unset($this->loadedAces[$ace->getId()]); + } + } + } + + /** + * Persists the changes which were made to ACEs to the database. + * + * @param \SplObjectStorage $aces + * @return void + */ + private function updateAces(\SplObjectStorage $aces) + { + foreach ($aces as $ace) { + $propertyChanges = $aces->offsetGet($ace); + $sets = array(); + + if (isset($propertyChanges['mask'])) { + $sets[] = sprintf('mask = %d', $propertyChanges['mask'][1]); + } + if (isset($propertyChanges['strategy'])) { + $sets[] = sprintf('granting_strategy = %s', $this->connection->quote($propertyChanges['strategy'])); + } + if (isset($propertyChanges['aceOrder'])) { + $sets[] = sprintf('ace_order = %d', $propertyChanges['aceOrder'][1]); + } + if (isset($propertyChanges['auditSuccess'])) { + $sets[] = sprintf('audit_success = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditSuccess'][1])); + } + if (isset($propertyChanges['auditFailure'])) { + $sets[] = sprintf('audit_failure = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditFailure'][1])); + } + + $this->connection->executeQuery($this->getUpdateAccessControlEntrySql($ace->getId(), $sets)); + } + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php new file mode 100644 index 00000000..bda2cc21 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php @@ -0,0 +1,15 @@ +test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test2() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test3() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test4() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test5() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test6() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test7() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test8() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test9() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test10() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test11() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test12() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test13() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test14() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test15() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test16() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test17() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test18() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test19() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test20() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test21() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test22() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test23() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test24() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test25() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test26() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test27() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test28() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test29() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test30() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test31() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test32() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test33() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test34() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test35() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test36() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test37() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test38() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test39() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php new file mode 100644 index 00000000..1dae104a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php @@ -0,0 +1,5 @@ +test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test2() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test3() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test4() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test5() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test6() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test7() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test8() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test9() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test10() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test11() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test12() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test13() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test14() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test15() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test16() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test17() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test18() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test19() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test20() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test21() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test22() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test23() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test24() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test25() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test26() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test27() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test28() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test29() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test30() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test31() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test32() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test33() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test34() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test35() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test36() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test37() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test38() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test39() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php new file mode 100644 index 00000000..58c5e6af --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php @@ -0,0 +1,13 @@ +getMethod(); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $reader->getMethodAnnotations($method); + } + $time = microtime(true) - $time; + + $this->printResults('cached reader (in-memory)', $time, $c); + } + + /** + * @group performance + */ + public function testCachedReadPerformanceWithFileCache() + { + $method = $this->getMethod(); + + // prime cache + $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir()); + $reader->getMethodAnnotations($method); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir()); + $reader->getMethodAnnotations($method); + clearstatcache(); + } + $time = microtime(true) - $time; + + $this->printResults('cached reader (file)', $time, $c); + } + + /** + * @group performance + */ + public function testReadPerformance() + { + $method = $this->getMethod(); + + $time = microtime(true); + for ($i=0,$c=150; $i<$c; $i++) { + $reader = new AnnotationReader(); + $reader->getMethodAnnotations($method); + } + $time = microtime(true) - $time; + + $this->printResults('reader', $time, $c); + } + + /** + * @group performance + */ + public function testDocParsePerformance() + { + $imports = array( + 'ignorephpdoc' => 'Annotations\Annotation\IgnorePhpDoc', + 'ignoreannotation' => 'Annotations\Annotation\IgnoreAnnotation', + 'route' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Route', + 'template' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Template', + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations\Fixtures', + ); + $ignored = array( + 'access', 'author', 'copyright', 'deprecated', 'example', 'ignore', + 'internal', 'link', 'see', 'since', 'tutorial', 'version', 'package', + 'subpackage', 'name', 'global', 'param', 'return', 'staticvar', + 'static', 'var', 'throws', 'inheritdoc', + ); + + $method = $this->getMethod(); + $methodComment = $method->getDocComment(); + $classComment = $method->getDeclaringClass()->getDocComment(); + + $time = microtime(true); + for ($i=0,$c=200; $i<$c; $i++) { + $parser = new DocParser(); + $parser->setImports($imports); + $parser->setIgnoredAnnotationNames($ignored); + $parser->setIgnoreNotImportedAnnotations(true); + + $parser->parse($methodComment); + $parser->parse($classComment); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser', $time, $c); + } + + /** + * @group performance + */ + public function testDocLexerPerformance() + { + $method = $this->getMethod(); + $methodComment = $method->getDocComment(); + $classComment = $method->getDeclaringClass()->getDocComment(); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $lexer = new DocLexer(); + $lexer->setInput($methodComment); + $lexer->setInput($classComment); + } + $time = microtime(true) - $time; + + $this->printResults('doc-lexer', $time, $c); + } + + /** + * @group performance + */ + public function testPhpParserPerformanceWithShortCut() + { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\NamespacedSingleClassLOC1000'); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $parser = new PhpParser(); + $parser->parseClass($class); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser-with-short-cut', $time, $c); + } + + /** + * @group performance + */ + public function testPhpParserPerformanceWithoutShortCut() + { + $class = new \ReflectionClass('SingleClassLOC1000'); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $parser = new PhpParser(); + $parser->parseClass($class); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser-without-short-cut', $time, $c); + } + + private function getMethod() + { + return new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\Controller', 'helloAction'); + } + + private function printResults($test, $time, $iterations) + { + if (0 == $iterations) { + throw new \InvalidArgumentException('$iterations cannot be zero.'); + } + + $title = $test." results:\n"; + $iterationsText = sprintf("Iterations: %d\n", $iterations); + $totalTime = sprintf("Total Time: %.3f s\n", $time); + $iterationTime = sprintf("Time per iteration: %.3f ms\n", $time/$iterations * 1000); + + $max = max(strlen($title), strlen($iterationTime)) - 1; + + echo "\n".str_repeat('-', $max)."\n"; + echo $title; + echo str_repeat('=', $max)."\n"; + echo $iterationsText; + echo $totalTime; + echo $iterationTime; + echo str_repeat('-', $max)."\n"; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php new file mode 100644 index 00000000..8de4aabf --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php @@ -0,0 +1,179 @@ +assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testParseClassWithMultipleImportsInUseStatement() + { + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\MultipleImportsInUseStatement'); + $parser = new PhpParser(); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testParseClassWhenNotUserDefined() + { + $parser = new PhpParser(); + $this->assertEquals(array(), $parser->parseClass(new \ReflectionClass('\stdClass'))); + } + + public function testParseClassWhenClassIsNotNamespaced() + { + $parser = new PhpParser(); + $class = new ReflectionClass('\AnnotationsTestsFixturesNonNamespacedClass'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testParseClassWhenClassIsInterface() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\TestInterface'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testClassWithFullyQualifiedUseStatements() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\ClassWithFullyQualifiedUseStatements'); + + $this->assertEquals(array( + 'secure' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testNamespaceAndClassCommentedOut() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceAndClassCommentedOut'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testEqualNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\EqualNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + ), $parser->parseClass($class)); + } + + public function testEqualNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\EqualNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testDifferentNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\DifferentNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testDifferentNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\DifferentNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testGlobalNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new \ReflectionClass('\GlobalNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + ), $parser->parseClass($class)); + } + + public function testGlobalNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass('\GlobalNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testNamespaceWithClosureDeclaration() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceWithClosureDeclaration'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testIfPointerResetsOnMultipleParsingTries() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceWithClosureDeclaration'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php new file mode 100644 index 00000000..376539ff --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php @@ -0,0 +1,97 @@ +getReader(); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassDDC1660'); + + $this->assertTrue(class_exists('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Version')); + $this->assertCount(1, $reader->getClassAnnotations($class)); + $this->assertCount(1, $reader->getMethodAnnotations($class->getMethod('bar'))); + $this->assertCount(1, $reader->getPropertyAnnotations($class->getProperty('foo'))); + } + + protected function getReader() + { + $reader = new SimpleAnnotationReader(); + $reader->addNamespace(__NAMESPACE__); + $reader->addNamespace(__NAMESPACE__ . '\Fixtures'); + $reader->addNamespace(__NAMESPACE__ . '\Fixtures\Annotation'); + + return $reader; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php new file mode 100644 index 00000000..a7b9e2f2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php @@ -0,0 +1,65 @@ +getClassAnnotations($class); + } + + public function testAnnotation() + { + $class = new \ReflectionClass(__NAMESPACE__ . '\\DCOM55Consumer'); + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $annots = $reader->getClassAnnotations($class); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf(__NAMESPACE__.'\\DCOM55Annotation', $annots[0]); + } + + public function testParseAnnotationDocblocks() + { + $class = new \ReflectionClass(__NAMESPACE__ . '\\DCOM55Annotation'); + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $annots = $reader->getClassAnnotations($class); + + $this->assertEquals(0, count($annots)); + } +} + +/** + * @Controller + */ +class Dummy +{ + +} + +/** + * @Annotation + */ +class DCOM55Annotation +{ + +} + +/** + * @DCOM55Annotation + */ +class DCOM55Consumer +{ + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php new file mode 100644 index 00000000..708bcc99 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php @@ -0,0 +1,8 @@ +getClassAnnotations(new \ReflectionClass(__NAMESPACE__."\MappedClass")); + + foreach ($result as $annot) { + $classAnnotations[get_class($annot)] = $annot; + } + + $this->assertTrue(!isset($classAnnotations['']), 'Class "xxx" is not a valid entity or mapped super class.'); + } + + public function testIssueGlobalNamespace() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->setImports(array( + "__NAMESPACE__" =>"Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping" + )); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + + public function testIssueNamespaces() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM"); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Entity", $annots[0]); + } + + public function testIssueMultipleNamespaces() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping"); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM"); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + + public function testIssueWithNamespacesOrImports() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Entity", $annots[0]); + $this->assertEquals(1, count($annots)); + } + + + public function testIssueSimpleAnnotationReader() + { + $reader = new \Doctrine\Common\Annotations\SimpleAnnotationReader(); + $reader->addNamespace('Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping'); + $annots = $reader->getClassAnnotations(new \ReflectionClass(__NAMESPACE__."\MappedClass")); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + +} + +/** + * @Entity + */ +class MappedClass +{ + +} + + +namespace Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping; +/** +* @Annotation +*/ +class Entity +{ + +} + +namespace Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM; +/** +* @Annotation +*/ +class Entity +{ + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php new file mode 100644 index 00000000..ff3ca376 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php @@ -0,0 +1,8 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of APC'); + } + } + + protected function _getCacheDriver() + { + return new ApcCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php new file mode 100644 index 00000000..71927174 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php @@ -0,0 +1,13 @@ +_getCacheDriver(); + + // Test save + $cache->save('test_key', 'testing this out'); + + // Test contains to test that save() worked + $this->assertTrue($cache->contains('test_key')); + + // Test fetch + $this->assertEquals('testing this out', $cache->fetch('test_key')); + + // Test delete + $cache->save('test_key2', 'test2'); + $cache->delete('test_key2'); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testDeleteAll() + { + $cache = $this->_getCacheDriver(); + $cache->save('test_key1', '1'); + $cache->save('test_key2', '2'); + $cache->deleteAll(); + + $this->assertFalse($cache->contains('test_key1')); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testFlushAll() + { + $cache = $this->_getCacheDriver(); + $cache->save('test_key1', '1'); + $cache->save('test_key2', '2'); + $cache->flushAll(); + + $this->assertFalse($cache->contains('test_key1')); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testNamespace() + { + $cache = $this->_getCacheDriver(); + $cache->setNamespace('test_'); + $cache->save('key1', 'test'); + + $this->assertTrue($cache->contains('key1')); + + $cache->setNamespace('test2_'); + + $this->assertFalse($cache->contains('key1')); + } + + /** + * @group DCOM-43 + */ + public function testGetStats() + { + if ($this instanceof ArrayCacheTest || $this instanceof ZendDataCacheTest ) { + $this->markTestSkipped("Statistics are not available for this driver"); + } + + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + + $this->assertArrayHasKey(Cache::STATS_HITS, $stats); + $this->assertArrayHasKey(Cache::STATS_MISSES, $stats); + $this->assertArrayHasKey(Cache::STATS_UPTIME, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_USAGE, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_AVAILIABLE, $stats); + } + + /** + * @return \Doctrine\Common\Cache\CacheProvider + */ + abstract protected function _getCacheDriver(); +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php new file mode 100644 index 00000000..362ff69a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php @@ -0,0 +1,38 @@ +_memcache = new \Memcache; + $ok = @$this->_memcache->connect('localhost', 11211); + if (!$ok) { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } else { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } + + public function testNoExpire() { + $cache = $this->_getCacheDriver(); + $cache->save('noexpire', 'value', 0); + sleep(1); + $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire'); + } + + protected function _getCacheDriver() + { + $driver = new MemcacheCache(); + $driver->setMemcache($this->_memcache); + return $driver; + } + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php new file mode 100644 index 00000000..947ba752 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php @@ -0,0 +1,40 @@ +memcached = new \Memcached(); + $this->memcached->setOption(\Memcached::OPT_COMPRESSION, false); + $this->memcached->addServer('127.0.0.1', 11211); + + $fh = @fsockopen('127.0.0.1', 11211); + if (!$fh) { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } else { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } + + public function testNoExpire() { + $cache = $this->_getCacheDriver(); + $cache->save('noexpire', 'value', 0); + sleep(1); + $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire'); + } + + protected function _getCacheDriver() + { + $driver = new MemcachedCache(); + $driver->setMemcached($this->memcached); + return $driver; + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php new file mode 100644 index 00000000..cb363df9 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of Wincache'); + } + } + + protected function _getCacheDriver() + { + return new WincacheCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php new file mode 100644 index 00000000..62598487 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of xcache'); + } + } + + protected function _getCacheDriver() + { + return new XcacheCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php new file mode 100644 index 00000000..27dcf359 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of Zend Data Cache which only works in apache2handler SAPI'); + } + } + + protected function _getCacheDriver() + { + return new ZendDataCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php new file mode 100644 index 00000000..567cf918 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php @@ -0,0 +1,45 @@ +setIncludePath(__DIR__); + $classLoader->setFileExtension('.class.php'); + $classLoader->setNamespaceSeparator('_'); + + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassA')); + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassB')); + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassC')); + $this->assertFalse($classLoader->canLoadClass('OtherClass')); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassA'), true); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassB'), true); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassC'), true); + } + + public function testClassExists() + { + $this->assertFalse(ClassLoader::classExists('ClassLoaderTest\ClassD')); + $badLoader = function($className) { + require __DIR__ . '/ClassLoaderTest/ClassD.php'; + return true; + }; + spl_autoload_register($badLoader); + $this->assertTrue(ClassLoader::classExists('ClassLoaderTest\ClassD')); + spl_autoload_unregister($badLoader); + } + + public function testGetClassLoader() + { + $cl = new ClassLoader('ClassLoaderTest', __DIR__); + $cl->register(); + $this->assertTrue(ClassLoader::getClassLoader('ClassLoaderTest\ClassD') instanceof \Doctrine\Common\ClassLoader); + $this->assertNull(ClassLoader::getClassLoader('This\Class\Does\Not\Exist')); + $cl->unregister(); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php new file mode 100644 index 00000000..85546547 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php @@ -0,0 +1,6 @@ +_coll = new \Doctrine\Common\Collections\ArrayCollection; + } + + public function testIssetAndUnset() + { + $this->assertFalse(isset($this->_coll[0])); + $this->_coll->add('testing'); + $this->assertTrue(isset($this->_coll[0])); + unset($this->_coll[0]); + $this->assertFalse(isset($this->_coll[0])); + } + + public function testToString() + { + $this->_coll->add('testing'); + $this->assertTrue(is_string((string) $this->_coll)); + } + + public function testRemovingNonExistentEntryReturnsNull() + { + $this->assertEquals(null, $this->_coll->remove('testing_does_not_exist')); + } + + public function testExists() + { + $this->_coll->add("one"); + $this->_coll->add("two"); + $exists = $this->_coll->exists(function($k, $e) { return $e == "one"; }); + $this->assertTrue($exists); + $exists = $this->_coll->exists(function($k, $e) { return $e == "other"; }); + $this->assertFalse($exists); + } + + public function testMap() + { + $this->_coll->add(1); + $this->_coll->add(2); + $res = $this->_coll->map(function($e) { return $e * 2; }); + $this->assertEquals(array(2, 4), $res->toArray()); + } + + public function testFilter() + { + $this->_coll->add(1); + $this->_coll->add("foo"); + $this->_coll->add(3); + $res = $this->_coll->filter(function($e) { return is_numeric($e); }); + $this->assertEquals(array(0 => 1, 2 => 3), $res->toArray()); + } + + public function testFirstAndLast() + { + $this->_coll->add('one'); + $this->_coll->add('two'); + + $this->assertEquals($this->_coll->first(), 'one'); + $this->assertEquals($this->_coll->last(), 'two'); + } + + public function testArrayAccess() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + + $this->assertEquals($this->_coll[0], 'one'); + $this->assertEquals($this->_coll[1], 'two'); + + unset($this->_coll[0]); + $this->assertEquals($this->_coll->count(), 1); + } + + public function testContainsKey() + { + $this->_coll[5] = 'five'; + $this->assertTrue($this->_coll->containsKey(5)); + } + + public function testContains() + { + $this->_coll[0] = 'test'; + $this->assertTrue($this->_coll->contains('test')); + } + + public function testSearch() + { + $this->_coll[0] = 'test'; + $this->assertEquals(0, $this->_coll->indexOf('test')); + } + + public function testGet() + { + $this->_coll[0] = 'test'; + $this->assertEquals('test', $this->_coll->get(0)); + } + + public function testGetKeys() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals(array(0, 1), $this->_coll->getKeys()); + } + + public function testGetValues() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals(array('one', 'two'), $this->_coll->getValues()); + } + + public function testCount() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals($this->_coll->count(), 2); + $this->assertEquals(count($this->_coll), 2); + } + + public function testForAll() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_string($e); }), true); + $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_array($e); }), false); + } + + public function testPartition() + { + $this->_coll[] = true; + $this->_coll[] = false; + $partition = $this->_coll->partition(function($k, $e) { return $e == true; }); + $this->assertEquals($partition[0][0], true); + $this->assertEquals($partition[1][0], false); + } + + public function testClear() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->_coll->clear(); + $this->assertEquals($this->_coll->isEmpty(), true); + } + + public function testRemove() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $el = $this->_coll->remove(0); + + $this->assertEquals('one', $el); + $this->assertEquals($this->_coll->contains('one'), false); + $this->assertNull($this->_coll->remove(0)); + } + + public function testRemoveElement() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + + $this->assertTrue($this->_coll->removeElement('two')); + $this->assertFalse($this->_coll->contains('two')); + $this->assertFalse($this->_coll->removeElement('two')); + } + + public function testSlice() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->_coll[] = 'three'; + + $slice = $this->_coll->slice(0, 1); + $this->assertInternalType('array', $slice); + $this->assertEquals(array('one'), $slice); + + $slice = $this->_coll->slice(1); + $this->assertEquals(array(1 => 'two', 2 => 'three'), $slice); + + $slice = $this->_coll->slice(1, 1); + $this->assertEquals(array(1 => 'two'), $slice); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php new file mode 100644 index 00000000..e69de29b diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php new file mode 100644 index 00000000..2b11b20e --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php @@ -0,0 +1,88 @@ +_eventManager = new EventManager; + $this->_preFooInvoked = false; + $this->_postFooInvoked = false; + } + + public function testInitialState() + { + $this->assertEquals(array(), $this->_eventManager->getListeners()); + $this->assertFalse($this->_eventManager->hasListeners(self::preFoo)); + $this->assertFalse($this->_eventManager->hasListeners(self::postFoo)); + } + + public function testAddEventListener() + { + $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); + $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); + $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); + $this->assertEquals(1, count($this->_eventManager->getListeners(self::preFoo))); + $this->assertEquals(1, count($this->_eventManager->getListeners(self::postFoo))); + $this->assertEquals(2, count($this->_eventManager->getListeners())); + } + + public function testDispatchEvent() + { + $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); + $this->_eventManager->dispatchEvent(self::preFoo); + $this->assertTrue($this->_preFooInvoked); + $this->assertFalse($this->_postFooInvoked); + } + + public function testRemoveEventListener() + { + $this->_eventManager->addEventListener(array('preBar'), $this); + $this->assertTrue($this->_eventManager->hasListeners(self::preBar)); + $this->_eventManager->removeEventListener(array('preBar'), $this); + $this->assertFalse($this->_eventManager->hasListeners(self::preBar)); + } + + public function testAddEventSubscriber() + { + $eventSubscriber = new TestEventSubscriber(); + $this->_eventManager->addEventSubscriber($eventSubscriber); + $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); + $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); + } + + /* Listener methods */ + + public function preFoo(EventArgs $e) + { + $this->_preFooInvoked = true; + } + + public function postFoo(EventArgs $e) + { + $this->_postFooInvoked = true; + } +} + +class TestEventSubscriber implements \Doctrine\Common\EventSubscriber +{ + public function getSubscribedEvents() + { + return array('preFoo', 'postFoo'); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php new file mode 100644 index 00000000..e1825ae2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php @@ -0,0 +1,94 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver1->expects($this->never()) + ->method('loadMetadataForClass'); + $driver1->expectS($this->never()) + ->method('isTransient'); + + $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver2->expects($this->at(0)) + ->method('loadMetadataForClass') + ->with($this->equalTo($className), $this->equalTo($classMetadata)); + $driver2->expects($this->at(1)) + ->method('isTransient') + ->with($this->equalTo($className)) + ->will($this->returnValue( true )); + + $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); + $chain->addDriver($driver2, 'Doctrine\Tests\Common\Persistence\Mapping'); + + $chain->loadMetadataForClass($className, $classMetadata); + + $this->assertTrue( $chain->isTransient($className) ); + } + + public function testLoadMetadata_NoDelegatorFound_ThrowsMappingException() + { + $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; + $classMetadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $this->setExpectedException('Doctrine\Common\Persistence\Mapping\MappingException'); + $chain->loadMetadataForClass($className, $classMetadata); + } + + public function testGatherAllClassNames() + { + $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; + $classMetadata = $this->getMock('Doctrine\Common\Peristence\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver1->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Doctrine\Tests\Models\Company\Foo'))); + + $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver2->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Doctrine\Tests\ORM\Mapping\Bar', 'Doctrine\Tests\ORM\Mapping\Baz', 'FooBarBaz'))); + + $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); + $chain->addDriver($driver2, 'Doctrine\Tests\ORM\Mapping'); + + $this->assertEquals(array( + 'Doctrine\Tests\Models\Company\Foo', + 'Doctrine\Tests\ORM\Mapping\Bar', + 'Doctrine\Tests\ORM\Mapping\Baz' + ), $chain->getAllClassNames()); + } + + /** + * @group DDC-706 + */ + public function testIsTransient() + { + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $chain = new MappingDriverChain(); + $chain->addDriver($driver1, 'Doctrine\Tests\Models\CMS'); + + $this->assertTrue($chain->isTransient('stdClass'), "stdClass isTransient"); + } +} + +class DriverChainEntity +{ + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php new file mode 100644 index 00000000..9fe32994 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php @@ -0,0 +1,134 @@ +getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $this->cmf = new TestClassMetadataFactory($driver, $metadata); + } + + public function testGetCacheDriver() + { + $this->assertNull($this->cmf->getCacheDriver()); + $cache = new ArrayCache(); + $this->cmf->setCacheDriver($cache); + $this->assertSame($cache, $this->cmf->getCacheDriver()); + } + + public function testGetMetadataFor() + { + $metadata = $this->cmf->getMetadataFor('stdClass'); + + $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); + $this->assertTrue($this->cmf->hasMetadataFor('stdClass')); + } + + public function testGetParentMetadata() + { + $metadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + + $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\RootEntity')); + } + + public function testGetCachedMetadata() + { + $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $cache = new ArrayCache(); + $cache->save(__NAMESPACE__. '\ChildEntity$CLASSMETADATA', $metadata); + + $this->cmf->setCacheDriver($cache); + + $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + $this->assertSame($loadedMetadata, $metadata); + } + + public function testCacheGetMetadataFor() + { + $cache = new ArrayCache(); + $this->cmf->setCacheDriver($cache); + + $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + + $this->assertSame($loadedMetadata, $cache->fetch(__NAMESPACE__. '\ChildEntity$CLASSMETADATA')); + } + + public function testGetAliasedMetadata() + { + $loadedMetadata = $this->cmf->getMetadataFor('prefix:ChildEntity'); + + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); + $this->assertTrue($this->cmf->hasMetadataFor('prefix:ChildEntity')); + } +} + +class TestClassMetadataFactory extends AbstractClassMetadataFactory +{ + public $driver; + public $metadata; + + public function __construct($driver, $metadata) + { + $this->driver = $driver; + $this->metadata = $metadata; + } + + protected function doLoadMetadata($class, $parent, $rootEntityFound) + { + + } + + protected function getFqcnFromAlias($namespaceAlias, $simpleClassName) + { + return __NAMESPACE__ . '\\' . $simpleClassName; + } + + protected function initialize() + { + + } + + protected function newClassMetadataInstance($className) + { + return $this->metadata; + } + + protected function getDriver() + { + return $this->driver; + } + protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService) + { + } + + protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService) + { + } +} + +class RootEntity +{ + +} + +class ChildEntity extends RootEntity +{ + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php new file mode 100644 index 00000000..3c600c40 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php @@ -0,0 +1,90 @@ +assertEquals(array($path), $locator->getPaths()); + + $locator = new DefaultFileLocator($path); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testGetFileExtension() + { + $locator = new DefaultFileLocator(array(), ".yml"); + $this->assertEquals(".yml", $locator->getFileExtension()); + $locator->setFileExtension(".xml"); + $this->assertEquals(".xml", $locator->getFileExtension()); + } + + public function testUniquePaths() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path, $path)); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testFindMappingFile() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->assertEquals(__DIR__ . '/_files/stdClass.yml', $locator->findMappingFile('stdClass')); + } + + public function testFindMappingFileNotFound() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->setExpectedException( + 'Doctrine\Common\Persistence\Mapping\MappingException', + "No mapping file found named 'stdClass2.yml' for class 'stdClass2'" + ); + $locator->findMappingFile('stdClass2'); + } + + public function testGetAllClassNames() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + $classes = $locator->getAllClassNames(null); + sort($classes); + + $this->assertEquals(array('global', 'stdClass'), $classes); + $this->assertEquals(array('stdClass'), $locator->getAllClassNames("global")); + } + + public function testGetAllClassNamesNonMatchingFileExtension() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".xml"); + $this->assertEquals(array(), $locator->getAllClassNames("global")); + } + + public function testFileExists() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->assertTrue($locator->fileExists("stdClass")); + $this->assertFalse($locator->fileExists("stdClass2")); + $this->assertTrue($locator->fileExists("global")); + $this->assertFalse($locator->fileExists("global2")); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php new file mode 100644 index 00000000..020c2424 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php @@ -0,0 +1,142 @@ +assertNull($driver->getGlobalBasename()); + + $driver->setGlobalBasename("global"); + $this->assertEquals("global", $driver->getGlobalBasename()); + } + + public function testGetElementFromGlobalFile() + { + $driver = new TestFileDriver($this->newLocator()); + $driver->setGlobalBasename("global"); + + $element = $driver->getElement('stdGlobal'); + + $this->assertEquals('stdGlobal', $element); + } + + public function testGetElementFromFile() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('findMappingFile') + ->with($this->equalTo('stdClass')) + ->will($this->returnValue(__DIR__ . '/_files/stdClass.yml')); + + $driver = new TestFileDriver($locator); + + $this->assertEquals('stdClass', $driver->getElement('stdClass')); + } + + public function testGetAllClassNamesGlobalBasename() + { + $driver = new TestFileDriver($this->newLocator()); + $driver->setGlobalBasename("global"); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdGlobal', 'stdGlobal2'), $classNames); + } + + public function testGetAllClassNamesFromMappingFile() + { + $locator = $this->newLocator(); + $locator->expects($this->any()) + ->method('getAllClassNames') + ->with($this->equalTo(null)) + ->will($this->returnValue(array('stdClass'))); + $driver = new TestFileDriver($locator); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdClass'), $classNames); + } + + public function testGetAllClassNamesBothSources() + { + $locator = $this->newLocator(); + $locator->expects($this->any()) + ->method('getAllClassNames') + ->with($this->equalTo('global')) + ->will($this->returnValue(array('stdClass'))); + $driver = new TestFileDriver($locator); + $driver->setGlobalBasename("global"); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdGlobal', 'stdGlobal2', 'stdClass'), $classNames); + } + + public function testIsNotTransient() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('fileExists') + ->with($this->equalTo('stdClass')) + ->will($this->returnValue( true )); + + $driver = new TestFileDriver($locator); + $driver->setGlobalBasename("global"); + + $this->assertFalse($driver->isTransient('stdClass')); + $this->assertFalse($driver->isTransient('stdGlobal')); + $this->assertFalse($driver->isTransient('stdGlobal2')); + } + + public function testIsTransient() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('fileExists') + ->with($this->equalTo('stdClass2')) + ->will($this->returnValue( false )); + + $driver = new TestFileDriver($locator); + + $this->assertTrue($driver->isTransient('stdClass2')); + } + + public function testNonLocatorFallback() + { + $driver = new TestFileDriver(__DIR__ . '/_files', '.yml'); + $this->assertTrue($driver->isTransient('stdClass2')); + $this->assertFalse($driver->isTransient('stdClass')); + } + + private function newLocator() + { + $locator = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\FileLocator'); + $locator->expects($this->any())->method('getFileExtension')->will($this->returnValue('.yml')); + $locator->expects($this->any())->method('getPaths')->will($this->returnValue(array(__DIR__ . "/_files"))); + return $locator; + } +} + +class TestFileDriver extends FileDriver +{ + protected function loadMappingFile($file) + { + if (strpos($file, "global.yml") !== false) { + return array('stdGlobal' => 'stdGlobal', 'stdGlobal2' => 'stdGlobal2'); + } + return array('stdClass' => 'stdClass'); + } + + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php new file mode 100644 index 00000000..8fc4d807 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php @@ -0,0 +1,18 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $metadata->expects($this->once())->method('getFieldNames'); + + $driver = new PHPDriver(array(__DIR__ . "/_files")); + $driver->loadMetadataForClass('TestEntity', $metadata); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php new file mode 100644 index 00000000..5f06cad9 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Tests\Common\Persistence\Mapping; + +use Doctrine\Common\Persistence\Mapping\RuntimeReflectionService; + +/** + * @group DCOM-93 + */ +class RuntimeReflectionServiceTest extends \PHPUnit_Framework_TestCase +{ + private $reflectionService; + + public function setUp() + { + $this->reflectionService = new RuntimeReflectionService(); + } + + public function testShortname() + { + $this->assertEquals("RuntimeReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); + } + + public function testClassNamespaceName() + { + $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); + } + + public function testGetParentClasses() + { + $classes = $this->reflectionService->getParentClasses(__CLASS__); + $this->assertTrue(count($classes) >= 1, "The test class ".__CLASS__." should have at least one parent."); + } + + public function testGetReflectionClass() + { + $class = $this->reflectionService->getClass(__CLASS__); + $this->assertInstanceOf("ReflectionClass", $class); + } + + public function testGetMethods() + { + $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); + $this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); + } + + public function testGetAccessibleProperty() + { + $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); + $this->assertInstanceOf("ReflectionProperty", $reflProp); + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php new file mode 100644 index 00000000..9f1c5684 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php @@ -0,0 +1,35 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $metadata->expects($this->once())->method('getFieldNames'); + + $driver = new StaticPHPDriver(array(__DIR__)); + $driver->loadMetadataForClass(__NAMESPACE__ . '\\TestEntity', $metadata); + } + + public function testGetAllClassNames() + { + $driver = new StaticPHPDriver(array(__DIR__)); + $classNames = $driver->getAllClassNames(); + + $this->assertContains( + 'Doctrine\Tests\Common\Persistence\Mapping\TestEntity', $classNames); + } +} + +class TestEntity +{ + static public function loadMetadata($metadata) + { + $metadata->getFieldNames(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php new file mode 100644 index 00000000..ffce6d40 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Tests\Common\Persistence\Mapping; + +use Doctrine\Common\Persistence\Mapping\StaticReflectionService; + +/** + * @group DCOM-93 + */ +class StaticReflectionServiceTest extends \PHPUnit_Framework_TestCase +{ + private $reflectionService; + + public function setUp() + { + $this->reflectionService = new StaticReflectionService(); + } + + public function testShortname() + { + $this->assertEquals("StaticReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); + } + + public function testClassNamespaceName() + { + $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); + } + + public function testGetParentClasses() + { + $classes = $this->reflectionService->getParentClasses(__CLASS__); + $this->assertTrue(count($classes) == 0, "The test class ".__CLASS__." should have no parents according to static reflection."); + } + + public function testGetReflectionClass() + { + $class = $this->reflectionService->getClass(__CLASS__); + $this->assertNull($class); + } + + public function testGetMethods() + { + $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); + $this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); + } + + public function testGetAccessibleProperty() + { + $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); + $this->assertNull($reflProp); + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php new file mode 100644 index 00000000..b51162e6 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php @@ -0,0 +1,88 @@ + $prefix)); + $this->assertEquals(array($path), $locator->getPaths()); + + $locator = new SymfonyFileLocator(array($path => $prefix)); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testGetPrefixes() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix)); + $this->assertEquals(array($path => $prefix), $locator->getNamespacePrefixes()); + } + + public function testGetFileExtension() + { + $locator = new SymfonyFileLocator(array(), ".yml"); + $this->assertEquals(".yml", $locator->getFileExtension()); + $locator->setFileExtension(".xml"); + $this->assertEquals(".xml", $locator->getFileExtension()); + } + + public function testFileExists() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->assertTrue($locator->fileExists("Foo\stdClass")); + $this->assertTrue($locator->fileExists("Foo\global")); + $this->assertFalse($locator->fileExists("Foo\stdClass2")); + $this->assertFalse($locator->fileExists("Foo\global2")); + } + + public function testGetAllClassNames() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + $classes = $locator->getAllClassNames(null); + sort($classes); + + $this->assertEquals(array("Foo\\global", "Foo\\stdClass"), $classes); + $this->assertEquals(array("Foo\\stdClass"), $locator->getAllClassNames("global")); + } + + public function testFindMappingFile() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->assertEquals(__DIR__ . "/_files/stdClass.yml", $locator->findMappingFile("Foo\\stdClass")); + } + + public function testFindMappingFileNotFound() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->setExpectedException( + "Doctrine\Common\Persistence\Mapping\MappingException", + "No mapping file found named '".__DIR__."/_files/stdClass2.yml' for class 'Foo\stdClass2'." + ); + $locator->findMappingFile("Foo\\stdClass2"); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php new file mode 100644 index 00000000..d0e9976a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php @@ -0,0 +1,3 @@ +getFieldNames(); \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php new file mode 100644 index 00000000..a0f77b50 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php @@ -0,0 +1,247 @@ +cm = new TestObjectMetadata; + $this->om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); + $this->om->expects($this->any())->method('getClassMetadata') + ->will($this->returnValue($this->cm)); + $this->object = new TestObject; + PersistentObject::setObjectManager($this->om); + $this->object->injectObjectManager($this->om, $this->cm); + } + + public function testGetObjectManager() + { + $this->assertSame($this->om, PersistentObject::getObjectManager()); + } + + public function testNonMatchingObjectManager() + { + $this->setExpectedException('RuntimeException'); + $om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); + $this->object->injectObjectManager($om, $this->cm); + } + + public function testGetField() + { + $this->assertEquals('beberlei', $this->object->getName()); + } + + public function testSetField() + { + $this->object->setName("test"); + $this->assertEquals("test", $this->object->getName()); + } + + public function testGetIdentifier() + { + $this->assertEquals(1, $this->object->getId()); + } + + public function testSetIdentifier() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->setId(2); + } + + public function testSetUnknownField() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->setUnknown("test"); + } + + public function testGetUnknownField() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->getUnknown(); + } + + public function testGetToOneAssociation() + { + $this->assertNull($this->object->getParent()); + } + + public function testSetToOneAssociation() + { + $parent = new TestObject(); + $this->object->setParent($parent); + $this->assertSame($parent, $this->object->getParent($parent)); + } + + public function testSetInvalidToOneAssocation() + { + $parent = new \stdClass(); + + $this->setExpectedException('InvalidArgumentException'); + $this->object->setParent($parent); + } + + public function testSetToOneAssociationNull() + { + $parent = new TestObject(); + $this->object->setParent($parent); + $this->object->setParent(null); + $this->assertNull($this->object->getParent()); + } + + public function testAddToManyAssocation() + { + $child = new TestObject(); + $this->object->addChildren($child); + + $this->assertSame($this->object, $child->getParent()); + $this->assertEquals(1, count($this->object->getChildren())); + + $child = new TestObject(); + $this->object->addChildren($child); + + $this->assertEquals(2, count($this->object->getChildren())); + } + + public function testAddInvalidToManyAssocation() + { + $this->setExpectedException('InvalidArgumentException'); + $this->object->addChildren(new \stdClass()); + } + + public function testNoObjectManagerSet() + { + PersistentObject::setObjectManager(null); + $child = new TestObject(); + + $this->setExpectedException('RuntimeException'); + $child->setName("test"); + } + + public function testInvalidMethod() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->asdf(); + } + + public function testAddInvalidCollection() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->addAsdf(new \stdClass()); + } +} + +class TestObject extends PersistentObject +{ + protected $id = 1; + protected $name = 'beberlei'; + protected $parent; + protected $children; +} + +class TestObjectMetadata implements ClassMetadata +{ + + public function getAssociationMappedByTargetField($assocName) + { + $assoc = array('children' => 'parent'); + return $assoc[$assocName]; + } + + public function getAssociationNames() + { + return array('parent', 'children'); + } + + public function getAssociationTargetClass($assocName) + { + return __NAMESPACE__ . '\TestObject'; + } + + public function getFieldNames() + { + return array('id', 'name'); + } + + public function getIdentifier() + { + return array('id'); + } + + public function getName() + { + return __NAMESPACE__ . '\TestObject'; + } + + public function getReflectionClass() + { + return new \ReflectionClass($this->getName()); + } + + public function getTypeOfField($fieldName) + { + $types = array('id' => 'integer', 'name' => 'string'); + return $types[$fieldName]; + } + + public function hasAssociation($fieldName) + { + return in_array($fieldName, array('parent', 'children')); + } + + public function hasField($fieldName) + { + return in_array($fieldName, array('id', 'name')); + } + + public function isAssociationInverseSide($assocName) + { + return ($assocName === 'children'); + } + + public function isCollectionValuedAssociation($fieldName) + { + return ($fieldName === 'children'); + } + + public function isIdentifier($fieldName) + { + return $fieldName === 'id'; + } + + public function isSingleValuedAssociation($fieldName) + { + return $fieldName === 'parent'; + } + + public function getIdentifierValues($entity) + { + + } + + public function getIdentifierFieldNames() + { + + } + + public function initializeReflection(ReflectionService $reflService) + { + + } + + public function wakeupReflection(ReflectionService $reflService) + { + + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php new file mode 100644 index 00000000..a2814500 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php @@ -0,0 +1,100 @@ +assertEquals($expectedClassName, ClassUtils::getRealClass($className)); + } + + /** + * @dataProvider dataGetClass + */ + public function testGetClass( $className, $expectedClassName ) + { + $object = new $className(); + $this->assertEquals($expectedClassName, ClassUtils::getClass($object)); + } + + public function testGetParentClass() + { + $parentClass = ClassUtils::getParentClass( 'MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject' ); + $this->assertEquals('stdClass', $parentClass); + } + + public function testGenerateProxyClassName() + { + $this->assertEquals( 'Proxies\__CG__\stdClass', ClassUtils::generateProxyClassName( 'stdClass', 'Proxies' ) ); + } + + /** + * @dataProvider dataGetClass + */ + public function testNewReflectionClass( $className, $expectedClassName ) + { + $reflClass = ClassUtils::newReflectionClass( $className ); + $this->assertEquals( $expectedClassName, $reflClass->getName() ); + } + + /** + * @dataProvider dataGetClass + */ + public function testNewReflectionObject( $className, $expectedClassName ) + { + $object = new $className; + $reflClass = ClassUtils::newReflectionObject( $object ); + $this->assertEquals( $expectedClassName, $reflClass->getName() ); + } + } + + class ChildObject extends \stdClass + { + } +} + +namespace MyProject\Proxies\__CG__ +{ + class stdClass extends \stdClass + { + } +} + +namespace MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util +{ + class ChildObject extends \Doctrine\Tests\Common\Util\ChildObject + { + } +} + +namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__ +{ + class stdClass extends \MyProject\Proxies\__CG__\stdClass + { + } +} + +namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util +{ + class ChildObject extends \MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject + { + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php new file mode 100644 index 00000000..b4e9eed2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php @@ -0,0 +1,27 @@ +foo = "bar"; + $obj->bar = 1234; + + $var = Debug::export($obj, 2); + $this->assertEquals( "stdClass", $var->__CLASS__ ); + } + + public function testExportDateTime() + { + $obj = new \DateTime( "2010-10-10 10:10:10" ); + + $var = Debug::export( $obj, 2 ); + $this->assertEquals( "DateTime", $var->__CLASS__ ); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php b/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php new file mode 100644 index 00000000..e8323d29 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php @@ -0,0 +1,10 @@ + + */ +class NativePhpunitTask extends Task +{ + private $test; + private $testfile; + private $testdirectory; + private $configuration = null; + private $coverageClover = null; + private $junitlogfile = null; + private $haltonfailure = true; + private $haltonerror = true; + + public function setTestdirectory($directory) { + $this->testdirectory = $directory; + } + + public function setTest($test) { + $this->test = $test; + } + + public function setTestfile($testfile) { + $this->testfile = $testfile; + } + + public function setJunitlogfile($junitlogfile) { + if (strlen($junitlogfile) == 0) { + $junitlogfile = NULL; + } + + $this->junitlogfile = $junitlogfile; + } + + public function setConfiguration($configuration) { + if (strlen($configuration) == 0) { + $configuration = NULL; + } + + $this->configuration = $configuration; + } + + public function setCoverageClover($coverageClover) { + if (strlen($coverageClover) == 0) { + $coverageClover = NULL; + } + + $this->coverageClover = $coverageClover; + } + + public function setHaltonfailure($haltonfailures) { + $this->haltonfailure = $haltonfailures; + } + + public function setHaltonerror($haltonerrors) { + $this->haltonerror = $haltonerrors; + } + + public function init() + { + require_once "PHPUnit/Runner/Version.php"; + $version = PHPUnit_Runner_Version::id(); + + if (version_compare($version, '3.4.0') < 0) { + throw new BuildException("NativePHPUnitTask requires PHPUnit version >= 3.2.0", $this->getLocation()); + } + + require_once 'PHPUnit/Util/Filter.php'; + + // point PHPUnit_MAIN_METHOD define to non-existing method + if (!defined('PHPUnit_MAIN_METHOD')) { + define('PHPUnit_MAIN_METHOD', 'PHPUnitTask::undefined'); + } + } + + public function main() + { + if (!is_dir(realpath($this->testdirectory))) { + throw new BuildException("NativePHPUnitTask requires a Test Directory path given, '".$this->testdirectory."' given."); + } + set_include_path(realpath($this->testdirectory) . PATH_SEPARATOR . get_include_path()); + + $printer = new NativePhpunitPrinter(); + + $arguments = array( + 'configuration' => $this->configuration, + 'coverageClover' => $this->coverageClover, + 'junitLogfile' => $this->junitlogfile, + 'printer' => $printer, + ); + + $runner = new PHPUnit_TextUI_TestRunner(); + $suite = $runner->getTest($this->test, $this->testfile, true); + + try { + $result = $runner->doRun($suite, $arguments); + /* @var $result PHPUnit_Framework_TestResult */ + + if ( ($this->haltonfailure && $result->failureCount() > 0) || ($this->haltonerror && $result->errorCount() > 0) ) { + throw new BuildException("PHPUnit: ".$result->failureCount()." Failures and ".$result->errorCount()." Errors, ". + "last failure message: ".$printer->getMessages()); + } + + $this->log("PHPUnit Success: ".count($result->passed())." tests passed, no ". + "failures (".$result->skippedCount()." skipped, ".$result->notImplementedCount()." not implemented)"); + + // Hudson for example doesn't like the backslash in class names + if (file_exists($this->coverageClover)) { + $this->log("Generated Clover Coverage XML to: ".$this->coverageClover); + $content = file_get_contents($this->coverageClover); + $content = str_replace("\\", ".", $content); + file_put_contents($this->coverageClover, $content); + unset($content); + } + + } catch(\Exception $e) { + throw new BuildException("NativePhpunitTask failed: ".$e->getMessage()); + } + } +} + +class NativePhpunitPrinter extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener +{ + private $_messages = array(); + + public function write($buffer) + { + // do nothing + } + + public function getMessages() + { + return $this->_messages; + } + + /** + * An error occurred. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + */ + public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) + { + $this->_messages[] = "Test ERROR: ".$test->getName().": ".$e->getMessage(); + } + + /** + * A failure occurred. + * + * @param PHPUnit_Framework_Test $test + * @param PHPUnit_Framework_AssertionFailedError $e + * @param float $time + */ + public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) + { + $this->_messages[] = "Test FAILED: ".$test->getName().": ".$e->getMessage(); + } + + /** + * Incomplete test. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + */ + public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) + { + + } + + /** + * Skipped test. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + * @since Method available since Release 3.0.0 + */ + public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) + { + + } + + /** + * A test suite started. + * + * @param PHPUnit_Framework_TestSuite $suite + * @since Method available since Release 2.2.0 + */ + public function startTestSuite(PHPUnit_Framework_TestSuite $suite) + { + + } + + /** + * A test suite ended. + * + * @param PHPUnit_Framework_TestSuite $suite + * @since Method available since Release 2.2.0 + */ + public function endTestSuite(PHPUnit_Framework_TestSuite $suite) + { + + } + + /** + * A test started. + * + * @param PHPUnit_Framework_Test $test + */ + public function startTest(PHPUnit_Framework_Test $test) + { + + } + + /** + * A test ended. + * + * @param PHPUnit_Framework_Test $test + * @param float $time + */ + public function endTest(PHPUnit_Framework_Test $test, $time) + { + + } +} diff --git a/vendor/doctrine/common/tests/README.markdown b/vendor/doctrine/common/tests/README.markdown new file mode 100644 index 00000000..e6f1703d --- /dev/null +++ b/vendor/doctrine/common/tests/README.markdown @@ -0,0 +1,27 @@ +# Running the Doctrine 2 Testsuite + +## Running tests + +Execute PHPUnit in the root folder of your doctrine-common clone. + + phpunit + +## Testing Lock-Support + +The Lock support in Doctrine 2 is tested using Gearman, which allows to run concurrent tasks in parallel. +Install Gearman with PHP as follows: + +1. Go to http://www.gearman.org and download the latest Gearman Server +2. Compile it and then call ldconfig +3. Start it up "gearmand -vvvv" +4. Install pecl/gearman by calling "gearman-beta" + +You can then go into tests/ and start up two workers: + + php Doctrine/Tests/ORM/Functional/Locking/LockAgentWorker.php + +Then run the locking test-suite: + + phpunit --configuration Doctrine/Tests/ORM/Functional/Locking/GearmanLockTest.php + +This can run considerable time, because it is using sleep() to test for the timing ranges of locks. \ No newline at end of file From fedade1822688b8d70f6e7ebc1d0e3fe4521d376 Mon Sep 17 00:00:00 2001 From: "cheresharov@yahoo.com" <> Date: Wed, 27 Feb 2013 17:44:33 +0000 Subject: [PATCH 176/180] Fixing a problem in studentAction FmiStudentController.php --- .../src/FmiStudent/Controller/IndexController.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/module/FmiStudent/src/FmiStudent/Controller/IndexController.php b/module/FmiStudent/src/FmiStudent/Controller/IndexController.php index f861642e..34a26fb7 100644 --- a/module/FmiStudent/src/FmiStudent/Controller/IndexController.php +++ b/module/FmiStudent/src/FmiStudent/Controller/IndexController.php @@ -18,9 +18,11 @@ public function indexAction() { return new ViewModel(); } - - public function studentAction() { - $this->layout('layout/student'); // change the layout. DOn't forget to add it in modeule.config.php - return $viewModel; - } + + public function studentAction() { + $viewModel = new ViewModel(); + // $viewModel->setTemplate('layout/custom'); + $this->layout('layout/student'); // change the layout. DOn't forget to add it in modeule.config.php + return $viewModel; + } } From 43df9cb1186fc4366d0fd6378fdefb7692c25794 Mon Sep 17 00:00:00 2001 From: cl-server Date: Thu, 28 Feb 2013 15:09:21 +0000 Subject: [PATCH 177/180] init --- .htaccess | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .htaccess diff --git a/.htaccess b/.htaccess new file mode 100644 index 00000000..912ca125 --- /dev/null +++ b/.htaccess @@ -0,0 +1,4 @@ + + Order allow,deny + Deny from all + From 6e9b956d1c2e0cde1319f16c49f1d4e7e846831d Mon Sep 17 00:00:00 2001 From: cheresharov Date: Thu, 28 Feb 2013 15:29:02 +0000 Subject: [PATCH 178/180] Initial commit --- .gitignore | 9 + LICENSE.txt | 27 + README.md | 33 + composer.json | 22 + composer.phar | Bin 0 -> 570295 bytes config/application.config.php | 15 + config/autoload/.gitignore | 2 + config/autoload/README.md | 8 + config/autoload/global.php | 16 + config/autoload/local.php.dist | 16 + data/cache/.gitignore | 2 + init_autoloader.php | 49 + module/Application/Module.php | 39 + module/Application/config/module.config.php | 91 ++ module/Application/language/ar_SY.mo | Bin 0 -> 5526 bytes module/Application/language/ar_SY.po | 184 +++ module/Application/language/cs_CZ.mo | Bin 0 -> 5005 bytes module/Application/language/cs_CZ.po | 153 +++ module/Application/language/de_DE.mo | Bin 0 -> 5126 bytes module/Application/language/de_DE.po | 153 +++ module/Application/language/en_US.mo | Bin 0 -> 545 bytes module/Application/language/en_US.po | 153 +++ module/Application/language/es_ES.mo | Bin 0 -> 5063 bytes module/Application/language/es_ES.po | 111 ++ module/Application/language/fr_CA.mo | Bin 0 -> 5074 bytes module/Application/language/fr_CA.po | 153 +++ module/Application/language/fr_FR.mo | Bin 0 -> 5077 bytes module/Application/language/fr_FR.po | 153 +++ module/Application/language/it_IT.mo | Bin 0 -> 4922 bytes module/Application/language/it_IT.po | 154 +++ module/Application/language/ja_JP.mo | Bin 0 -> 5185 bytes module/Application/language/ja_JP.po | 140 +++ module/Application/language/nl_NL.mo | Bin 0 -> 4815 bytes module/Application/language/nl_NL.po | 153 +++ module/Application/language/pl_PL.mo | Bin 0 -> 4934 bytes module/Application/language/pl_PL.po | 153 +++ module/Application/language/tr_TR.mo | Bin 0 -> 4785 bytes module/Application/language/tr_TR.po | 153 +++ .../Controller/IndexController.php | 21 + .../view/application/index/index.phtml | 26 + module/Application/view/error/404.phtml | 61 + module/Application/view/error/index.phtml | 62 + module/Application/view/layout/layout.phtml | 57 + public/.htaccess | 7 + public/css/bootstrap-responsive.min.css | 3 + public/css/bootstrap.min.css | 610 +++++++++ public/css/style.css | 37 + public/images/favicon.ico | Bin 0 -> 1406 bytes public/images/zf2-logo.png | Bin 0 -> 738 bytes public/index.php | 12 + public/js/html5.js | 4 + public/js/jquery-1.7.2.min.js | 4 + vendor/.gitignore | 5 + vendor/README.md | 1 + vendor/doctrine/common/.gitignore | 4 + vendor/doctrine/common/.gitmodules | 3 + vendor/doctrine/common/.travis.yml | 5 + vendor/doctrine/common/LICENSE | 504 ++++++++ vendor/doctrine/common/README.md | 12 + vendor/doctrine/common/UPGRADE_TO_2_1 | 39 + vendor/doctrine/common/UPGRADE_TO_2_2 | 61 + vendor/doctrine/common/build.properties | 6 + vendor/doctrine/common/build.xml | 59 + vendor/doctrine/common/composer.json | 21 + .../Common/Annotations/Annotation.php | 75 ++ .../Annotations/Annotation/Attribute.php | 47 + .../Annotations/Annotation/Attributes.php | 37 + .../Annotation/IgnoreAnnotation.php | 44 + .../Annotations/Annotation/Required.php | 33 + .../Common/Annotations/Annotation/Target.php | 105 ++ .../Annotations/AnnotationException.php | 111 ++ .../Common/Annotations/AnnotationReader.php | 303 +++++ .../Common/Annotations/AnnotationRegistry.php | 129 ++ .../Common/Annotations/CachedReader.php | 179 +++ .../Doctrine/Common/Annotations/DocLexer.php | 140 +++ .../Doctrine/Common/Annotations/DocParser.php | 891 +++++++++++++ .../Common/Annotations/FileCacheReader.php | 209 +++ .../Common/Annotations/IndexedReader.php | 94 ++ .../Doctrine/Common/Annotations/PhpParser.php | 203 +++ .../Doctrine/Common/Annotations/Reader.php | 35 + .../Annotations/SimpleAnnotationReader.php | 152 +++ .../lib/Doctrine/Common/Cache/ApcCache.php | 97 ++ .../lib/Doctrine/Common/Cache/ArrayCache.php | 96 ++ .../lib/Doctrine/Common/Cache/Cache.php | 102 ++ .../Doctrine/Common/Cache/CacheProvider.php | 188 +++ .../Doctrine/Common/Cache/MemcacheCache.php | 121 ++ .../Doctrine/Common/Cache/MemcachedCache.php | 124 ++ .../Doctrine/Common/Cache/WinCacheCache.php | 92 ++ .../lib/Doctrine/Common/Cache/XcacheCache.php | 110 ++ .../Doctrine/Common/Cache/ZendDataCache.php | 84 ++ .../lib/Doctrine/Common/ClassLoader.php | 262 ++++ .../Common/Collections/ArrayCollection.php | 447 +++++++ .../Common/Collections/Collection.php | 243 ++++ .../lib/Doctrine/Common/CommonException.php | 28 + .../common/lib/Doctrine/Common/Comparable.php | 47 + .../common/lib/Doctrine/Common/EventArgs.php | 69 + .../lib/Doctrine/Common/EventManager.php | 136 ++ .../lib/Doctrine/Common/EventSubscriber.php | 45 + .../common/lib/Doctrine/Common/Lexer.php | 266 ++++ .../Doctrine/Common/NotifyPropertyChanged.php | 45 + .../Persistence/AbstractManagerRegistry.php | 224 ++++ .../Common/Persistence/ConnectionRegistry.php | 63 + .../Persistence/Event/LifecycleEventArgs.php | 77 ++ .../Event/LoadClassMetadataEventArgs.php | 76 ++ .../Persistence/Event/ManagerEventArgs.php | 59 + .../Persistence/Event/OnClearEventArgs.php | 84 ++ .../Persistence/Event/PreUpdateEventArgs.php | 129 ++ .../Common/Persistence/ManagerRegistry.php | 112 ++ .../Mapping/AbstractClassMetadataFactory.php | 359 ++++++ .../Persistence/Mapping/ClassMetadata.php | 165 +++ .../Mapping/ClassMetadataFactory.php | 74 ++ .../Mapping/Driver/AnnotationDriver.php | 214 ++++ .../Mapping/Driver/DefaultFileLocator.php | 169 +++ .../Persistence/Mapping/Driver/FileDriver.php | 178 +++ .../Mapping/Driver/FileLocator.php | 69 + .../Mapping/Driver/MappingDriver.php | 56 + .../Mapping/Driver/MappingDriverChain.php | 125 ++ .../Persistence/Mapping/Driver/PHPDriver.php | 70 ++ .../Mapping/Driver/StaticPHPDriver.php | 131 ++ .../Mapping/Driver/SymfonyFileLocator.php | 198 +++ .../Persistence/Mapping/MappingException.php | 57 + .../Persistence/Mapping/ReflectionService.php | 80 ++ .../Mapping/RuntimeReflectionService.php | 102 ++ .../Mapping/StaticReflectionService.php | 107 ++ .../Common/Persistence/ObjectManager.php | 143 +++ .../Common/Persistence/ObjectManagerAware.php | 49 + .../Common/Persistence/ObjectRepository.php | 78 ++ .../Common/Persistence/PersistentObject.php | 233 ++++ .../lib/Doctrine/Common/Persistence/Proxy.php | 60 + .../Common/PropertyChangedListener.php | 48 + .../lib/Doctrine/Common/Util/ClassUtils.php | 103 ++ .../common/lib/Doctrine/Common/Util/Debug.php | 123 ++ .../lib/Doctrine/Common/Util/Inflector.php | 72 ++ .../common/lib/Doctrine/Common/Version.php | 55 + vendor/doctrine/common/phpunit.xml.dist | 31 + vendor/doctrine/common/tests/.gitignore | 3 + .../Common/Annotations/AbstractReaderTest.php | 538 ++++++++ .../Annotations/AnnotationReaderTest.php | 13 + .../Common/Annotations/CachedReaderTest.php | 56 + .../Tests/Common/Annotations/DocLexerTest.php | 27 + .../Common/Annotations/DocParserTest.php | 1118 +++++++++++++++++ .../Annotations/FileCacheReaderTest.php | 40 + .../Annotation/AnnotWithDefaultValue.php | 10 + .../Fixtures/Annotation/Autoload.php | 10 + .../Annotations/Fixtures/Annotation/Route.php | 11 + .../Fixtures/Annotation/Secure.php | 18 + .../Fixtures/Annotation/Template.php | 14 + .../Fixtures/Annotation/Version.php | 11 + .../Fixtures/AnnotationTargetAll.php | 14 + .../Fixtures/AnnotationTargetAnnotation.php | 14 + .../Fixtures/AnnotationTargetClass.php | 15 + .../Fixtures/AnnotationTargetMethod.php | 15 + .../AnnotationTargetPropertyMethod.php | 14 + .../Fixtures/AnnotationWithAttributes.php | 119 ++ .../AnnotationWithRequiredAttributes.php | 50 + ...ithRequiredAttributesWithoutContructor.php | 24 + .../AnnotationWithTargetSyntaxError.php | 11 + .../Fixtures/AnnotationWithVarType.php | 62 + .../Annotations/Fixtures/ClassDDC1660.php | 30 + ...assWithAnnotationWithTargetSyntaxError.php | 21 + .../ClassWithAnnotationWithVarType.php | 31 + .../ClassWithFullyQualifiedUseStatements.php | 11 + ...lassWithInvalidAnnotationTargetAtClass.php | 17 + ...assWithInvalidAnnotationTargetAtMethod.php | 20 + ...sWithInvalidAnnotationTargetAtProperty.php | 24 + .../ClassWithValidAnnotationTarget.php | 41 + .../Annotations/Fixtures/Controller.php | 300 +++++ ...erentNamespacesPerFileWithClassAsFirst.php | 15 + ...ferentNamespacesPerFileWithClassAsLast.php | 15 + ...EqualNamespacesPerFileWithClassAsFirst.php | 13 + .../EqualNamespacesPerFileWithClassAsLast.php | 12 + ...lobalNamespacesPerFileWithClassAsFirst.php | 12 + ...GlobalNamespacesPerFileWithClassAsLast.php | 12 + .../InvalidAnnotationUsageButIgnoredClass.php | 14 + .../Fixtures/InvalidAnnotationUsageClass.php | 10 + .../Fixtures/MultipleClassesInFile.php | 9 + .../MultipleImportsInUseStatement.php | 10 + .../NamespaceAndClassCommentedOut.php | 20 + .../NamespaceWithClosureDeclaration.php | 15 + .../Fixtures/NamespacedSingleClassLOC1000.php | 1009 +++++++++++++++ .../Annotations/Fixtures/NoAnnotation.php | 5 + .../Fixtures/NonNamespacedClass.php | 10 + .../Fixtures/SingleClassLOC1000.php | 1006 +++++++++++++++ .../Annotations/Fixtures/TestInterface.php | 13 + .../Common/Annotations/PerformanceTest.php | 194 +++ .../Common/Annotations/PhpParserTest.php | 179 +++ .../SimpleAnnotationReaderTest.php | 97 ++ .../Common/Annotations/Ticket/DCOM55Test.php | 65 + .../Annotations/Ticket/DCOM58Entity.php | 8 + .../Common/Annotations/Ticket/DCOM58Test.php | 112 ++ .../Common/Annotations/TopLevelAnnotation.php | 8 + .../Tests/Common/Cache/ApcCacheTest.php | 20 + .../Tests/Common/Cache/ArrayCacheTest.php | 13 + .../Doctrine/Tests/Common/Cache/CacheTest.php | 87 ++ .../Tests/Common/Cache/MemcacheCacheTest.php | 38 + .../Tests/Common/Cache/MemcachedCacheTest.php | 40 + .../Tests/Common/Cache/WinCacheCacheTest.php | 20 + .../Tests/Common/Cache/XcacheCacheTest.php | 20 + .../Tests/Common/Cache/ZendDataCacheTest.php | 20 + .../Doctrine/Tests/Common/ClassLoaderTest.php | 45 + .../Common/ClassLoaderTest/ClassA.class.php | 6 + .../Common/ClassLoaderTest/ClassB.class.php | 6 + .../Common/ClassLoaderTest/ClassC.class.php | 6 + .../Tests/Common/ClassLoaderTest/ClassD.php | 5 + .../Common/Collections/CollectionTest.php | 195 +++ .../Tests/Common/DoctrineExceptionTest.php | 0 .../Tests/Common/EventManagerTest.php | 88 ++ .../Persistence/Mapping/ChainDriverTest.php | 94 ++ .../Mapping/ClassMetadataFactoryTest.php | 134 ++ .../Mapping/DefaultFileLocatorTest.php | 90 ++ .../Persistence/Mapping/FileDriverTest.php | 142 +++ .../Persistence/Mapping/PHPDriverTest.php | 18 + .../Mapping/RuntimeReflectionServiceTest.php | 70 ++ .../Mapping/StaticPHPDriverTest.php | 35 + .../Mapping/StaticReflectionServiceTest.php | 70 ++ .../Mapping/SymfonyFileLocatorTest.php | 88 ++ .../Persistence/Mapping/_files/TestEntity.php | 3 + .../Persistence/Mapping/_files/global.yml | 1 + .../Persistence/Mapping/_files/stdClass.yml | 1 + .../Persistence/PersistentObjectTest.php | 247 ++++ .../Tests/Common/Util/ClassUtilsTest.php | 100 ++ .../Doctrine/Tests/Common/Util/DebugTest.php | 27 + .../tests/Doctrine/Tests/DoctrineTestCase.php | 10 + .../common/tests/Doctrine/Tests/TestInit.php | 31 + .../common/tests/NativePhpunitTask.php | 246 ++++ vendor/doctrine/common/tests/README.markdown | 27 + 226 files changed, 20736 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 composer.json create mode 100644 composer.phar create mode 100644 config/application.config.php create mode 100644 config/autoload/.gitignore create mode 100644 config/autoload/README.md create mode 100644 config/autoload/global.php create mode 100644 config/autoload/local.php.dist create mode 100644 data/cache/.gitignore create mode 100644 init_autoloader.php create mode 100644 module/Application/Module.php create mode 100644 module/Application/config/module.config.php create mode 100644 module/Application/language/ar_SY.mo create mode 100644 module/Application/language/ar_SY.po create mode 100644 module/Application/language/cs_CZ.mo create mode 100644 module/Application/language/cs_CZ.po create mode 100644 module/Application/language/de_DE.mo create mode 100644 module/Application/language/de_DE.po create mode 100644 module/Application/language/en_US.mo create mode 100644 module/Application/language/en_US.po create mode 100644 module/Application/language/es_ES.mo create mode 100644 module/Application/language/es_ES.po create mode 100644 module/Application/language/fr_CA.mo create mode 100644 module/Application/language/fr_CA.po create mode 100644 module/Application/language/fr_FR.mo create mode 100644 module/Application/language/fr_FR.po create mode 100644 module/Application/language/it_IT.mo create mode 100644 module/Application/language/it_IT.po create mode 100644 module/Application/language/ja_JP.mo create mode 100644 module/Application/language/ja_JP.po create mode 100644 module/Application/language/nl_NL.mo create mode 100644 module/Application/language/nl_NL.po create mode 100644 module/Application/language/pl_PL.mo create mode 100644 module/Application/language/pl_PL.po create mode 100644 module/Application/language/tr_TR.mo create mode 100644 module/Application/language/tr_TR.po create mode 100644 module/Application/src/Application/Controller/IndexController.php create mode 100644 module/Application/view/application/index/index.phtml create mode 100644 module/Application/view/error/404.phtml create mode 100644 module/Application/view/error/index.phtml create mode 100644 module/Application/view/layout/layout.phtml create mode 100644 public/.htaccess create mode 100644 public/css/bootstrap-responsive.min.css create mode 100644 public/css/bootstrap.min.css create mode 100644 public/css/style.css create mode 100644 public/images/favicon.ico create mode 100644 public/images/zf2-logo.png create mode 100644 public/index.php create mode 100644 public/js/html5.js create mode 100644 public/js/jquery-1.7.2.min.js create mode 100644 vendor/.gitignore create mode 100644 vendor/README.md create mode 100644 vendor/doctrine/common/.gitignore create mode 100644 vendor/doctrine/common/.gitmodules create mode 100644 vendor/doctrine/common/.travis.yml create mode 100644 vendor/doctrine/common/LICENSE create mode 100644 vendor/doctrine/common/README.md create mode 100644 vendor/doctrine/common/UPGRADE_TO_2_1 create mode 100644 vendor/doctrine/common/UPGRADE_TO_2_2 create mode 100644 vendor/doctrine/common/build.properties create mode 100644 vendor/doctrine/common/build.xml create mode 100644 vendor/doctrine/common/composer.json create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/CommonException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Comparable.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventManager.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Lexer.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Version.php create mode 100644 vendor/doctrine/common/phpunit.xml.dist create mode 100644 vendor/doctrine/common/tests/.gitignore create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/CachedReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Autoload.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Route.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Secure.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetAll.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetPropertyMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithAttributes.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithTargetSyntaxError.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithVarType.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithAnnotationWithTargetSyntaxError.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithAnnotationWithVarType.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithFullyQualifiedUseStatements.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtProperty.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithValidAnnotationTarget.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Controller.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/EqualNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/EqualNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/GlobalNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/GlobalNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/InvalidAnnotationUsageButIgnoredClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/InvalidAnnotationUsageClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/MultipleClassesInFile.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/MultipleImportsInUseStatement.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespaceAndClassCommentedOut.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespaceWithClosureDeclaration.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespacedSingleClassLOC1000.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NonNamespacedClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/SingleClassLOC1000.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PerformanceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Test.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/CacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassB.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassC.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassD.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/CollectionTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/TestInit.php create mode 100644 vendor/doctrine/common/tests/NativePhpunitTask.php create mode 100644 vendor/doctrine/common/tests/README.markdown diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..ad907fa5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +nbproject +._* +.~lock.* +.buildpath +.DS_Store +.idea +.project +.settings +composer.lock diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..36e97601 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,27 @@ +Copyright (c) 2005-2012, Zend Technologies USA, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Zend Technologies USA, Inc. nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..4e7d164a --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +ZendSkeletonApplication +======================= + +Introduction +------------ +This is a simple, skeleton application using the ZF2 MVC layer and module +systems. This application is meant to be used as a starting place for those +looking to get their feet wet with ZF2. + + +Installation +------------ + +Using Composer (recommended) +---------------------------- +The recommended way to get a working copy of this project is to clone the repository +and use composer to install dependencies: + + cd my/project/dir + git clone git://github.com/zendframework/ZendSkeletonApplication.git + cd ZendSkeletonApplication + php composer.phar install + +Using Git submodules +-------------------- +Alternatively, you can install using native git submodules: + + git clone git://github.com/zendframework/ZendSkeletonApplication.git --recursive + +Virtual Host +------------ +Afterwards, set up a virtual host to point to the public/ directory of the +project and you should be ready to go! diff --git a/composer.json b/composer.json new file mode 100644 index 00000000..b70734ed --- /dev/null +++ b/composer.json @@ -0,0 +1,22 @@ +{ + "name": "zendframework/skeleton-application", + "description": "Skeleton Application for ZF2", + "license": "BSD-3-Clause", + "keywords": [ + "framework", + "zf2" + ], + "homepage": "http://framework.zend.com/", + "repositories": [ + { + "type": "composer", + "url": "http://packages.zendframework.com/" + } + ], + "require": { + "php": ">=5.3.3", + "zendframework/zendframework": "2.*", + "zendframework/zendservice-recaptcha": "2.*", + "doctrine/common": ">=2.1" + } +} diff --git a/composer.phar b/composer.phar new file mode 100644 index 0000000000000000000000000000000000000000..48edaa6149f3581df05a06f283f27ad50ff879de GIT binary patch literal 570295 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 literal 0 HcmV?d00001 diff --git a/config/application.config.php b/config/application.config.php new file mode 100644 index 00000000..6504dea7 --- /dev/null +++ b/config/application.config.php @@ -0,0 +1,15 @@ + array( + 'Application', + ), + 'module_listener_options' => array( + 'config_glob_paths' => array( + 'config/autoload/{,*.}{global,local}.php', + ), + 'module_paths' => array( + './module', + './vendor', + ), + ), +); diff --git a/config/autoload/.gitignore b/config/autoload/.gitignore new file mode 100644 index 00000000..1a83fda6 --- /dev/null +++ b/config/autoload/.gitignore @@ -0,0 +1,2 @@ +local.php +*.local.php diff --git a/config/autoload/README.md b/config/autoload/README.md new file mode 100644 index 00000000..4e504db0 --- /dev/null +++ b/config/autoload/README.md @@ -0,0 +1,8 @@ +About this directory: +===================== + +By default, this application is configured to load all configs in +`./config/autoload/{,*.}{global,local}.php`. Doing this provides a +location for a developer to drop in configuration override files provided by +modules, as well as cleanly provide individual, application-wide config files +for things like database connections, etc. diff --git a/config/autoload/global.php b/config/autoload/global.php new file mode 100644 index 00000000..1473720f --- /dev/null +++ b/config/autoload/global.php @@ -0,0 +1,16 @@ +add('Zend', $zf2Path . '/Zend'); + } else { + include $zf2Path . '/Zend/Loader/AutoloaderFactory.php'; + Zend\Loader\AutoloaderFactory::factory(array( + 'Zend\Loader\StandardAutoloader' => array( + 'autoregister_zf' => true + ) + )); + } +} + +if (!class_exists('Zend\Loader\AutoloaderFactory')) { + throw new RuntimeException('Unable to load ZF2. Run `php composer.phar install` or define a ZF2_PATH environment variable.'); +} diff --git a/module/Application/Module.php b/module/Application/Module.php new file mode 100644 index 00000000..86d9d4e2 --- /dev/null +++ b/module/Application/Module.php @@ -0,0 +1,39 @@ +getApplication()->getServiceManager()->get('translator'); + $eventManager = $e->getApplication()->getEventManager(); + $moduleRouteListener = new ModuleRouteListener(); + $moduleRouteListener->attach($eventManager); + } + + public function getConfig() + { + return include __DIR__ . '/config/module.config.php'; + } + + public function getAutoloaderConfig() + { + return array( + 'Zend\Loader\StandardAutoloader' => array( + 'namespaces' => array( + __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, + ), + ), + ); + } +} diff --git a/module/Application/config/module.config.php b/module/Application/config/module.config.php new file mode 100644 index 00000000..a6dd62b8 --- /dev/null +++ b/module/Application/config/module.config.php @@ -0,0 +1,91 @@ + array( + 'routes' => array( + 'home' => array( + 'type' => 'Zend\Mvc\Router\Http\Literal', + 'options' => array( + 'route' => '/', + 'defaults' => array( + 'controller' => 'Application\Controller\Index', + 'action' => 'index', + ), + ), + ), + // The following is a route to simplify getting started creating + // new controllers and actions without needing to create a new + // module. Simply drop new controllers in, and you can access them + // using the path /application/:controller/:action + 'application' => array( + 'type' => 'Literal', + 'options' => array( + 'route' => '/application', + 'defaults' => array( + '__NAMESPACE__' => 'Application\Controller', + 'controller' => 'Index', + 'action' => 'index', + ), + ), + 'may_terminate' => true, + 'child_routes' => array( + 'default' => array( + 'type' => 'Segment', + 'options' => array( + 'route' => '/[:controller[/:action]]', + 'constraints' => array( + 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', + 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', + ), + 'defaults' => array( + ), + ), + ), + ), + ), + ), + ), + 'service_manager' => array( + 'factories' => array( + 'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory', + ), + ), + 'translator' => array( + 'locale' => 'en_US', + 'translation_file_patterns' => array( + array( + 'type' => 'gettext', + 'base_dir' => __DIR__ . '/../language', + 'pattern' => '%s.mo', + ), + ), + ), + 'controllers' => array( + 'invokables' => array( + 'Application\Controller\Index' => 'Application\Controller\IndexController' + ), + ), + 'view_manager' => array( + 'display_not_found_reason' => true, + 'display_exceptions' => true, + 'doctype' => 'HTML5', + 'not_found_template' => 'error/404', + 'exception_template' => 'error/index', + 'template_map' => array( + 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', + 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', + 'error/404' => __DIR__ . '/../view/error/404.phtml', + 'error/index' => __DIR__ . '/../view/error/index.phtml', + ), + 'template_path_stack' => array( + __DIR__ . '/../view', + ), + ), +); diff --git a/module/Application/language/ar_SY.mo b/module/Application/language/ar_SY.mo new file mode 100644 index 0000000000000000000000000000000000000000..fa7ae166939da5c016a79122da666e4ff85e3cf8 GIT binary patch literal 5526 zcmb7|%X1u86~-?l1dzik51s+80fkWU46^K$!#F0$mJ}Q8pt8mZ32b_1u4X#w>7MjM ziYSUIzhp%eVFQ0aFp9=1+p@47$0-)D;jw{Y0oA?9jtx~TS+D_q=XTFS!XYrFo-^I| z+;hHj&Ueo3(p&f4{S(DUb3G*2yOerVhL))ZdT~ zAxGr?Zlykqd=UA5PLLt4~8Ej-^+dXJ-Od& z$PaS=8>HC#Gg5H<6}b!fFQj7Mu6vXk=jXj_K7o7^Sw{X4`2_M8$gd#(ffWDy-j~~- zMV?~+3rO+vOThn=`#&J}bN_psXyje@D)l+!7m$MEDY-}Q+sF@b|NRf-daocQKbuI& z>#vYNQ*RaPe?dx~@4=bi7)O2@c@p_2>~)a*scDiaeoi69j*Aq%Wu(OaGvvpRw~>e0 z_ebQD+&@5)Uqn`slgM8qzmD96vFDJ_ARj?qLrT6fT){cp$t{6MFyHer>`q2z5}eCt+wBYNF9_V>j>}PrLqH5Vjq;Qxl%2L$}$A zBORK^gbSuoRulft-A4ky89H&|*je`= zK*d~HS6gnRqn^dO<7U3SGY*siIQqImZ0L$sT)-#hI-I$C%zlQ>PQO_ z#V$sNlI;vBMQ&`9HpIu!5R)4R;gSuoDV@P@A*67ooij>EZFDCLUNH4oeDy=2P<@8v zNq!=v6}p$5HzM4D~q7J-nr(9WHmj*N!@$dm+hlGb5u&xt6qIe#{`8%j5z9@;$-X@!d!hBghOR*i_8Z{8L?fN7%Mu$AdE_qvQkt91* z#e38EhFK_s@>%0S6Kk4bw|#7lk48$$JTwOM42|u0YNw_YH1Qiu8K*8y(&LznjMp}yAjy2;C*+ci!Q7miFKrKC z(bO#4m@y0x2)f`lOa!C+dGeCCr&t?}7TtMwG}^;2KO3&mcNX1UzUh@wfMwUm?B&OSu`v`&CmAzxOzqS=p!e>pJofmbWBbrM?nH5^8ajSN1VLEQ zRcCR|%Hp$B0@sk+nwd2C*azufVd3kNlA6GkRJbgDXCdVHWKz~)R?n)2&`%<_tU zyynIu-zv=nhPQ{(H_Q@)un`>xD+Y@=%s`=sv!bW`CZne{SUM6UOoXM1KK1mm>eQs3 ztxi;@W(VtsIVx!ARz;Tw4`(@n>a7_bm&RBqkIZ;U=y)ZL({@zRe#hQMhsF=;{O6%Z z{N0E4e(B(dO0T3hvvWGVn%+t;+TPux)Aj5ePfxRUNvCgStLc``&Sxv>Wv4rk{JPNmSQ&+MxteinRy^@{A#v9n!?pXF|m2PAgaK48#?W>z6`L{vwuK8yE%CCQ*_46>AD4*RgP0*i@|d`6kL+>1(9!Iu}G)vsI9k zOGP(`L#Sts3VBzAzPZDmlhZ;Wsn3eu<|!`#rDT(kS||kFyJSQtAmA<+0e3~{u-t=Z$+1ifbOtE;rn%qIJEZtJ@d`tV-n(d%{OTZEEUwcqZ}3eDieQBa zIG{dIMzXe%US=aK<$-uCQr)i))+Hr(ig!(_DPD!cd5x&9FbHQwCRbop(a{6Mc}fM! z8I)fmx&n;wjXGH{qtSo7om#+K!U73gNr1ExBSuPVDGLYtMUW&C>w4Zo^1f>K2{&)y z_SHOop;Q+fm+t)LS_H)WkdVZ0;YZNZhOA4i>`K2|Gyy=|A&w2`!(+ypY_Xk7VzUb} z26`hwI@C@S#;0W>otnOmM!K`@w#^zg-5_}@Id6)o+pGGvcirtXst*UqS8c7pBCP1q zT_VFcgOKkW(<-bY&C)G7tA@(hr_eUIMdFG{)y=1deJF#Wo8Gbs#KA3`t)$(-0a6Sq zAZ=zZ7g}gs&Mw&UlW9EK!3v27c6y_(K;Jjph0LqNJSS2+6oEmL*jTN3duC|@l}D?5 z{~&us71rL)cyZ_nr#EH%4O)(5T(*H0gNsQ2Pa^{Z0z&eXcDHAMVL?G;5!1GZI0U71 z>-m9HoY|s~Pj~r8hV8^`aAa9-ZZKUhW*1Q89P3JR%NZo6=k}Lac?)M, 2012. +# Tawfek Daghistani , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-07 13:58+0300\n" +"Last-Translator: Tawfek Daghistani \n" +"Language-Team: Arabic <>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: English\n" +"X-Poedit-Country: UNITED STATES\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +#: ../view/layout/layout.phtml:6 ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "الصفحة الرئيسية" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "جميع الحقوق محفوظة" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "أهلا بك في %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "" +"Congratulations! You have successfully installed the %sZF2 Skeleton " +"Application%s. You are currently running Zend Framework version %s. This " +"skeleton can serve as a simple starting point for you to begin building your " +"application on ZF2." +msgstr "" +"تهانينا! لقد قمت بتنصيب %sZF2 Skeleton Application%s . أنت الآن تستخدم مكتبة " +"زيند الإصدار %s . هذا التطبيق يمكن أن يكون لك نقطة بداية سهلة في بناء " +"برامجك الخاصة على مكتبة زيند " + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "اشتق مكتبة زيند على GitHub " + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "تابع أخر التطورات" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "" +"Zend Framework 2 is under active development. If you are interested in " +"following the development of ZF2, there is a special ZF2 portal on the " +"official Zend Framework website which provides links to the ZF2 %swiki%s, " +"%sdev blog%s, %sissue tracker%s, and much more. This is a great resource for " +"staying up to date with the latest developments!" +msgstr "" +"مكتبة زيند تخضع للتطوير المستمر , إذا كان لديك الرغبة في متابعة التطورات , " +"بإمكانك تصفح الموقع الرسمي للمكتبة الذي يحتوي على روابط إلى %swiki%s, %sdev " +"blog%s, %sissue tracker%s, ,و المزيد . هذه مصادر رائعة لمتابعة أخر التطورات" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "بوابة التطوير الخاصة ب زيند" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "تعرف على الإضافات" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "" +"The community is working on developing a community site to serve as a " +"repository and gallery for ZF2 modules. The project is available %son GitHub" +"%s. The site is currently live and currently contains a list of some of the " +"modules already available for ZF2." +msgstr "" +"المجتمع البرمجي يعمل على تطوير موقع خاص به ليكون كمصدر و معرض لإضافات ZF2 . " +"هذا المشروع موجود على %son GitHub%s . هذا الموقع يخضع للتطوير المستمر و " +"يحتوي على قائمة من الإضافات الخاصة ب ZF2 " + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "إكتشف إضافات ZF2 " + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "الدعم و المساعدة " + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "" +"If you need any help or support while developing with ZF2, you may reach us " +"via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or " +"feedback you may have regarding the beta releases. Alternatively, you may " +"subscribe and post questions to the %smailing lists%s." +msgstr "" +"إذا كنت تريد الحصول على دعم فني أو مساعدة في تطوير ZF2 , بإمكانك التواصل عبر " +"IRC: %s#zftalk.2 on Freenode%s. نحن نريد أن نسمع منك المزيد من الأسئلة , " +"الأراء و الملاحظات على النسخة التجربية من المكتبة , أو بإمكانك الإشتراك و " +"التفاعل أو وضع الأسئلة في القائمة البريدية %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "تواصل معنا في IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "حصل خطأ ما " + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "مزيد من المعلومات" + +#: ../view/error/index.phtml:11 ../view/error/index.phtml:35 +msgid "File" +msgstr "ملف" + +#: ../view/error/index.phtml:15 ../view/error/index.phtml:39 +msgid "Message" +msgstr "الرسالة" + +#: ../view/error/index.phtml:19 ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "تفاصيل الخطأ" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "الأخطاء السابقة" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "لايوجد خطأ" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "حصل خطأ 404 , الصفحة غير موجودة" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "المتحكم المطلوب غير قادر على إجابة الطلب" + +#: ../view/error/404.phtml:13 +msgid "" +"The requested controller could not be mapped to an existing controller class." +msgstr "لا يمكن ربط المتحكم المطلوب بأي من المتحكمات الموجودة حالياًَ" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "المتحكم المطلوب غير قادر على الإجابة " + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "الرابط المطلوب غير معرف لدى الموجه" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "لا يمكنني التحديد لماذا حصل الخطأ 404 في هذا الوقت " + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "المتحكم " + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "يوصل إلى %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "خطأ برمجي" diff --git a/module/Application/language/cs_CZ.mo b/module/Application/language/cs_CZ.mo new file mode 100644 index 0000000000000000000000000000000000000000..46f2c0f637a83e5aea25000e19c7016663ff5d98 GIT binary patch literal 5005 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 QV;@(@2=$5oVl3(S4+(UTng9R* literal 0 HcmV?d00001 diff --git a/module/Application/language/cs_CZ.po b/module/Application/language/cs_CZ.po new file mode 100644 index 00000000..2485e2d6 --- /dev/null +++ b/module/Application/language/cs_CZ.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-06 13:05+0100\n" +"Last-Translator: David Lukas \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Czech\n" +"X-Poedit-Country: CZECH REPUBLIC\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton aplikace" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Úvod" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Všechna práva vyhrazena." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Vítejte v %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Blahopřejeme! Úspěšně jste nainstalovali %sZF2 Skeleton Application%s. Právě používáte Zend Framework verze %s. Tato kostra aplikace vám poslouží jako jednoduchý výchozí bod, ze kterého můžete vyjít při tvorbě vlastní aplikace nad ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 na GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Sledujte vývoj" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 je aktivně vyvíjen. Chcete-li sledovat vývoj ZF2, máte na oficiálních webových stránkách Zend Framework k dispozici zvláštní portál ZF2, na kterém najdete odkazy na ZF2 %swiki%s, %svývojářský blog%s, %sissue tracker%s a mnoho dalšího. Tento portál je skvělý zdroj aktuálních informací o nejnovějším vývoji!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Vývojářský portál ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Objevte Moduly" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Komunita pracuje na vývoji komunitního webu, který bude sloužit jako archiv a galerie modulů ZF2. Tento projekt je dostupný %sna GitHub%s. Web je aktuálně v provozu a obsahuje seznam některých již dostupných modulů ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Prozkoumejte Moduly ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Pomoc & Podpora" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Budete-li při vývoji se ZF2 potřebovat jakoukoli pomoc nebo podporu, můžete nás zastihnout přes IRC: %s#zftalk.2 na Freenode%s. Budeme rádi za jakékoli vaše otázky nebo připomínky týkající se beta verzí. Případně se také můžete přihlásit k odběru a posílat otázky na naše %se-mailové distribuční seznamy%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Ozvěte se nám na IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Vyskytla se chyba" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Další informace" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Soubor" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Zpráva" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Trasování zásobníku (Stack trace)" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Předchozí výjimky" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Žádná výjimka není k dispozici" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Vyskytla se chyba 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Požadovaný controller nemohl vyřídit požadavek." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Požadovaný controller se nepodařilo namapovat na žádnou existující třídu controlleru." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Požadovaný controller nepodporuje vyřízení (controller not dispatchable)." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "S požadovaným URL nebyla při směrování (routing) nalezena shoda." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Momentálně nedokážeme určit, proč byla vygenerována chyba 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "je mapován na %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Výjimka" + diff --git a/module/Application/language/de_DE.mo b/module/Application/language/de_DE.mo new file mode 100644 index 0000000000000000000000000000000000000000..fcea0366faf48b28a5e7b083f717dc36c6dda9c4 GIT binary patch literal 5126 zcma)3*uf4mr6|b{+*LLC)HQhBcmFejo zs;XzatB4a42M!=15C;Sj%00lr;$U$Zi4zClP7rsH5H}7;{9bj>&UlFvTD$Y6yQ|*c z?|t>=?Gwj-oNztQ|7ZDs`h7|ACFJq<^TG8i@|R5bIEfE$AV0+Y4?kGj{VDP( z?%zU+zTY7~g8VZwVg1|4Rlff9i6q%Zo?vqu`7PuHzG6B0r7%0#aOD zLw*u@38|2GkP^oPDf_>Vd;@(yLE>U^@?-V7=aA2Fe*r0Zd$o}Rl$yDeYb=u$CT2;FPlbcW$YJD`yZ5kDv_U))a zJENk1MPRq9iozB>bs!{ zvUxu>qnNtQ`=h)h010yTcFX1_*|M3tTGdIenS7+q z=;7!kwOfrwr3=Zma%ht4-ROH^NU1LNRbSQ-kgpf1NgsnMt1U@P6C3*C(Q@23)MVA@ zw67|!##XEAx2~*_$S)prsnehxUD$HQ6lG>4zjw_GnaT-R($zPb{9yIlmGKg?7t>vQ z>F9KDXduGCnVxnrt5W%n2^zz>(cYkSJrBkeRGx(F&pq>1$EVJA3`R1l<->v{?AI6? zYMV=Bx%I*0W3mn0bk8I=OLbTbrN=DO9kRb8iwT$H5^b{M%-ELPn_1y}vKz$z;B;z| zJ={&p;jk)f0Ki@e=0pYi7xJnX7I_Q|TQ`Wb$}?4zfjTO9BJJ~{1Cq*0`s(NwaiQ*(qdP|f6a(imi*N)PTvMEl6l! z4S5chyiNKfDe|XS@0r3td%}r#O%6<=YIyBYhFU%C6DjjT$EzKBSm(*nl~T~E$RHG* zNnbgAb;*wAaUjdhF zEW2G>zj`!)iRnbNK__qp03F-Rco0<#$V=UcqV2Sw*nvImm-&Vhs*{(!`p$Y^ksMlT zV4OUXmL67U8^VzdaYyfZATh{c1N){X;t-}8YvpULl^50OSJuwG$oG{M7PfA|C~_hlUH4VBa(?aX`FhB191 z>DJWdm^QdV(EIAb&|EUy(r9kK4XnPgbVC=t3RY|F89l`NEtb+&wo|d$s|yF+76}i$ zymUbA9^Hih+t;@@=fR(CuPn)a0Mgpq9}!G2_rsS*IaKkIqLZ9A;o|MRt=9SZI`Oq@ zTx%1*gvr;``Hl@sueNqd!|c#{+3drOnZH3Nqp%6h%okjS?P=8hnrhD<&H`IgSLruh z%-@g;BHZW2=B@4Zo3G8^>~ip={T)=bR#4VnN;WAqji?O0Aj8d;=|iweSKZ`Z<)?3k z14awba{bZK#;98+?E|NA={lybIfsgNvWb#Lflww&dL}sdpx_*KwI)vHeEKjQOsc}C z{Zne!8s?pj;ZWe)yG=HXPIN0MmsV;9B5PcbwuexQDo{X}#p#SrMp*+{l!9`9WJ=)l z+^`I0UeY&xh`R&$OI`05DABoB1Ou^}o*z}kAS|oy^r7Q5Tre>lAjr)kOl&&HtD?88 zI@;rmbU$HZZ+OI>VsgMKv_CQip(8W2b`cX%Pdmwa;VxRPBMk%~osuEnLVn_dKgQ|n~AW9(6zYG{Q> z{x@VP%k)98(EYL+$cZ{2rDQ2;2LUQ8DJJ0S$}BZ~*ddsV^Wi7GfLp9+q0m^)ZOl_bd_9;xjFHCpF3YIZK&a6%eSp%% zsY?x}4+;T{pg3x*L40Ji!eYq;9s?J!Mzf7?8KlW%ZJ297#P<}*zjQ~kiH zBBvjWDzgRF-NK?>S+WfNbD;!jlB*iFKv8UtIY1-QId+>4i^s@72D3mj&Y?(S&O?f; znUgyahH)+4V$rKt3Jy#Y`yAi;(>L=-SVjqBGD(3xxP+q^ZPN!`3LONng5tViIOnB% z1zAVuhIXWC*z z{JHapDoN?#WcPB;tY&~{&tSTs0{@RX$z&lR3fs7<3nbp%{)Ar~^#(Xvn&1YV5m|D* z=t`GJlaRg!2SjtPlGi?VwGEL3V^LsCX}Mb2aQdL`7j2Xdu=5|GoCSZz1id-QZ3S325l6x zfl%lh9D(^r)QgLxl=\n" +"Language-Team: ZF Contributors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Startseite" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Alle Rechte vorbehalten." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Willkommen zu dem %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Herzlichen Glückwunsch! Sie haben die %sZF2 Skeleton Application%s erfolgreich installiert und benutzen gerade die Version %s des Zend Frameworks. Dieses Gerüst kann Ihnen als Einstiegspunkt, für Ihre weitere Entwicklung, basierend auf dem Zend Framework 2, dienen." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 auf GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Folge der Entwicklung" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Das Zend Framework 2 wird z.Z. aktiv weiterentwickelt. Sollten Sie daran interessiert sein, die Entwicklung von ZF2 zu verfolgen, so bietet Ihnen die offizielle Webseite einen eigens für das Zend Framework 2 eingerichteten Bereich, auf der Sie Verlinkungen zum ZF2 %sWiki%s, %sEntwickler Blog%s, einem %sFehlerverfolgungssystem%s und noch vielem mehr finden. Dieser Bereich ist eine hervorragende Quelle um stets aktuell zu bleiben." + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Entwickler Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Entdecken Sie Module" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Die Community arbeitet momentan an einer Community Seite, welche als Galerie für ZF2 Module dient. Dieses Projekt ist %sauf GitHub%s verfügbar. Die Webseite ist bereits Online und enthält eine Liste mit schon veröffentlichten Modulen für das Zend Framework 2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Erkunden Sie ZF2 Module" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Hilfe & Support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Sollten Sie Hilfe jeglicher Art bei der Entwicklung mit dem Zend Framework 2 benötigen, kontaktieren Sie uns doch einfach über das IRC: %s#zftalk.2 on Freenode%s. Wir freuen uns darauf, Ihnen bei Ihren Fragen zu helfen oder aber auch Ihre Meinung bezüglich der Beta Versionen zu hören. Alternativ können Sie auch die %smailing lists%s abonnieren und Ihre Fragen dort stellen." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Schreiben Sie uns im IRC an" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Ein Fehler ist aufgetreten" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Zusätzliche Information" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Datei" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Meldung" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stapelüberwachung" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Vorherige Ausnahme" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Es ist keine Ausnahme verfügbar" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Es trat ein 404 Fehler auf" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Der angeforderte Controller war nicht in der Lage die Anfrage zu verarbeiten." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Der angeforderte Controller konnte keiner Controller Klasse zugeordnet werden." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Der angeforderte Controller ist nicht aufrufbar." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Für die angeforderte URL konnte keine Übereinstimmung gefunden werden." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Zu diesem Zeitpunkt ist es uns nicht möglich zu bestimmen, warum ein 404 Fehler aufgetreten ist." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "wird aufgelöst in %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Ausnahme" + diff --git a/module/Application/language/en_US.mo b/module/Application/language/en_US.mo new file mode 100644 index 0000000000000000000000000000000000000000..972a28ab34c2f0d90cabf56f0d021c5f205bbc09 GIT binary patch literal 545 zcmaJ+O;5r=5XI=JN6#Mi;L*WCV!(=quaXc!i4ehb)vOfK!O`$uD#=6e|OmacsLHr?6s=z73-+k!ZznDgs*g(XHw}45ig~6 zNSCu{0L@ZYSY4onkZmPOr-5kB6?qRZF_\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: English\n" +"X-Poedit-Country: UNITED STATES\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "" + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "" + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "" + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "" + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "" + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "" + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "" + diff --git a/module/Application/language/es_ES.mo b/module/Application/language/es_ES.mo new file mode 100644 index 0000000000000000000000000000000000000000..3728554767333faa67772174898cf3de1d245970 GIT binary patch literal 5063 zcmai&&5s;M8OAG+@UaO55=@*)yz{h}at&GPZZ|3a_*Bt}$2$siwPjro25} z?XK=w&x!+QB*X>&fJh*bgQZB303jq0djJjyP8@TMgv5~pT;TUs_k8SPk&$QLsp+cs z`+e#ezx~vsKT*6i@8{(Gh*D=nzK1`&{)qe-@=wT*Bj0Y<|3rS2_0oHl`Umnk6?8-$U|G{fIwLCLWcjV*9{~#6T9)F)wt9*Qd!&}I&A-l*QA}=C;gS>$J7gFqh`2&sq9po*} z-$ja@-{Jf_tp9@i1nXa7MB@J|^3%w7kYfL_CzSd(@>!(Bf9gX`UNlnHt4PV~B_t-* z9i*J=BhMlakP^>Nk+`mYg?tUWzeURaC!bVm8TkzI6!H>M{Mc#NcahJt{yy?W&ixE2 zasHVi>>!sY(i!A;k>`;=Kwd%~AwP$Fgkp$)&m$|&_mEP*U*Hr=MVX@?h?p;t518Et&aZX6{pKO&s{#ycWj>Ojna(lfiL&<*p>lTQPBEzG~l$Gcyyvr+1ta^gCmDhbcaJlZ+E=%P(-CI_^vV9VY$jZiOSEdc zv}5O4+iBr~dRR-Uol1hLN|RW%OALu0jq2Q0bal|uh@uyz3&}PMn}Vxi(iZx$w8Z2p zUru6x1DOmyOG8S}jGB&;rnb5${au?>Vrv!(g_?Cp)BH5Im|@d=YBI7K_0PXb=wHJu zG82+D?e}z`n?y=ZTf^F9^hSzv)7(v6>&66>HrAcayLIzAk=9wNb6-(h4R|C&9`tE1 zU(2waJR&YMBXsg)Q3yPET&5&=Cuv>WotZ$9B`0$S7M>q4>f%M}LLpvA&EI8voy#V% zIXx89(5mmM+Z5a6QK_X-M=mF!6?@2Y<;dH?kR(M=73%|=Td+`o^0v)rlc*Z7I}Tf` z%Rxz*7hphdGuS3mCwEFg>pTTzOd>-v?JbEaM(($piRx^ooo_Zb$XZ0;>F_UHM@u)E)UxVq zg@H>um+L|3?D{pmwEfy{=Zbg+_I0jeb4{AWeb-H>I=iLG0}=RgP4`lt?RnkfW*X>=Ca#PuUL6STb?L6JE?qbIpa$_e zyVi^dVnbh%>2m!V9YJ3_-0P6{iifWrQo`oY*5=mwJn(bfl_fbub98nm1%Xude)Xjy z114V4Oi>wZb?MgbM(6x|pZK|F%g%b9c!BmceZKFinL8xtTb*rh;T4^4*a;AshU*M8 zy4wite8XjK0_JtNrn~bmr-7~Mox2YB{YS*WpF6Pa^*<{FvhWU{F@K9~)_pfhQ zsEgxJfRSIUxg0>cO+d4S-3?IF0+PE@~@aN9ttMOqmncLkSeVEfT03 z?BkH(0xpjpkPl0674)NkAyF7?W2iRSz1s0)My60UV}07oO?Ncm zHPPt;N~gboXH#PKMRh%LE_hjL(x!@nHhpt9R5{gSN9G0Rmnq4cw`NxZSS<{-v`(%P zS|iL*a=v?N<7~s3rAekN&W4uRE!4jq!Fk{Lmf}4GUU6RVC=xun&*p#*^=N_N_Ke!G zkICkKdopwAcf0Seg)yR`Y-=!Naz3n literal 0 HcmV?d00001 diff --git a/module/Application/language/es_ES.po b/module/Application/language/es_ES.po new file mode 100644 index 00000000..5170d3ce --- /dev/null +++ b/module/Application/language/es_ES.po @@ -0,0 +1,111 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-06 19:07+0100\n" +"PO-Revision-Date: 2012-07-06 19:09+0100\n" +"Last-Translator: Adolfo Abegg \n" +"Language-Team: ZF Contributors \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: Spanish\n" +"X-Poedit-Country: SPAIN\n" +"X-Poedit-SearchPath-0: ..\n" + +msgid "Skeleton Application" +msgstr "Aplicación Esqueleto" + +msgid "Home" +msgstr "Inicio" + +msgid "All rights reserved." +msgstr "Todos los derechos reservados" + +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenido al %sZend Framework 2%s" + +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "¡Felicitaciones! Haz instalado correctamente el %sla aplicación esqueleto del ZF2%s. Estás corriendo la versión %s del Zend Framework. Este esqueleto te servirá como un punto de inicio sencillo para empezar a construir tu aplicación con el ZF2." + +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Hacer un Fork del Zend Framework 2 en GitHub" + +msgid "Follow Development" +msgstr "Seguir el Desarrollo" + +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "El Zend Framework 2 está en pleno desarrollo. Si estás interesado en seguir el desarrollo del ZF2, existe un portal especial para el ZF2 en el sitio web oficial del Zend Framework el cual provee enlaces %sa la Wiki%s, %sal Blog de desarrollo%s, %sal issue tracker%s y mucho más. Este es un gran recurso para mantenerte al día con los últimos avances en el desarrollo!" + +msgid "ZF2 Development Portal" +msgstr "Portal de Desarrollo del ZF2" + +msgid "Discover Modules" +msgstr "Descubre Módulos" + +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La comunidad está trabajando en el desarrollo de una web comunitaria que servirá de repositorio y galería de los módulos del ZF2. El proyecto está disponible %sen GitHub%s. El sitio web está en línea y actualmente posee una lista de algunos módulos que ya están disponibles para el ZF2." + +msgid "Explore ZF2 Modules" +msgstr "Explora los módulos del ZF2" + +msgid "Help & Support" +msgstr "Ayuda & Soporte" + +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si necesitas alguna ayuda o soporte mientras estás desarrollando con el ZF2, puedes encontrarnos via IRC: %s#zftalk.2 en Freenode%s. Nos encantaría leer tus preguntas o cualquier feedback que puedas tener en relación a los lanzamientos de las versiones beta. También puedes subscribirte y enviar preguntas %sa la lista de correos%s" + +msgid "Ping us on IRC" +msgstr "Escríbenos en el IRC" + +msgid "An error occurred" +msgstr "Ha ocurrido un error" + +msgid "Additional information" +msgstr "Información adicional" + +msgid "File" +msgstr "Archivo" + +msgid "Message" +msgstr "Mensaje" + +msgid "Stack trace" +msgstr "Seguimiento de la pila (stack trace)" + +msgid "Previous exceptions" +msgstr "Excepciones anteriores" + +msgid "No Exception available" +msgstr "No hay ninguna Excepción disponible." + +msgid "A 404 error occurred" +msgstr "Ha ocurrido un error 404" + +msgid "The requested controller was unable to dispatch the request." +msgstr "El controlador solicitado no pudo ejecutar la petición." + +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "El controlador solicitado no se pudo mapear con una clase de controlador existente." + +msgid "The requested controller was not dispatchable." +msgstr "El controlador solicitado no es ejecutable." + +msgid "The requested URL could not be matched by routing." +msgstr "El ruteador no ha encontrado la ruta para la URL solicitada." + +msgid "We cannot determine at this time why a 404 was generated." +msgstr "No pudimos determinar por qué un error 404 ha sido generado." + +msgid "Controller" +msgstr "Controller" + +msgid "resolves to %s" +msgstr "se resuelve a %s" + +msgid "Exception" +msgstr "Excepción" + diff --git a/module/Application/language/fr_CA.mo b/module/Application/language/fr_CA.mo new file mode 100644 index 0000000000000000000000000000000000000000..956a0d9d90577e1c8366e18ddc2efc7397c014ef GIT binary patch literal 5074 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\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: CANADA\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Une erreur 404 est survenue" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Le contrôleur demandé n'a pas pu acheminer la requête." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Le contrôleur demandé ne correspond pas à une classe contrôleur existante." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Le contrôleur demandé ne peut être acheminé." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "L'URL demandée n'a pas pu trouver de route correspondante." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nous ne pouvons pas déterminer pour le moment pourquoi une 404 a été générée." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Contrôleur" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "résout en %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exception" + +#: ../view/error/404.phtml:55 +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +msgid "Stack trace" +msgstr "Pile d'exécution" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Une erreur est survenue" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informations complémentaires" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Fichier" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Message" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Exceptions précédentes" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Aucune exception disponible" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenue dans %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Félicitations ! Vous avez installé %sZF2 Skeleton Application%s avec succès. Vous utilisez actuellement Zend Framework version %s. Cette structure peut vous servir comme point de départ simple pour démarrer la construction de votre application avec ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Faites un Fork de Zend Framework 2 sur GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Suivre le développement" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 est en cours de développement. Si vous êtes intéressé pour suivre l'évolution de ZF2, il existe un portail dédié à ZF2 sur le site officiel Zend Framework qui propose des liens vers le %swiki%s ZF2, le %sblogue de dev%s, le %ssuivi des problèmes%s, et bien plus encore. Il s'agit d'une excellente ressource pour rester à jour sur les dernières évolutions !" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portail sur le développement de ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Découvrez les modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La communauté travaille sur le développement d'un site communautaire avec l'objectif de servir de dépôt et de galerie pour les modules ZF2. Le projet est disponible %ssur GitHub%s. Le site est déjà en ligne, et contient une liste non exhaustive des modules déjà disponibles pour ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Explorer les modules ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aide & support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si vous avez besoin d'aide ou de soutient en développant avec ZF2, vous pouvez nous joindre sur IRC : %s#zftalk.2 sur Freenode%s. Nous aimerions connaître vos questions ou les commentaires que vous pourriez avoir au sujet des versions beta. Sinon, vous pouvez vous abonner, et poser des questions sur la %sliste de diffusion%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Rejoignez-nous sur IRC" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Accueil" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tous droits réservés." + diff --git a/module/Application/language/fr_FR.mo b/module/Application/language/fr_FR.mo new file mode 100644 index 0000000000000000000000000000000000000000..28f1932ad37233a88a93cdd0dc86a9c817716d66 GIT binary patch literal 5077 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 literal 0 HcmV?d00001 diff --git a/module/Application/language/fr_FR.po b/module/Application/language/fr_FR.po new file mode 100644 index 00000000..49f89d92 --- /dev/null +++ b/module/Application/language/fr_FR.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:32-0700\n" +"PO-Revision-Date: 2012-07-05 23:36-0700\n" +"Last-Translator: Evan Coury \n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: FRANCE\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Skeleton Application" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Accueil" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tous droits réservés." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Bienvenue dans le %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Félicitations ! Vous avez installé avec succès le %sZF2 Skeleton Application%s. Vous utilisez actuellement Zend Framework version %s. Cette structure peut vous servir comme un point de départ simple pour démarrer la construction de votre application avec ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Faites un Fork de Zend Framework 2 sur GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Suivre le développement" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 est en cours de développement. Si vous êtes intéressé pour suivre l'évolution de ZF2, il existe un portail dédié à ZF2 sur le site officiel Zend Framework qui propose des liens vers le %swiki%s ZF2, %sdev blog%s, %ssuivi des problèmes%s, et bien plus encore. Il s'agit d'une excellente ressource pour rester à jour sur les dernières évolutions !" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portail sur le développement de ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Découvrez les modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La communauté travaille sur le développement d'un site communautaire avec l'objectif de servir de dépôt et de galerie pour les modules ZF2. Le projet est disponible %ssur GitHub%s. Le site est déjà en ligne, et contient une liste non exhaustive des modules déjà disponibles pour ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Explorer les modules ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aide & support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Si vous avez besoin d'aide ou de support en développant avec ZF2, vous pouvez nous joindre sur IRC : %s#zftalk.2 sur Freenode%s. Nous aimerions avoir vos questions ou vos commentaires que vous pourriez avoir au sujet des versions bêta. Sinon, vous pouvez vous abonner, et poser des questions sur la %sliste de diffusion%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Rejoignez-nous sur IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Une erreur est survenue" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informations complémentaires" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Fichier" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Message" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Pile d'exécution" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Exceptions précédentes" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Aucune exception disponible" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Une erreur 404 est survenue" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Le contrôleur demandé n'a pas pu dispatcher la requête." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Le contrôleur demandé ne correspond pas à une classe existante de contrôleur." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Le contrôleur demandé n'est pas dispatchable." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "L'URL demandée n'a pas pu trouver de route correspondante." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nous ne pouvons pas déterminer pour le moment pourquoi une 404 a été générée." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Contrôleur" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "résout en %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exception" + diff --git a/module/Application/language/it_IT.mo b/module/Application/language/it_IT.mo new file mode 100644 index 0000000000000000000000000000000000000000..3656ac349512a2f60b0ea2ad8658554c27c13cdf GIT binary patch literal 4922 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\n" +"Language-Team: ZF Contributors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,-1,5,-1,-1,-1\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Pagina iniziale" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tutti i diritti sono riservati." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Benvenuto in %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Congratulazioni! Hai appena installato con successo %sZF2 Skeleton Application%s e stai utilizzando la versione %s di Zend Framework. Questa struttura può servirti come semplice punto di riferimento per iniziare a costruire un'applicazione basata su ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Crea un fork di Zend Framework 2 su GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Segui lo sviluppo" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 è in forte sviluppo. Se sei interessato a seguire lo sviluppo di ZF2, è presente un portale che fornisce link al %swiki%s, al %sdev blog%s, all'%sissue tracker%s e a molto altro riguardo a ZF2. Il Portale è un'ottima risorsa per rimanere aggiornati con gli ultimi sviluppi!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "Portale sullo sviluppo di ZF2" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Scopri i Moduli" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "La community sta lavorando allo sviluppo di un sito che deve servire come raccolta e gallery di Moduli per ZF2. Il progetto è disponibile %son Github%s. Il sito è visitabile e al momento contiene una lista di alcuni dei Moduli già disponibili per ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Esplora i Moduli di ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Aiuto & Supporto" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Qualora ti servisse aiuto o supporto mentre sviluppi con ZF2, puoi contattarci tramite IRC: %s#zftalk.2 on Freenode%s. Ci piacerebbe moltissimo ricevere le tue domande o qualunque feedback tu possa avere riguardo alle beta release. In alternativa, puoi iscriverti e inviare domande alla %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Contattaci su IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Si è verificato un errore" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Informazioni aggiuntive" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "File" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Messaggio" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Eccezioni precedenti" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Non è disponibile alcuna eccezione" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Si è verificato un errore 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Il controller richiesto non è stato in grado di elaborare la richiesta." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Non è stato possibile mappare il controller richiesto ad una classe di tipo controller." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Il controller richiesto non è un oggetto dispatchable." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Non è stato possibile effettuare il match dell'indirizzo richiesto tramite routing." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "In questo momento non siamo in grado di determinare perchè sia stato generato un 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "viene risolto in %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Eccezione" + diff --git a/module/Application/language/ja_JP.mo b/module/Application/language/ja_JP.mo new file mode 100644 index 0000000000000000000000000000000000000000..66b6f3ccb4213eae7758f2b6cd6bfb94f6f23a06 GIT binary patch literal 5185 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 literal 0 HcmV?d00001 diff --git a/module/Application/language/ja_JP.po b/module/Application/language/ja_JP.po new file mode 100644 index 00000000..d6a953ee --- /dev/null +++ b/module/Application/language/ja_JP.po @@ -0,0 +1,140 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 19:30-0700\n" +"PO-Revision-Date: 2012-07-15 08:20+0900\n" +"Last-Translator: sasezaki \n" +"Language-Team: Japanese\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Japanese\n" +"X-Poedit-Country: Japan\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "%sZend Framework 2%s へようこそ" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "おめでとうございます! %sZF2 Skeleton Application%s のインストールに成功しました。 あなたは Zend Framework version %s を動作させています。このスケルトンはZF2上でのアプリケーション構築を始めるためにシンプルなスタートポイントを提供します。" + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "GitHub で Zend Framework 2 をフォーク" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "開発を追う" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 は鋭意開発中です。ZF2の開発進行にご関心がおありでしょうか、Zend Framework公式ウェブサイト上ではZF2特別ポータルがあり、 %swiki%s、 %sdev blog%s、 %sissue tracker%s、 などのZF2関連のものを提供しています。最新の開発状況に追随するためのすばらしいリソースです。" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 開発ポータル" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "モジュールを見つける" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "コミュニティーはZF2モジュールのためのリポジトリとギャラリーを提供するコミュニティーサイトを開発中です。プロジェクトは %s GitHub%s で利用可能です。サイトは現在運営されており、ZF2ですでに利用可能なモジュールのリストを持っています。" + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "ZF2モジュールを探す" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "ヘルプとサポート" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "ZF2 で開発中に何らかのお手伝いやサポートが必要な場合、IRC を通じて私たちと連絡することができます。: %s#zftalk.2 on Freenode%s ベータ版についてあなたが抱えるかもしれない質問やフィードバックを何でも聞きたいと望みます。あるいは、%smailing lists%s を購読したり質問をポストしたりできます。" + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "IRC で呼び出す" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "エラーが発生しました" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "追加の情報" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "ファイル" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "メッセージ" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "スタックトレース" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "前の例外" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "例外が利用できません" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "404エラーが発生しました" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "要求されたコントローラはリクエストをディスパッチできませんでした。" + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "要求されたコントローラは存在するコントローラクラスにマッピングできませんでした。" + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "要求されたコントローラはディスパッチ不可能でした。" + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "要求されたURLはルーティングにマッチしませんでした。" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "404が生成された理由について現時点で判断できません。" + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "コントローラ" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "%s に解決" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "例外" + diff --git a/module/Application/language/nl_NL.mo b/module/Application/language/nl_NL.mo new file mode 100644 index 0000000000000000000000000000000000000000..a03a3328cfb393bb53fab0b04298f56255c8086f GIT binary patch literal 4815 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 literal 0 HcmV?d00001 diff --git a/module/Application/language/nl_NL.po b/module/Application/language/nl_NL.po new file mode 100644 index 00000000..fa97eae1 --- /dev/null +++ b/module/Application/language/nl_NL.po @@ -0,0 +1,153 @@ +msgid "" +msgstr "" +"Project-Id-Version: ZendSkeletonApplication\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-07-05 22:17-0700\n" +"PO-Revision-Date: 2012-07-24 12:48+0100\n" +"Last-Translator: Walter Tamboer\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Dutch\n" +"X-Poedit-Country: NETHERLANDS\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Applicatie Fundering" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Home" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Alle rechten voorbehouden." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Welkom bij %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Gefeliciteerd! Je hebt de %sZF2 Applicatie Fundering%s succesvol geinstalleerd. Je gebruikt Zend Framework versie %s. Deze fundering biedt je een startpunt om je ZF2 applicatie op voort te bouwen." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Fork Zend Framework 2 op GitHub" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Volg de Ontwikkeling" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 wordt actief ontwikkeld. Als je interesse hebt in het volgen van deze ontwikkelingen dan kun je de ZF2 portaal bezoeken op de officiële website van Zend Framework. Daar staan links naar de ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s en nog veel meer. Het is het perfecte middel om up-to-date te blijven met de ontwikkelingen." + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Ontwikkelaars Portaal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Ontdek Modules" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "De community werkt aan een eigen community website die dient als een bewaarplaats en galerij voor ZF2 modules. Het project is beschikbaar %sop GitHub%s. De site staat op dit moment live en bevat een lijst met modules die op dit moment beschikbaar zijn voor ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Verken ZF2 Modules" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Hulp & Support" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Als je hulp nodig hebt tijdens het ontwikkelen met ZF2, dan kun je ons bereiken via IRC: %s#zftalk.2 op Freenode%s. We beantwoorde met alle liefde je vragen en zouden graag feedback krijgen betreffende de beta releases. Je kunt je ook abonneren op de %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Ping ons via IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Er is een fout opgetreden" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Additionele informatie" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Bestand" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Bericht" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stack trace" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Vorige excepties" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Geen exceptie beschikbaar" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "De pagina kon niet worden gevonden." + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "De opgevraagde controller kon deze aanvraag niet verwerken." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Er is geen mapping beschikbaar voor de opgevraagde controller." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "De opgevraagde controller is niet bruikbaar (dispatchable)." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Er is geen route gevonden die overeenkomt met de opgevraagde URL." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "We kunnen op dit moment niet achterhalen waarom de pagina niet kon worden gevonden." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Controller" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "verwijst naar %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Exceptie" + diff --git a/module/Application/language/pl_PL.mo b/module/Application/language/pl_PL.mo new file mode 100644 index 0000000000000000000000000000000000000000..0df3fc6d1c60bd28da8262ba9698a293a35d4155 GIT binary patch literal 4934 zcmb7`PmCm09mh)r(EsytZD| z6xHG4#*G(^7d@BiGwHn{9biW&yFO7N_T&|s^0JS zet*C3_x3%v{UYL0d>@qW$D-&l!H@I9^=I%4;9tNmf^X07-vd9-{mLhz=-=Rj;ELSe z7Db-}?*l&#J_6ngu7P}_GyL2Go&&!Qet&-d7RV?189(=8!_UDxxc~L--M+sCKg0c> zK+*RPQ0#gKyc2vMjF7wYlTozJ-@6dL06q)$!JmT9fH%NzgZ~9(|HnVo>E8igMScv* zK7Yjc|8W0T@ILPUz$UWa-$9AfJD~V~$6ZnMH}C;a{CyV``S(CnMYrAE`Fl4g{weUQ z;41hqcp4PFL-4cUTi`DH{sa_#|3cXV;Je`0z}s0Q@%zRcp9IDK7s30HdkuV+`+_8F zgTDdS!1qCk%NjiZ!I4*tK z6~j_jbrz)jL+W)`tC8L}%GYshyx*&{tVOf0be5S!RU@NT{To~BY9}?Bsa&BpCzH&^ zLBXo;2MxM3D%e+4NSAd{*kY*OFh!!aN}Zd=m8se{rN>m%_0{gkdgT`yV_m3Vv(jE^ z*VY9#A$$ajlWGh#!PbUTSpjjcvv z(TO0JYocm&JW{n+`&O%S7f){x$cLwUP;Po?qL-aIOor0?EYky`zb%V#m*C=Uv|XBg>$o?I z#QErhN;2B1#Hp&(v59u^A$ECQ7q+6Ry^=x{y(m2rY<*;rw^az*k$Nl*KH18ZZE$cX zoxy)8NU52;t0*aIqb8*ro4As_4qYKphZWKlKgBKEuxQye8Bq=TmycrVSJR91ghWlb zJ>{t;L5b;nW2G}{Bf+>u>=vf=LjXz>@=oQwdhtA-)>)zoSCL!=dBh`L3@9&GOS2sp z5fi!=Ixabx2t7DVCM8%WVLiG!)1D+tOqK>5dEe0LVnt&8M68gUf5`H>kVUfRLMVh` zuD%~#BH6kKN)3gY+k${rtRc>oC2q}#AO%vD-G``bg4z zga*_$jjglj_)1A=T_muKj-^Q!H73;2S91;!u7uAFG|k@pC0oKX5sX5*;{z z=OPuzabjW%`HM-yFZ`vrM9}T++3wY?4m4&!dc=DRfl#3PHZh)xDpKOowWnxX^^HyK zsz1R$j8KEj4ZAz*eNAv^snnG6Ncudl(UwD;b2bmw4XMORP9P{bHlYro@m74RCn0kL zydyU;nPZ439Cg`06p3`UkA>Jq?6YYn^uXQKLMquDY^B*~mRxZ-1W!1ajhc@Y* zs)xR}>o(NN_A9%+(_$Ii*E_?W8)|*+rb-p zB3=w@sIRwcbdEP$>NIU;2Q|99dS<%UBmNcdo|}?N5nIaO&V_Rq&MsqdvcI+>;?zrT zx1HcyW!|j5Imuv-rxlG=dQ*Mp)!nV$Q_FQ?`kpC!XN%Yg+i$3+2DV!HUT@nO=8N7- zriCgKf1b)g;oMWRT(EFqgI<7}M$0#+T@7Wlym;mO=F4Z6FHUiY(CVWN)n7i`;cSXW z+dS^A@uI&HU21)GaAjg=m(^f)`QS<-4I7 zs%JM^xMX^KCTLVct&S~F1I*8KDbhu^w@Keinh@b z&3?&rH~XDLjy}Zz#=@LrxAC-)$)`-~@o}ftW#4Yld6e_nDZc&~^d4b=Z<>3`I%tRf>9scJQedo z3(kHIMagij6ArF0VoB!mo7aah*c8ikfFZgb3--3Xpq_IO!56e6QbTv~=E zXGPWKs?<{mmGH#Vt{}shCFVnChkOn_+e(jBBTReixbjivt&q}2&ZiXik>t{0k{&6~ z1%1p}jmLd8=Od95nit*=lUNsCTE;Angt1s(x@qIa^$Cf(1Rdh;#xHU)AHL+AAT5sB zYs{Ho#$CB#%`v}N)YTNxS#+%OSKEe>@2sORUslxBU)!2;1KWd!0X?Bel m73B>rjlHx=%QNxL1`-$-PS}moveXqb7miASb}fw+(f\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Polish\n" +"X-Poedit-Country: POLAND\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "Szkielet Aplikacji" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Strona startowa" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Wszelkie prawa zastrzeżone." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "Witaj w %sZend Framework 2%s" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Gratulacje! Z powodzeniem zainstalowałeś %sZF2 Skeleton Application%s. Aktualnie używasz Zend Framework w wersji %s. Ten szkielet może służyć jak prosty punkt startowy do budowy Twoich aplikacji na ZF2." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Forkuj Zend Framework 2 na GitHub'e" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Śledź prace programistyczne" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 jest w trakcie aktywnych prac programistycznych. Jeśli jesteś zainteresowany śledzeniem jego rozwoju, istnieje specialny portal ZF2 na oficjalnej stronie Zend Framework na którym dostępne są linki do ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, oraz wiele więcej. Jest to świetne miejsce by śledzić najnowsze zmiany!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Development Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Odkryj Moduły" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Społeczność pracuje nad stworzeniem społecznościowego serwisu który posłuży jako repozytorium i galeria dla modułów ZF2. Projekt wkrótce będzie dostępny na %son GitHub%s. Ta strona jest aktualnie online i udostępnia listę niektórych modułów dostępnych dla ZF2." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "Odkryj Moduły ZF2" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Pomoc & Wsparcie" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "Jeśli potrzebujesz jakiejkolwiek pomocy lub wsparcia podczas programowania na ZF2, możesz skontaktować się z nami via IRC: %s#zftalk.2 w sieci Freenode%s. Z przyjemnością wysłuchamy wszelkich pytań lub sugestii które możesz mieć odnoście wydań beta. Alternatywnie, możesz zapisać się i wysłać pytanie na %smailing lists%s." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "Wyślij nam wiadomość na IRC" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "Wystąpił błąd" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Dodatkowe informacje" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Plik" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Komunikat" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Stack trace" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Poprzedni wyjątek" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "Brak dostępnego wyjątku" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Wystąpił błąd 404" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Żądany kontroler nie mógł zmapować żądania." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Żądany kontroler nie mógł być zmapowany na isteniejącą klasę kontrolera." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Żądany kontroler nie mógł zostać zmapowany." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "Żądany adres URL nie mógł zostać powiązany z routing'iem." + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Nie możemy określić tym razem dlaczego wygenerowano błąd 404." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Kontroler" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "rozwiązuje na %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "Wyjątek" + diff --git a/module/Application/language/tr_TR.mo b/module/Application/language/tr_TR.mo new file mode 100644 index 0000000000000000000000000000000000000000..952882142e8f6f0863f0fb0c08efdf31590512d3 GIT binary patch literal 4785 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\n" +"Language-Team: ZF Contibutors \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Language: Turkish\n" +"X-Poedit-Country: TURKEY\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../view/layout/layout.phtml:6 +#: ../view/layout/layout.phtml:33 +msgid "Skeleton Application" +msgstr "" + +#: ../view/layout/layout.phtml:36 +msgid "Home" +msgstr "Anasayfa" + +#: ../view/layout/layout.phtml:50 +msgid "All rights reserved." +msgstr "Tüm haklar saklıdır." + +#: ../view/application/index/index.phtml:2 +#, php-format +msgid "Welcome to %sZend Framework 2%s" +msgstr "%sZend Framework 2%s'a hoş geldiniz" + +#: ../view/application/index/index.phtml:3 +#, php-format +msgid "Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2." +msgstr "Tebrikler! %sZF2 Skeleton Application%s'u başarıyla yüklediniz. Şu anda Zend Framework %s sürüm ile çalışıyorsunuz. Bu iskelet ZF2 üzerinde uygulama oluşturmak için basit bir başlangıç ​​noktası olarak hizmet verebilir." + +#: ../view/application/index/index.phtml:4 +msgid "Fork Zend Framework 2 on GitHub" +msgstr "Zend Framework 2'yi GitHub'da fork edin" + +#: ../view/application/index/index.phtml:10 +msgid "Follow Development" +msgstr "Gelişimi izleyin" + +#: ../view/application/index/index.phtml:11 +#, php-format +msgid "Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!" +msgstr "Zend Framework 2 aktif geliştirilmektedir. Eğer ZF2'nin gelişimi ile ilgileniyorsanız, ZF2 için resmi Zend Framework websitesinde özel portal mevcut, orada ZF2 %swiki%s'ye, %sDEV blog%s'a, %ssorun takibi%s'ne bağlantılarını ve çok daha fazlasını sunar. Bu son gelişmeler ile güncel kalmak için büyük bir kaynaktır!" + +#: ../view/application/index/index.phtml:12 +msgid "ZF2 Development Portal" +msgstr "ZF2 Development Portal" + +#: ../view/application/index/index.phtml:16 +msgid "Discover Modules" +msgstr "Modülleri keşfedin" + +#: ../view/application/index/index.phtml:17 +#, php-format +msgid "The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2." +msgstr "Topluluk ZF2 modülleri için bir depo ve galeri olarak hizmet edecek bir topluluk sitesi geliştirme üzerinde çalışıyor. Proje %sGitHub%s'da mevcut. Site şu anda canlı ve ZF2 için bazı mevcut modüllerin listesini içerir." + +#: ../view/application/index/index.phtml:18 +msgid "Explore ZF2 Modules" +msgstr "ZF2 Modüllerini keşfedin" + +#: ../view/application/index/index.phtml:22 +msgid "Help & Support" +msgstr "Yardım & Destek" + +#: ../view/application/index/index.phtml:23 +#, php-format +msgid "If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We'd love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s." +msgstr "ZF2 ile geliştirirken herhangi yardım veya desteğe ihtiyacınız varsa, bize IRC: %sFreenode #zftalk.2%s üzerinden ulaşabilirsiniz. Beta sürümleri ile ilgili olabilecek herhangi bir sorunuzu ya da yorumlarınızı duymak isteriz. Alternatif olarak %smailing listelerine%s abone olup sorularınızı sorabilirsiniz." + +#: ../view/application/index/index.phtml:24 +msgid "Ping us on IRC" +msgstr "IRC bizi pingleyin" + +#: ../view/error/index.phtml:1 +msgid "An error occurred" +msgstr "An error occurred" + +#: ../view/error/index.phtml:8 +msgid "Additional information" +msgstr "Ek bilgiler" + +#: ../view/error/index.phtml:11 +#: ../view/error/index.phtml:35 +msgid "File" +msgstr "Klasör" + +#: ../view/error/index.phtml:15 +#: ../view/error/index.phtml:39 +msgid "Message" +msgstr "Mesaj" + +#: ../view/error/index.phtml:19 +#: ../view/error/index.phtml:43 +#: ../view/error/404.phtml:55 +msgid "Stack trace" +msgstr "Denetleyici" + +#: ../view/error/index.phtml:29 +msgid "Previous exceptions" +msgstr "Önceki istisnalar" + +#: ../view/error/index.phtml:58 +msgid "No Exception available" +msgstr "İstisna yok" + +#: ../view/error/404.phtml:1 +msgid "A 404 error occurred" +msgstr "Bir 404 hatası oluştu" + +#: ../view/error/404.phtml:10 +msgid "The requested controller was unable to dispatch the request." +msgstr "Talep edilen denetleyici işlemi işlemesi mümkün değildir." + +#: ../view/error/404.phtml:13 +msgid "The requested controller could not be mapped to an existing controller class." +msgstr "Talep edilen denetleyiciye uygun denetleyici sınıfı tahsis edilemedi." + +#: ../view/error/404.phtml:16 +msgid "The requested controller was not dispatchable." +msgstr "Talep edilen denetleyici çağrılabilir değildir." + +#: ../view/error/404.phtml:19 +msgid "The requested URL could not be matched by routing." +msgstr "İstenen URL yönlendirmede tahsis edilemedi" + +#: ../view/error/404.phtml:22 +msgid "We cannot determine at this time why a 404 was generated." +msgstr "Neden 404 hatasının oluştuğunu şu an belirleyemiyoruz." + +#: ../view/error/404.phtml:34 +msgid "Controller" +msgstr "Denetleyici" + +#: ../view/error/404.phtml:41 +#, php-format +msgid "resolves to %s" +msgstr "Buraya çözümlenir: %s" + +#: ../view/error/404.phtml:51 +msgid "Exception" +msgstr "İstisna" + diff --git a/module/Application/src/Application/Controller/IndexController.php b/module/Application/src/Application/Controller/IndexController.php new file mode 100644 index 00000000..a1aafaee --- /dev/null +++ b/module/Application/src/Application/Controller/IndexController.php @@ -0,0 +1,21 @@ + +

translate('Welcome to %sZend Framework 2%s'), '', '') ?>

+
+

translate('Fork Zend Framework 2 on GitHub') ?> »

+

translate('Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2.'), '', '', \Zend\Version\Version::VERSION) ?>

+ +
+ +
+

translate('Follow Development') ?>

+

translate('Zend Framework 2 is under active development. If you are interested in following the development of ZF2, there is a special ZF2 portal on the official Zend Framework website which provides links to the ZF2 %swiki%s, %sdev blog%s, %sissue tracker%s, and much more. This is a great resource for staying up to date with the latest developments!'), '', '', '', '', '', '') ?>

+

translate('ZF2 Development Portal') ?> »

+
+ +
+

translate('Discover Modules') ?>

+

translate('The community is working on developing a community site to serve as a repository and gallery for ZF2 modules. The project is available %son GitHub%s. The site is currently live and currently contains a list of some of the modules already available for ZF2.'), '', '') ?>

+

translate('Explore ZF2 Modules') ?> »

+
+ +
+

translate('Help & Support') ?>

+

translate('If you need any help or support while developing with ZF2, you may reach us via IRC: %s#zftalk.2 on Freenode%s. We\'d love to hear any questions or feedback you may have regarding the beta releases. Alternatively, you may subscribe and post questions to the %smailing lists%s.'), '', '', '', '') ?>

+

translate('Ping us on IRC') ?> »

+
+
diff --git a/module/Application/view/error/404.phtml b/module/Application/view/error/404.phtml new file mode 100644 index 00000000..3edd37a8 --- /dev/null +++ b/module/Application/view/error/404.phtml @@ -0,0 +1,61 @@ +

translate('A 404 error occurred') ?>

+

message ?>

+ +reason) && $this->reason): ?> + +reason) { + case 'error-controller-cannot-dispatch': + $reasonMessage = $this->translate('The requested controller was unable to dispatch the request.'); + break; + case 'error-controller-not-found': + $reasonMessage = $this->translate('The requested controller could not be mapped to an existing controller class.'); + break; + case 'error-controller-invalid': + $reasonMessage = $this->translate('The requested controller was not dispatchable.'); + break; + case 'error-router-no-match': + $reasonMessage = $this->translate('The requested URL could not be matched by routing.'); + break; + default: + $reasonMessage = $this->translate('We cannot determine at this time why a 404 was generated.'); + break; +} +?> + +

+ + + +controller) && $this->controller): ?> + +
+
translate('Controller') ?>:
+
escapeHtml($this->controller) ?> +controller_class) + && $this->controller_class + && $this->controller_class != $this->controller +) { + echo '(' . sprintf($this->translate('resolves to %s'), $this->escapeHtml($this->controller_class)) . ')'; +} +?> +
+
+ + + +exception) && $this->exception): ?> + +

translate('Exception') ?>:

+ +

escapeHtml($this->exception->getMessage()) ?>

+ +

translate('Stack trace') ?>:

+ +
+exception->getTraceAsString() ?>
+
+ + diff --git a/module/Application/view/error/index.phtml b/module/Application/view/error/index.phtml new file mode 100644 index 00000000..5165cd8e --- /dev/null +++ b/module/Application/view/error/index.phtml @@ -0,0 +1,62 @@ +

translate('An error occurred') ?>

+

message ?>

+ +display_exceptions) && $this->display_exceptions): ?> + +exception) && $this->exception instanceof Exception): ?> +
+

translate('Additional information') ?>:

+

exception); ?>

+
+
translate('File') ?>:
+
+
exception->getFile() ?>:exception->getLine() ?>
+
+
translate('Message') ?>:
+
+
exception->getMessage() ?>
+
+
translate('Stack trace') ?>:
+
+
exception->getTraceAsString() ?>
+
+
+exception->getPrevious(); + if ($e) : +?> +
+

translate('Previous exceptions') ?>:

+
    + +
  • +

    +
    +
    translate('File') ?>:
    +
    +
    getFile() ?>:getLine() ?>
    +
    +
    translate('Message') ?>:
    +
    +
    getMessage() ?>
    +
    +
    translate('Stack trace') ?>:
    +
    +
    getTraceAsString() ?>
    +
    +
    +
  • + getPrevious(); + endwhile; + ?> +
+ + + + +

translate('No Exception available') ?>

+ + + + diff --git a/module/Application/view/layout/layout.phtml b/module/Application/view/layout/layout.phtml new file mode 100644 index 00000000..d5af45f6 --- /dev/null +++ b/module/Application/view/layout/layout.phtml @@ -0,0 +1,57 @@ +doctype(); ?> + + + + + headTitle('ZF2 '. $this->translate('Skeleton Application'))->setSeparator(' - ')->setAutoEscape(false) ?> + + headMeta()->appendName('viewport', 'width=device-width, initial-scale=1.0') ?> + + + headLink(array('rel' => 'shortcut icon', 'type' => 'image/vnd.microsoft.icon', 'href' => $this->basePath() . '/images/favicon.ico')) + ->prependStylesheet($this->basePath() . '/css/bootstrap-responsive.min.css') + ->prependStylesheet($this->basePath() . '/css/style.css') + ->prependStylesheet($this->basePath() . '/css/bootstrap.min.css') ?> + + + headScript()->prependFile($this->basePath() . '/js/html5.js', 'text/javascript', array('conditional' => 'lt IE 9',)) + ->prependFile($this->basePath() . '/js/jquery-1.7.2.min.js') ?> + + + + + + + +
+ + content; ?> + +
+ +
+

© 2005 - 2012 by Zend Technologies Ltd. translate('All rights reserved.') ?>

+
+ +
+ + inlineScript() ?> + + diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 00000000..10d71d77 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,7 @@ +RewriteEngine On +RewriteCond %{REQUEST_FILENAME} -s [OR] +RewriteCond %{REQUEST_FILENAME} -l [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteBase /fmi +RewriteRule ^.*$ - [NC,L] +RewriteRule ^.*$ index.php [NC,L] diff --git a/public/css/bootstrap-responsive.min.css b/public/css/bootstrap-responsive.min.css new file mode 100644 index 00000000..bc3f2ab7 --- /dev/null +++ b/public/css/bootstrap-responsive.min.css @@ -0,0 +1,3 @@ + +.hidden{display:none;visibility:hidden;} +@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:768px){.container{width:auto;padding:0 20px;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;}}@media (min-width:768px) and (max-width:980px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .span1{width:42px;} .span2{width:104px;} .span3{width:166px;} .span4{width:228px;} .span5{width:290px;} .span6{width:352px;} .span7{width:414px;} .span8{width:476px;} .span9{width:538px;} .span10{width:600px;} .span11{width:662px;} .span12,.container{width:724px;} .offset1{margin-left:82px;} .offset2{margin-left:144px;} .offset3{margin-left:206px;} .offset4{margin-left:268px;} .offset5{margin-left:330px;} .offset6{margin-left:392px;} .offset7{margin-left:454px;} .offset8{margin-left:516px;} .offset9{margin-left:578px;} .offset10{margin-left:640px;} .offset11{margin-left:702px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.801104972%;} .row-fluid .span2{width:14.364640883%;} .row-fluid .span3{width:22.928176794%;} .row-fluid .span4{width:31.491712705%;} .row-fluid .span5{width:40.055248616%;} .row-fluid .span6{width:48.618784527%;} .row-fluid .span7{width:57.182320438000005%;} .row-fluid .span8{width:65.74585634900001%;} .row-fluid .span9{width:74.30939226%;} .row-fluid .span10{width:82.87292817100001%;} .row-fluid .span11{width:91.436464082%;} .row-fluid .span12{width:99.999999993%;} input.span1,textarea.span1,.uneditable-input.span1{width:32px;} input.span2,textarea.span2,.uneditable-input.span2{width:94px;} input.span3,textarea.span3,.uneditable-input.span3{width:156px;} input.span4,textarea.span4,.uneditable-input.span4{width:218px;} input.span5,textarea.span5,.uneditable-input.span5{width:280px;} input.span6,textarea.span6,.uneditable-input.span6{width:342px;} input.span7,textarea.span7,.uneditable-input.span7{width:404px;} input.span8,textarea.span8,.uneditable-input.span8{width:466px;} input.span9,textarea.span9,.uneditable-input.span9{width:528px;} input.span10,textarea.span10,.uneditable-input.span10{width:590px;} input.span11,textarea.span11,.uneditable-input.span11{width:652px;} input.span12,textarea.span12,.uneditable-input.span12{width:714px;}}@media (max-width:980px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .span1{width:70px;} .span2{width:170px;} .span3{width:270px;} .span4{width:370px;} .span5{width:470px;} .span6{width:570px;} .span7{width:670px;} .span8{width:770px;} .span9{width:870px;} .span10{width:970px;} .span11{width:1070px;} .span12,.container{width:1170px;} .offset1{margin-left:130px;} .offset2{margin-left:230px;} .offset3{margin-left:330px;} .offset4{margin-left:430px;} .offset5{margin-left:530px;} .offset6{margin-left:630px;} .offset7{margin-left:730px;} .offset8{margin-left:830px;} .offset9{margin-left:930px;} .offset10{margin-left:1030px;} .offset11{margin-left:1130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.982905983%;} .row-fluid .span2{width:14.529914530000001%;} .row-fluid .span3{width:23.076923077%;} .row-fluid .span4{width:31.623931624%;} .row-fluid .span5{width:40.170940171000005%;} .row-fluid .span6{width:48.717948718%;} .row-fluid .span7{width:57.264957265%;} .row-fluid .span8{width:65.81196581200001%;} .row-fluid .span9{width:74.358974359%;} .row-fluid .span10{width:82.905982906%;} .row-fluid .span11{width:91.45299145300001%;} .row-fluid .span12{width:100%;} input.span1,textarea.span1,.uneditable-input.span1{width:60px;} input.span2,textarea.span2,.uneditable-input.span2{width:160px;} input.span3,textarea.span3,.uneditable-input.span3{width:260px;} input.span4,textarea.span4,.uneditable-input.span4{width:360px;} input.span5,textarea.span5,.uneditable-input.span5{width:460px;} input.span6,textarea.span6,.uneditable-input.span6{width:560px;} input.span7,textarea.span7,.uneditable-input.span7{width:660px;} input.span8,textarea.span8,.uneditable-input.span8{width:760px;} input.span9,textarea.span9,.uneditable-input.span9{width:860px;} input.span10,textarea.span10,.uneditable-input.span10{width:960px;} input.span11,textarea.span11,.uneditable-input.span11{width:1060px;} input.span12,textarea.span12,.uneditable-input.span12{width:1160px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}} diff --git a/public/css/bootstrap.min.css b/public/css/bootstrap.min.css new file mode 100644 index 00000000..b01f92e6 --- /dev/null +++ b/public/css/bootstrap.min.css @@ -0,0 +1,610 @@ +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} +audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} +audio:not([controls]){display:none;} +html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} +a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +a:hover,a:active{outline:0;} +sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} +sup{top:-0.5em;} +sub{bottom:-0.25em;} +img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;} +button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} +button,input{*overflow:visible;line-height:normal;} +button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} +button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} +input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} +input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} +textarea{overflow:auto;vertical-align:top;} +body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;} +a{color:#0088cc;text-decoration:none;} +a:hover{color:#005580;text-decoration:underline;} +.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} +.row:after{clear:both;} +[class*="span"]{float:left;margin-left:20px;} +.span1{width:60px;} +.span2{width:140px;} +.span3{width:220px;} +.span4{width:300px;} +.span5{width:380px;} +.span6{width:460px;} +.span7{width:540px;} +.span8{width:620px;} +.span9{width:700px;} +.span10{width:780px;} +.span11{width:860px;} +.span12,.container{width:940px;} +.offset1{margin-left:100px;} +.offset2{margin-left:180px;} +.offset3{margin-left:260px;} +.offset4{margin-left:340px;} +.offset5{margin-left:420px;} +.offset6{margin-left:500px;} +.offset7{margin-left:580px;} +.offset8{margin-left:660px;} +.offset9{margin-left:740px;} +.offset10{margin-left:820px;} +.offset11{margin-left:900px;} +.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} +.row-fluid:after{clear:both;} +.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;} +.row-fluid>[class*="span"]:first-child{margin-left:0;} +.row-fluid .span1{width:6.382978723%;} +.row-fluid .span2{width:14.89361702%;} +.row-fluid .span3{width:23.404255317%;} +.row-fluid .span4{width:31.914893614%;} +.row-fluid .span5{width:40.425531911%;} +.row-fluid .span6{width:48.93617020799999%;} +.row-fluid .span7{width:57.446808505%;} +.row-fluid .span8{width:65.95744680199999%;} +.row-fluid .span9{width:74.468085099%;} +.row-fluid .span10{width:82.97872339599999%;} +.row-fluid .span11{width:91.489361693%;} +.row-fluid .span12{width:99.99999998999999%;} +.container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";} +.container:after{clear:both;} +.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";} +.container-fluid:after{clear:both;} +p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;} +.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;} +h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;} +h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;} +h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;} +h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;} +h4,h5,h6{line-height:18px;} +h4{font-size:14px;}h4 small{font-size:12px;} +h5{font-size:12px;} +h6{font-size:11px;color:#999999;text-transform:uppercase;} +.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;} +.page-header h1{line-height:1;} +ul,ol{padding:0;margin:0 0 9px 25px;} +ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} +ul{list-style:disc;} +ol{list-style:decimal;} +li{line-height:18px;} +ul.unstyled{margin-left:0;list-style:none;} +dl{margin-bottom:18px;} +dt,dd{line-height:18px;} +dt{font-weight:bold;} +dd{margin-left:9px;} +hr{margin:18px 0;border:0;border-top:1px solid #e5e5e5;border-bottom:1px solid #ffffff;} +strong{font-weight:bold;} +em{font-style:italic;} +.muted{color:#999999;} +abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;} +blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;} +blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} +blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} +q:before,q:after,blockquote:before,blockquote:after{content:"";} +address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;} +small{font-size:100%;} +cite{font-style:normal;} +code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} +pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;}pre.prettyprint{margin-bottom:18px;} +pre code{padding:0;background-color:transparent;} +form{margin:0 0 18px;} +fieldset{padding:0;margin:0;border:0;} +legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;} +label,input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;} +label{display:block;margin-bottom:5px;color:#333333;} +input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.uneditable-textarea{width:auto;height:auto;} +label input,label textarea,label select{display:block;} +input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:0;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +input[type="file"]{padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;} +select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;} +select{width:220px;background-color:#ffffff;} +select[multiple],select[size]{height:auto;} +input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +textarea{height:auto;} +input[type="hidden"]{display:none;} +.radio,.checkbox{padding-left:18px;} +.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;} +.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} +.radio.inline,.checkbox.inline{display:inline-block;margin-bottom:0;vertical-align:middle;} +.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} +.controls>.radio.inline:first-child,.controls>.checkbox.inline:first-child{padding-top:0;} +input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;} +input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;} +input[type="file"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.input-mini{width:60px;} +.input-small{width:90px;} +.input-medium{width:150px;} +.input-large{width:210px;} +.input-xlarge{width:270px;} +.input-xxlarge{width:530px;} +input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;} +input.span1,textarea.span1,.uneditable-input.span1{width:50px;} +input.span2,textarea.span2,.uneditable-input.span2{width:130px;} +input.span3,textarea.span3,.uneditable-input.span3{width:210px;} +input.span4,textarea.span4,.uneditable-input.span4{width:290px;} +input.span5,textarea.span5,.uneditable-input.span5{width:370px;} +input.span6,textarea.span6,.uneditable-input.span6{width:450px;} +input.span7,textarea.span7,.uneditable-input.span7{width:530px;} +input.span8,textarea.span8,.uneditable-input.span8{width:610px;} +input.span9,textarea.span9,.uneditable-input.span9{width:690px;} +input.span10,textarea.span10,.uneditable-input.span10{width:770px;} +input.span11,textarea.span11,.uneditable-input.span11{width:850px;} +input.span12,textarea.span12,.uneditable-input.span12{width:930px;} +input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;} +.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} +.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;} +.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} +.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} +.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;} +.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} +.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} +.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;} +.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} +input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} +.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;} +.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} +:-moz-placeholder{color:#999999;} +::-webkit-input-placeholder{color:#999999;} +.help-block{margin-top:5px;margin-bottom:0;color:#999999;} +.help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;} +.input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";} +.input-prepend:after,.input-append:after{clear:both;} +.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;} +.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;} +.input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;} +.input-prepend .add-on{*margin-top:1px;} +.input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-append .uneditable-input{border-right-color:#ccc;} +.input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;} +.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;} +.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input{display:inline-block;margin-bottom:0;} +.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;} +.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;} +.control-group{margin-bottom:9px;} +.form-horizontal legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;} +.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";} +.form-horizontal .control-group:after{clear:both;} +.form-horizontal .control-group>label{float:left;width:140px;padding-top:5px;text-align:right;} +.form-horizontal .controls{margin-left:160px;} +.form-horizontal .form-actions{padding-left:160px;} +table{max-width:100%;border-collapse:collapse;border-spacing:0;} +.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;border-top:1px solid #ddd;} +.table th{font-weight:bold;vertical-align:bottom;} +.table td{vertical-align:top;} +.table thead:first-child tr th,.table thead:first-child tr td{border-top:0;} +.table tbody+tbody{border-top:2px solid #ddd;} +.table-condensed th,.table-condensed td{padding:4px 5px;} +.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;} +.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} +.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;} +.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;} +.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;} +.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;} +.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} +table .span1{float:none;width:44px;margin-left:0;} +table .span2{float:none;width:124px;margin-left:0;} +table .span3{float:none;width:204px;margin-left:0;} +table .span4{float:none;width:284px;margin-left:0;} +table .span5{float:none;width:364px;margin-left:0;} +table .span6{float:none;width:444px;margin-left:0;} +table .span7{float:none;width:524px;margin-left:0;} +table .span8{float:none;width:604px;margin-left:0;} +table .span9{float:none;width:684px;margin-left:0;} +table .span10{float:none;width:764px;margin-left:0;} +table .span11{float:none;width:844px;margin-left:0;} +table .span12{float:none;width:924px;margin-left:0;} +[class^="icon-"]{display:inline-block;width:14px;height:14px;vertical-align:text-top;background-image:url(../img/glyphicons-halflings.png);background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child{*margin-left:0;} +.icon-white{background-image:url(../img/glyphicons-halflings-white.png);} +.icon-glass{background-position:0 0;} +.icon-music{background-position:-24px 0;} +.icon-search{background-position:-48px 0;} +.icon-envelope{background-position:-72px 0;} +.icon-heart{background-position:-96px 0;} +.icon-star{background-position:-120px 0;} +.icon-star-empty{background-position:-144px 0;} +.icon-user{background-position:-168px 0;} +.icon-film{background-position:-192px 0;} +.icon-th-large{background-position:-216px 0;} +.icon-th{background-position:-240px 0;} +.icon-th-list{background-position:-264px 0;} +.icon-ok{background-position:-288px 0;} +.icon-remove{background-position:-312px 0;} +.icon-zoom-in{background-position:-336px 0;} +.icon-zoom-out{background-position:-360px 0;} +.icon-off{background-position:-384px 0;} +.icon-signal{background-position:-408px 0;} +.icon-cog{background-position:-432px 0;} +.icon-trash{background-position:-456px 0;} +.icon-home{background-position:0 -24px;} +.icon-file{background-position:-24px -24px;} +.icon-time{background-position:-48px -24px;} +.icon-road{background-position:-72px -24px;} +.icon-download-alt{background-position:-96px -24px;} +.icon-download{background-position:-120px -24px;} +.icon-upload{background-position:-144px -24px;} +.icon-inbox{background-position:-168px -24px;} +.icon-play-circle{background-position:-192px -24px;} +.icon-repeat{background-position:-216px -24px;} +.icon-refresh{background-position:-240px -24px;} +.icon-list-alt{background-position:-264px -24px;} +.icon-lock{background-position:-287px -24px;} +.icon-flag{background-position:-312px -24px;} +.icon-headphones{background-position:-336px -24px;} +.icon-volume-off{background-position:-360px -24px;} +.icon-volume-down{background-position:-384px -24px;} +.icon-volume-up{background-position:-408px -24px;} +.icon-qrcode{background-position:-432px -24px;} +.icon-barcode{background-position:-456px -24px;} +.icon-tag{background-position:0 -48px;} +.icon-tags{background-position:-25px -48px;} +.icon-book{background-position:-48px -48px;} +.icon-bookmark{background-position:-72px -48px;} +.icon-print{background-position:-96px -48px;} +.icon-camera{background-position:-120px -48px;} +.icon-font{background-position:-144px -48px;} +.icon-bold{background-position:-167px -48px;} +.icon-italic{background-position:-192px -48px;} +.icon-text-height{background-position:-216px -48px;} +.icon-text-width{background-position:-240px -48px;} +.icon-align-left{background-position:-264px -48px;} +.icon-align-center{background-position:-288px -48px;} +.icon-align-right{background-position:-312px -48px;} +.icon-align-justify{background-position:-336px -48px;} +.icon-list{background-position:-360px -48px;} +.icon-indent-left{background-position:-384px -48px;} +.icon-indent-right{background-position:-408px -48px;} +.icon-facetime-video{background-position:-432px -48px;} +.icon-picture{background-position:-456px -48px;} +.icon-pencil{background-position:0 -72px;} +.icon-map-marker{background-position:-24px -72px;} +.icon-adjust{background-position:-48px -72px;} +.icon-tint{background-position:-72px -72px;} +.icon-edit{background-position:-96px -72px;} +.icon-share{background-position:-120px -72px;} +.icon-check{background-position:-144px -72px;} +.icon-move{background-position:-168px -72px;} +.icon-step-backward{background-position:-192px -72px;} +.icon-fast-backward{background-position:-216px -72px;} +.icon-backward{background-position:-240px -72px;} +.icon-play{background-position:-264px -72px;} +.icon-pause{background-position:-288px -72px;} +.icon-stop{background-position:-312px -72px;} +.icon-forward{background-position:-336px -72px;} +.icon-fast-forward{background-position:-360px -72px;} +.icon-step-forward{background-position:-384px -72px;} +.icon-eject{background-position:-408px -72px;} +.icon-chevron-left{background-position:-432px -72px;} +.icon-chevron-right{background-position:-456px -72px;} +.icon-plus-sign{background-position:0 -96px;} +.icon-minus-sign{background-position:-24px -96px;} +.icon-remove-sign{background-position:-48px -96px;} +.icon-ok-sign{background-position:-72px -96px;} +.icon-question-sign{background-position:-96px -96px;} +.icon-info-sign{background-position:-120px -96px;} +.icon-screenshot{background-position:-144px -96px;} +.icon-remove-circle{background-position:-168px -96px;} +.icon-ok-circle{background-position:-192px -96px;} +.icon-ban-circle{background-position:-216px -96px;} +.icon-arrow-left{background-position:-240px -96px;} +.icon-arrow-right{background-position:-264px -96px;} +.icon-arrow-up{background-position:-289px -96px;} +.icon-arrow-down{background-position:-312px -96px;} +.icon-share-alt{background-position:-336px -96px;} +.icon-resize-full{background-position:-360px -96px;} +.icon-resize-small{background-position:-384px -96px;} +.icon-plus{background-position:-408px -96px;} +.icon-minus{background-position:-433px -96px;} +.icon-asterisk{background-position:-456px -96px;} +.icon-exclamation-sign{background-position:0 -120px;} +.icon-gift{background-position:-24px -120px;} +.icon-leaf{background-position:-48px -120px;} +.icon-fire{background-position:-72px -120px;} +.icon-eye-open{background-position:-96px -120px;} +.icon-eye-close{background-position:-120px -120px;} +.icon-warning-sign{background-position:-144px -120px;} +.icon-plane{background-position:-168px -120px;} +.icon-calendar{background-position:-192px -120px;} +.icon-random{background-position:-216px -120px;} +.icon-comment{background-position:-240px -120px;} +.icon-magnet{background-position:-264px -120px;} +.icon-chevron-up{background-position:-288px -120px;} +.icon-chevron-down{background-position:-313px -119px;} +.icon-retweet{background-position:-336px -120px;} +.icon-shopping-cart{background-position:-360px -120px;} +.icon-folder-close{background-position:-384px -120px;} +.icon-folder-open{background-position:-408px -120px;} +.icon-resize-vertical{background-position:-432px -119px;} +.icon-resize-horizontal{background-position:-456px -118px;} +.dropdown{position:relative;} +.dropdown-toggle{*margin-bottom:-3px;} +.dropdown-toggle:active,.open .dropdown-toggle{outline:0;} +.caret{display:inline-block;width:0;height:0;text-indent:-99999px;*text-indent:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"\2193";} +.dropdown .caret{margin-top:8px;margin-left:2px;} +.dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);} +.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;max-width:220px;_width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.bottom-up{top:auto;bottom:100%;margin-bottom:2px;} +.dropdown-menu .divider{height:1px;margin:5px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;} +.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#555555;white-space:nowrap;} +.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;} +.dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);} +.dropdown.open .dropdown-menu{display:block;} +.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} +.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;} +.collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;} +.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;} +.btn{display:inline-block;padding:4px 10px 4px;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#fafafa;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;*margin-left:.3em;}.btn:first-child{*margin-left:0;} +.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} +.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;color:rgba(0, 0, 0, 0.5);outline:0;} +.btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.btn-large .icon{margin-top:1px;} +.btn-small{padding:5px 9px;font-size:11px;line-height:16px;} +.btn-small .icon{margin-top:-1px;} +.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;} +.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active{color:rgba(255, 255, 255, 0.75);} +.btn-primary{background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-ms-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(top, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0044cc;} +.btn-primary:active,.btn-primary.active{background-color:#003399 \9;} +.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;} +.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} +.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;} +.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} +.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;} +.btn-success:active,.btn-success.active{background-color:#408140 \9;} +.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;} +.btn-info:active,.btn-info.active{background-color:#24748c \9;} +button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} +button.btn.large,input[type="submit"].btn.large{*padding-top:7px;*padding-bottom:7px;} +button.btn.small,input[type="submit"].btn.small{*padding-top:3px;*padding-bottom:3px;} +.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";} +.btn-group:after{clear:both;} +.btn-group:first-child{*margin-left:0;} +.btn-group+.btn-group{margin-left:5px;} +.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;} +.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} +.btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} +.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} +.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;} +.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} +.btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:5px;*padding-bottom:5px;} +.btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);} +.btn .caret{margin-top:7px;margin-left:0;} +.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);} +.btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret{border-top-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);} +.btn-small .caret{margin-top:4px;} +.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.alert,.alert-heading{color:#c09853;} +.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;} +.alert-success{background-color:#dff0d8;border-color:#d6e9c6;} +.alert-success,.alert-success .alert-heading{color:#468847;} +.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;} +.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading{color:#b94a48;} +.alert-info{background-color:#d9edf7;border-color:#bce8f1;} +.alert-info,.alert-info .alert-heading{color:#3a87ad;} +.alert-block{padding-top:14px;padding-bottom:14px;} +.alert-block>p,.alert-block>ul{margin-bottom:0;} +.alert-block p+p{margin-top:5px;} +.nav{margin-left:0;margin-bottom:18px;list-style:none;} +.nav>li>a{display:block;} +.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} +.nav-list{padding-left:14px;padding-right:14px;margin-bottom:0;} +.nav-list>li>a,.nav-list .nav-header{display:block;padding:3px 15px;margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} +.nav-list .nav-header{font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-transform:uppercase;} +.nav-list>li+.nav-header{margin-top:9px;} +.nav-list .active>a,.nav-list .active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} +.nav-list [class^="icon-"]{margin-right:2px;} +.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";} +.nav-tabs:after,.nav-pills:after{clear:both;} +.nav-tabs>li,.nav-pills>li{float:left;} +.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} +.nav-tabs{border-bottom:1px solid #ddd;} +.nav-tabs>li{margin-bottom:-1px;} +.nav-tabs>li>a{padding-top:9px;padding-bottom:9px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} +.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} +.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.nav-pills .active>a,.nav-pills .active>a:hover{color:#ffffff;background-color:#0088cc;} +.nav-stacked>li{float:none;} +.nav-stacked>li>a{margin-right:0;} +.nav-tabs.nav-stacked{border-bottom:0;} +.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} +.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} +.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} +.nav-pills.nav-stacked>li>a{margin-bottom:3px;} +.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} +.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;} +.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;margin-top:6px;} +.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;} +.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;} +.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;} +.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} +.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;opacity:1;filter:alpha(opacity=100);} +.tabs-stacked .open>a:hover{border-color:#999999;} +.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";} +.tabbable:after{clear:both;} +.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;} +.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} +.tab-content>.active,.pill-content>.active{display:block;} +.tabs-below .nav-tabs{border-top:1px solid #ddd;} +.tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;} +.tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} +.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;} +.tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;} +.tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} +.tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} +.tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} +.tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} +.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} +.tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} +.tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} +.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} +.navbar{overflow:visible;margin-bottom:18px;} +.navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);} +.btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;} +.btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;} +.btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} +.btn-navbar .icon-bar+.icon-bar{margin-top:3px;} +.nav-collapse.collapse{height:auto;} +.navbar .brand:hover{text-decoration:none;} +.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;} +.navbar .navbar-text{margin-bottom:0;line-height:40px;color:#999999;}.navbar .navbar-text a:hover{color:#ffffff;background-color:transparent;} +.navbar .btn,.navbar .btn-group{margin-top:5px;} +.navbar .btn-group .btn{margin-top:0;} +.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";} +.navbar-form:after{clear:both;} +.navbar-form input,.navbar-form select{display:inline-block;margin-top:5px;margin-bottom:0;} +.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} +.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} +.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;color:rgba(255, 255, 255, 0.75);background:#666;background:rgba(255, 255, 255, 0.3);border:1px solid #111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query :-moz-placeholder{color:#eeeeee;} +.navbar-search .search-query::-webkit-input-placeholder{color:#eeeeee;} +.navbar-search .search-query:hover{color:#ffffff;background-color:#999999;background-color:rgba(255, 255, 255, 0.5);} +.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} +.navbar-fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030;} +.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} +.navbar .nav.pull-right{float:right;} +.navbar .nav>li{display:block;float:left;} +.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} +.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;} +.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;background-color:rgba(0, 0, 0, 0.5);} +.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;} +.navbar .nav.pull-right{margin-left:10px;margin-right:0;} +.navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} +.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} +.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;} +.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);} +.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;} +.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;} +.navbar .nav.pull-right .dropdown-menu{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before{left:auto;right:12px;} +.navbar .nav.pull-right .dropdown-menu:after{left:auto;right:13px;} +.breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;} +.breadcrumb .divider{padding:0 5px;color:#999999;} +.breadcrumb .active a{color:#333333;} +.pagination{height:36px;margin:18px 0;} +.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} +.pagination li{display:inline;} +.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;} +.pagination a:hover,.pagination .active a{background-color:#f5f5f5;} +.pagination .active a{color:#999999;cursor:default;} +.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;} +.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.pagination-centered{text-align:center;} +.pagination-right{text-align:right;} +.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";} +.pager:after{clear:both;} +.pager li{display:inline;} +.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} +.pager a:hover{text-decoration:none;background-color:#f5f5f5;} +.pager .next a{float:right;} +.pager .previous a{float:left;} +.modal-open .dropdown-menu{z-index:2050;} +.modal-open .dropdown.open{*z-index:2050;} +.modal-open .popover{z-index:2060;} +.modal-open .tooltip{z-index:2070;} +.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} +.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} +.modal{position:fixed;top:50%;left:50%;z-index:1050;max-height:500px;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} +.modal.fade.in{top:50%;} +.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} +.modal-body{padding:15px;} +.modal-footer{padding:14px 15px 15px;margin-bottom:0;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";} +.modal-footer:after{clear:both;} +.modal-footer .btn{float:right;margin-left:5px;margin-bottom:0;} +.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} +.tooltip.top{margin-top:-2px;} +.tooltip.right{margin-left:2px;} +.tooltip.bottom{margin-top:2px;} +.tooltip.left{margin-left:-2px;} +.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.tooltip-arrow{position:absolute;width:0;height:0;} +.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;} +.popover.right{margin-left:5px;} +.popover.bottom{margin-top:5px;} +.popover.left{margin-left:-5px;} +.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.popover .arrow{position:absolute;width:0;height:0;} +.popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);} +.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;} +.popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;} +.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";} +.thumbnails:after{clear:both;} +.thumbnails>li{float:left;margin:0 0 18px 20px;} +.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);} +a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} +.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} +.thumbnail .caption{padding:9px;} +.label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.label-important{background-color:#b94a48;} +.label-warning{background-color:#f89406;} +.label-success{background-color:#468847;} +.label-info{background-color:#3a87ad;} +@-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} +.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} +.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} +.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);} +.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);} +.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);} +.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.accordion{margin-bottom:18px;} +.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.accordion-heading{border-bottom:0;} +.accordion-heading .accordion-toggle{display:block;padding:8px 15px;} +.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} +.carousel{position:relative;margin-bottom:18px;line-height:1;} +.carousel-inner{overflow:hidden;width:100%;position:relative;} +.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;} +.carousel .item>img{display:block;line-height:1;} +.carousel .active,.carousel .next,.carousel .prev{display:block;} +.carousel .active{left:0;} +.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;} +.carousel .next{left:100%;} +.carousel .prev{left:-100%;} +.carousel .next.left,.carousel .prev.right{left:0;} +.carousel .active.left{left:-100%;} +.carousel .active.right{left:100%;} +.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} +.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} +.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);} +.carousel-caption h4,.carousel-caption p{color:#ffffff;} +.hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;} +.hero-unit p{font-size:18px;font-weight:200;line-height:27px;} +.pull-right{float:right;} +.pull-left{float:left;} +.hide{display:none;} +.show{display:block;} +.invisible{visibility:hidden;} diff --git a/public/css/style.css b/public/css/style.css new file mode 100644 index 00000000..28af8659 --- /dev/null +++ b/public/css/style.css @@ -0,0 +1,37 @@ +body { + padding-top: 60px; + padding-bottom: 40px; +} + +.zf-green { + color: #68b604; +} + +.btn-success { + background-color: #57a900; + background-image: -moz-linear-gradient(top, #70d900, #57a900); + background-image: -ms-linear-gradient(top, #70d900, #57a900); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#70d900), to(#57a900)); + background-image: -webkit-linear-gradient(top, #70d900, #57a900); + background-image: -o-linear-gradient(top, #70d900, #57a900); + background-image: linear-gradient(top, #70d900, #57a900); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#70d900', endColorstr='#57a900', GradientType=0); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #57a900; +} + +.btn-success:active, .btn-success.active { + background-color: #57a900; +} + +div.container a.brand { + background: url("../images/zf2-logo.png") no-repeat scroll 0 10px transparent; + margin-left: 0; + padding: 8px 20px 12px 40px; +} diff --git a/public/images/favicon.ico b/public/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..17f119909ffcba66c8a48cba1050d724ab0a51aa GIT binary patch literal 1406 zcmeH{u@S;B3`L(4!_kq77D~2&f)%m@8>CIi3Rxj5&{O4(F&KaWl5ZuLa4BgmpX9H9 z`YL`QaC$|7#dQTcp`$WT2c=`93TJ2EqV#>w00001b5ch_0Itp) z=>Px#24YJ`L;!yP_W%GgN~tse000SaNLh0L04^f{04^f|c%?sf00007bV*G`2iyV+ z0u~zPmpWDe00Lr3L_t(I%azo>i(FL{2k_6yUMCTM712~SHnN3^LXZ#>#6mD{K>q+S zX(BTq2r-aC&_W?)Kx6SHAYz+Fn|-UGg{D#q@kj43WQ(W}QBZutvDmjev$Joqn*)z` zx!n6b_xnBHb7I_-lIg1mkJx`4z((?5a5tV$o(yi!+&@Tx2+;xVFVZx_aXf%ea3pTw zz=& z*KA7NE5{=1(-GdEtJD{D)gIf$xG8VowH+1R9lzF9d;hp8Cvg#v;TN1QJ&Es)a4EB6 zlK#nXw&z@AdSR|r`@17O)2%PzXt!R)mC_@{hd3M|rRdt~`z5`4L;AAE*sb(4E>DKr zcVERJ{Dg0?5({kJiSSaU?AW|pSMAxQrfkZjWC_xn=92RG&mP?K#vF4 za9gH`@MmYF>p7EgOP%X=)!yiw{*-V5$C87=q2#_v)&Aa-_&C;awXWJ1OP6>h_%s*lEe?=BYch#lx|Y3run(); diff --git a/public/js/html5.js b/public/js/html5.js new file mode 100644 index 00000000..6692336c --- /dev/null +++ b/public/js/html5.js @@ -0,0 +1,4 @@ +// iepp v2.1pre @jon_neal & @aFarkas github.com/aFarkas/iepp +// html5shiv @rem remysharp.com/html5-enabling-script +// Dual licensed under the MIT or GPL Version 2 licenses +/*@cc_on(function(a,b){function r(a){var b=-1;while(++b").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( +a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f +.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); diff --git a/vendor/.gitignore b/vendor/.gitignore new file mode 100644 index 00000000..4578c85a --- /dev/null +++ b/vendor/.gitignore @@ -0,0 +1,5 @@ +!.gitignore +.composer +composer +zendframework +autoload.php diff --git a/vendor/README.md b/vendor/README.md new file mode 100644 index 00000000..52144c94 --- /dev/null +++ b/vendor/README.md @@ -0,0 +1 @@ +This vendor/ directory is where third-party modules should be installed. diff --git a/vendor/doctrine/common/.gitignore b/vendor/doctrine/common/.gitignore new file mode 100644 index 00000000..fb5e79d6 --- /dev/null +++ b/vendor/doctrine/common/.gitignore @@ -0,0 +1,4 @@ +build/ +logs/ +reports/ +dist/ diff --git a/vendor/doctrine/common/.gitmodules b/vendor/doctrine/common/.gitmodules new file mode 100644 index 00000000..51f08435 --- /dev/null +++ b/vendor/doctrine/common/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/vendor/doctrine-build-common"] + path = lib/vendor/doctrine-build-common + url = git://github.com/doctrine/doctrine-build-common.git diff --git a/vendor/doctrine/common/.travis.yml b/vendor/doctrine/common/.travis.yml new file mode 100644 index 00000000..4464d4f7 --- /dev/null +++ b/vendor/doctrine/common/.travis.yml @@ -0,0 +1,5 @@ +language: php + +php: + - 5.3 + - 5.4 diff --git a/vendor/doctrine/common/LICENSE b/vendor/doctrine/common/LICENSE new file mode 100644 index 00000000..1c03f74b --- /dev/null +++ b/vendor/doctrine/common/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/vendor/doctrine/common/README.md b/vendor/doctrine/common/README.md new file mode 100644 index 00000000..c63f7627 --- /dev/null +++ b/vendor/doctrine/common/README.md @@ -0,0 +1,12 @@ +# Doctrine Common + +[![Build Status](https://secure.travis-ci.org/doctrine/common.png)](http://travis-ci.org/doctrine/common) + +The Doctrine Common project is a library that provides extensions to core PHP functionality. + +## More resources: + +* [Website](http://www.doctrine-project.org) +* [Documentation](http://www.doctrine-project.org/projects/common/current/docs/en) +* [Issue Tracker](http://www.doctrine-project.org/jira/browse/DCOM) +* [Downloads](http://github.com/doctrine/common/downloads) diff --git a/vendor/doctrine/common/UPGRADE_TO_2_1 b/vendor/doctrine/common/UPGRADE_TO_2_1 new file mode 100644 index 00000000..891a2e5c --- /dev/null +++ b/vendor/doctrine/common/UPGRADE_TO_2_1 @@ -0,0 +1,39 @@ +This document details all the possible changes that you should investigate when updating +your project from Doctrine Common 2.0.x to 2.1 + +## AnnotationReader changes + +The annotation reader was heavily refactored between 2.0 and 2.1-RC1. In theory the operation of the new reader should be backwards compatible, but it has to be setup differently to work that way: + + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\'); + // new code necessary starting here + $reader->setIgnoreNotImportedAnnotations(true); + $reader->setEnableParsePhpImports(false); + $reader = new \Doctrine\Common\Annotations\CachedReader( + new \Doctrine\Common\Annotations\IndexedReader($reader), new ArrayCache() + ); + +## Annotation Base class or @Annotation + +Beginning after 2.1-RC2 you have to either extend ``Doctrine\Common\Annotations\Annotation`` or add @Annotation to your annotations class-level docblock, otherwise the class will simply be ignored. + +## Removed methods on AnnotationReader + +* AnnotationReader::setAutoloadAnnotations() +* AnnotationReader::getAutoloadAnnotations() +* AnnotationReader::isAutoloadAnnotations() + +## AnnotationRegistry + +Autoloading through the PHP autoloader is removed from the 2.1 AnnotationReader. Instead you have to use the global AnnotationRegistry for loading purposes: + + \Doctrine\Common\Annotations\AnnotationRegistry::registerFile($fileWithAnnotations); + \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespace($namespace, $dirs = null); + \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespaces($namespaces); + \Doctrine\Common\Annotations\AnnotationRegistry::registerLoader($callable); + +The $callable for registering a loader accepts a class as first and only parameter and must try to silently autoload it. On success true has to be returned. +The registerAutoloadNamespace function registers a PSR-0 compatible silent autoloader for all classes with the given namespace in the given directories. +If null is passed as directory the include path will be used. + diff --git a/vendor/doctrine/common/UPGRADE_TO_2_2 b/vendor/doctrine/common/UPGRADE_TO_2_2 new file mode 100644 index 00000000..1d93a131 --- /dev/null +++ b/vendor/doctrine/common/UPGRADE_TO_2_2 @@ -0,0 +1,61 @@ +This document details all the possible changes that you should investigate when +updating your project from Doctrine Common 2.1 to 2.2: + +## Annotation Changes + +- AnnotationReader::setIgnoreNotImportedAnnotations has been removed, you need to + add ignore annotation names which are supposed to be ignored via + AnnotationReader::addGlobalIgnoredName + +- AnnotationReader::setAutoloadAnnotations was deprecated by the AnnotationRegistry + in 2.1 and has been removed in 2.2 + +- AnnotationReader::setEnableParsePhpImports was added to ease transition to the new + annotation mechanism in 2.1 and is removed in 2.2 + +- AnnotationReader::isParsePhpImportsEnabled is removed (see above) + +- AnnotationReader::setDefaultAnnotationNamespace was deprecated in favor of explicit + configuration in 2.1 and will be removed in 2.2 (for isolated projects where you + have full-control over _all_ available annotations, we offer a dedicated reader + class ``SimpleAnnotationReader``) + +- AnnotationReader::setAnnotationCreationFunction was deprecated in 2.1 and will be + removed in 2.2. We only offer two creation mechanisms which cannot be changed + anymore to allow the same reader instance to work with all annotations regardless + of which library they are coming from. + +- AnnotationReader::setAnnotationNamespaceAlias was deprecated in 2.1 and will be + removed in 2.2 (see setDefaultAnnotationNamespace) + +- If you use a class as annotation which has not the @Annotation marker in it's + class block, we will now throw an exception instead of silently ignoring it. You + can however still achieve the previous behavior using the @IgnoreAnnotation, or + AnnotationReader::addGlobalIgnoredName (the exception message will contain detailed + instructions when you run into this problem). + +## Cache Changes + +- Renamed old AbstractCache to CacheProvider + +- Dropped the support to the following functions of all cache providers: + + - CacheProvider::deleteByWildcard + + - CacheProvider::deleteByRegEx + + - CacheProvider::deleteByPrefix + + - CacheProvider::deleteBySuffix + +- CacheProvider::deleteAll will not remove ALL entries, it will only mark them as invalid + +- CacheProvider::flushAll will remove ALL entries, namespaced or not + +- Added support to MemcachedCache + +- Added support to WincacheCache + +## ClassLoader Changes + +- ClassLoader::fileExistsInIncludePath() no longer exists. Use the native stream_resolve_include_path() PHP function \ No newline at end of file diff --git a/vendor/doctrine/common/build.properties b/vendor/doctrine/common/build.properties new file mode 100644 index 00000000..ff311a45 --- /dev/null +++ b/vendor/doctrine/common/build.properties @@ -0,0 +1,6 @@ +# Project Name +project.name=DoctrineCommon + +# Version class and file +project.version_class = Doctrine\Common\Version +project.version_file = lib/Doctrine/Common/Version.php diff --git a/vendor/doctrine/common/build.xml b/vendor/doctrine/common/build.xml new file mode 100644 index 00000000..71a9a500 --- /dev/null +++ b/vendor/doctrine/common/build.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DoctrineCommon + Doctrine Common PHP Extensions + pear.doctrine-project.org + The Doctrine Common package contains shared code between the other packages. + + + + + LGPL + + + - + + + + + + + diff --git a/vendor/doctrine/common/composer.json b/vendor/doctrine/common/composer.json new file mode 100644 index 00000000..f995f6c6 --- /dev/null +++ b/vendor/doctrine/common/composer.json @@ -0,0 +1,21 @@ +{ + "name": "doctrine/common", + "type": "library","version":"2.2.3", + "description": "Common Library for Doctrine projects", + "keywords": ["collections", "spl", "eventmanager", "annotations", "persistence"], + "homepage": "http://www.doctrine-project.org", + "license": "LGPL", + "authors": [ + {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"}, + {"name": "Roman Borschel", "email": "roman@code-factory.org"}, + {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"}, + {"name": "Jonathan Wage", "email": "jonwage@gmail.com"}, + {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"} + ], + "require": { + "php": ">=5.3.2" + }, + "autoload": { + "psr-0": { "Doctrine\\Common": "lib/" } + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php new file mode 100644 index 00000000..62512522 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php @@ -0,0 +1,75 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Annotations class + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class Annotation +{ + /** + * Value property. Common among all derived classes. + * + * @var string + */ + public $value; + + /** + * Constructor + * + * @param array $data Key-value for properties to be defined in this class + */ + public final function __construct(array $data) + { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + /** + * Error handler for unknown property accessor in Annotation class. + * + * @param string $name Unknown property name + */ + public function __get($name) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } + + /** + * Error handler for unknown property mutator in Annotation class. + * + * @param string $name Unkown property name + * @param mixed $value Property value + */ + public function __set($name, $value) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php new file mode 100644 index 00000000..21597b14 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php @@ -0,0 +1,47 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the attribute type during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attribute +{ + /** + * @var string + */ + public $name; + + /** + * @var string + */ + public $type; + + /** + * @var boolean + */ + public $required = false; +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php new file mode 100644 index 00000000..6e314be4 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php @@ -0,0 +1,37 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the types of all declared attributes during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attributes +{ + /** + * @var array + */ + public $value; +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php new file mode 100644 index 00000000..1b2b20ac --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php @@ -0,0 +1,44 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser to ignore specific + * annotations during the parsing process. + * + * @Annotation + * @author Johannes M. Schmitt + */ +final class IgnoreAnnotation +{ + public $names; + + public function __construct(array $values) + { + if (is_string($values['value'])) { + $values['value'] = array($values['value']); + } + if (!is_array($values['value'])) { + throw new \RuntimeException(sprintf('@IgnoreAnnotation expects either a string name, or an array of strings, but got %s.', json_encode($values['value']))); + } + + $this->names = $values['value']; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php new file mode 100644 index 00000000..7b89a022 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php @@ -0,0 +1,33 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check if that attribute is required during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Required +{ +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php new file mode 100644 index 00000000..c41896ad --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php @@ -0,0 +1,105 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the annotation target during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Target +{ + const TARGET_CLASS = 1; + const TARGET_METHOD = 2; + const TARGET_PROPERTY = 4; + const TARGET_ANNOTATION = 8; + const TARGET_ALL = 15; + + /** + * @var array + */ + private static $map = array( + 'ALL' => self::TARGET_ALL, + 'CLASS' => self::TARGET_CLASS, + 'METHOD' => self::TARGET_METHOD, + 'PROPERTY' => self::TARGET_PROPERTY, + 'ANNOTATION' => self::TARGET_ANNOTATION, + ); + + /** + * @var array + */ + public $value; + + /** + * Targets as bitmask. + * + * @var integer + */ + public $targets; + + /** + * Literal target declaration. + * + * @var integer + */ + public $literal; + + /** + * Annotation construct + * + * @param array $values + */ + public function __construct(array $values) + { + if (!isset($values['value'])){ + $values['value'] = null; + } + if (is_string($values['value'])){ + $values['value'] = array($values['value']); + } + if (!is_array($values['value'])){ + throw new \InvalidArgumentException( + sprintf('@Target expects either a string value, or an array of strings, "%s" given.', + is_object($values['value']) ? get_class($values['value']) : gettype($values['value']) + ) + ); + } + + $bitmask = 0; + foreach ($values['value'] as $literal) { + if(!isset(self::$map[$literal])){ + throw new \InvalidArgumentException( + sprintf('Invalid Target "%s". Available targets: [%s]', + $literal, implode(', ', array_keys(self::$map))) + ); + } + $bitmask += self::$map[$literal]; + } + + $this->targets = $bitmask; + $this->value = $values['value']; + $this->literal = implode(', ', $this->value); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php new file mode 100644 index 00000000..fdc1913a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php @@ -0,0 +1,111 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Description of AnnotationException + * + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class AnnotationException extends \Exception +{ + /** + * Creates a new AnnotationException describing a Syntax error. + * + * @param string $message Exception message + * @return AnnotationException + */ + public static function syntaxError($message) + { + return new self('[Syntax Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing a Semantical error. + * + * @param string $message Exception message + * @return AnnotationException + */ + public static function semanticalError($message) + { + return new self('[Semantical Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing an error which occurred during + * the creation of the annotation. + * + * @since 2.2 + * @param string $message + * @return AnnotationException + */ + public static function creationError($message) + { + return new self('[Creation Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing an type error of an attribute. + * + * @since 2.2 + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * @param mixed $actual + * @return AnnotationException + */ + public static function typeError($attributeName, $annotationName, $context, $expected, $actual) + { + return new self(sprintf( + '[Type Error] Attribute "%s" of @%s declared on %s expects %s, but got %s.', + $attributeName, + $annotationName, + $context, + $expected, + is_object($actual) ? 'an instance of '.get_class($actual) : gettype($actual) + )); + } + + /** + * Creates a new AnnotationException describing an required error of an attribute. + * + * @since 2.2 + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * @return AnnotationException + */ + public static function requiredError($attributeName, $annotationName, $context, $expected) + { + return new self(sprintf( + '[Type Error] Attribute "%s" of @%s declared on %s expects %s. This value should not be null.', + $attributeName, + $annotationName, + $context, + $expected + )); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php new file mode 100644 index 00000000..be87728b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php @@ -0,0 +1,303 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\IgnoreAnnotation; +use Doctrine\Common\Annotations\Annotation\Target; +use Closure; +use ReflectionClass; +use ReflectionMethod; +use ReflectionProperty; + +/** + * A reader for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +final class AnnotationReader implements Reader +{ + /** + * Global map for imports. + * + * @var array + */ + private static $globalImports = array( + 'ignoreannotation' => 'Doctrine\Common\Annotations\Annotation\IgnoreAnnotation', + ); + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names are case sensitive. + * + * @var array + */ + private static $globalIgnoredNames = array( + 'access'=> true, 'author'=> true, 'copyright'=> true, 'deprecated'=> true, + 'example'=> true, 'ignore'=> true, 'internal'=> true, 'link'=> true, 'see'=> true, + 'since'=> true, 'tutorial'=> true, 'version'=> true, 'package'=> true, + 'subpackage'=> true, 'name'=> true, 'global'=> true, 'param'=> true, + 'return'=> true, 'staticvar'=> true, 'category'=> true, 'staticVar'=> true, + 'static'=> true, 'var'=> true, 'throws'=> true, 'inheritdoc'=> true, + 'inheritDoc'=> true, 'license'=> true, 'todo'=> true, 'deprecated'=> true, + 'deprec'=> true, 'author'=> true, 'property' => true, 'method' => true, + 'abstract'=> true, 'exception'=> true, 'magic' => true, 'api' => true, + 'final'=> true, 'filesource'=> true, 'throw' => true, 'uses' => true, + 'usedby'=> true, 'private' => true, 'Annotation' => true, 'override' => true, + 'codeCoverageIgnore' => true, 'codeCoverageIgnoreStart' => true, 'codeCoverageIgnoreEnd' => true, + 'Required' => true, 'Attribute' => true, 'Attributes' => true, + 'Target' => true, 'SuppressWarnings' => true, + 'ingroup' => true, 'code' => true, 'endcode' => true, + 'package_version' => true, + ); + + /** + * Add a new annotation to the globally ignored annotation names with regard to exception handling. + * + * @param string $name + */ + static public function addGlobalIgnoredName($name) + { + self::$globalIgnoredNames[$name] = true; + } + + /** + * Annotations Parser + * + * @var Doctrine\Common\Annotations\DocParser + */ + private $parser; + + /** + * Annotations Parser used to collect parsing metadata + * + * @var Doctrine\Common\Annotations\DocParser + */ + private $preParser; + + /** + * PHP Parser used to collect imports. + * + * @var Doctrine\Common\Annotations\PhpParser + */ + private $phpParser; + + /** + * In-memory cache mechanism to store imported annotations per class. + * + * @var array + */ + private $imports = array(); + + /** + * In-memory cache mechanism to store ignored annotations per class. + * + * @var array + */ + private $ignoredAnnotationNames = array(); + + /** + * Constructor. + * + * Initializes a new AnnotationReader. + */ + public function __construct() + { + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/IgnoreAnnotation.php'); + + $this->parser = new DocParser; + + $this->preParser = new DocParser; + $this->preParser->setImports(self::$globalImports); + $this->preParser->setIgnoreNotImportedAnnotations(true); + + $this->phpParser = new PhpParser; + } + + /** + * Gets the annotations applied to a class. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @return array An array of Annotations. + */ + public function getClassAnnotations(ReflectionClass $class) + { + $this->parser->setTarget(Target::TARGET_CLASS); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($class->getDocComment(), 'class ' . $class->getName()); + } + + /** + * Gets a class annotation. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getClassAnnotation(ReflectionClass $class, $annotationName) + { + $annotations = $this->getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets the annotations applied to a property. + * + * @param ReflectionProperty $property The ReflectionProperty of the property + * from which the annotations should be read. + * @return array An array of Annotations. + */ + public function getPropertyAnnotations(ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + $this->parser->setTarget(Target::TARGET_PROPERTY); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($property->getDocComment(), $context); + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets the annotations applied to a method. + * + * @param ReflectionMethod $property The ReflectionMethod of the method from which + * the annotations should be read. + * @return array An array of Annotations. + */ + public function getMethodAnnotations(ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + $this->parser->setTarget(Target::TARGET_METHOD); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($method->getDocComment(), $context); + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Returns the ignored annotations for the given class. + * + * @param ReflectionClass $class + * @return array + */ + private function getIgnoredAnnotationNames(ReflectionClass $class) + { + if (isset($this->ignoredAnnotationNames[$name = $class->getName()])) { + return $this->ignoredAnnotationNames[$name]; + } + $this->collectParsingMetadata($class); + + return $this->ignoredAnnotationNames[$name]; + } + + private function getImports(ReflectionClass $class) + { + if (isset($this->imports[$name = $class->getName()])) { + return $this->imports[$name]; + } + $this->collectParsingMetadata($class); + + return $this->imports[$name]; + } + + /** + * Collects parsing metadata for a given class + * + * @param ReflectionClass $class + */ + private function collectParsingMetadata(ReflectionClass $class) + { + $ignoredAnnotationNames = self::$globalIgnoredNames; + + $annotations = $this->preParser->parse($class->getDocComment(), 'class '.$class->name); + foreach ($annotations as $annotation) { + if ($annotation instanceof IgnoreAnnotation) { + foreach ($annotation->names AS $annot) { + $ignoredAnnotationNames[$annot] = true; + } + } + } + + $name = $class->getName(); + $this->imports[$name] = array_merge( + self::$globalImports, + $this->phpParser->parseClass($class), + array('__NAMESPACE__' => $class->getNamespaceName()) + ); + $this->ignoredAnnotationNames[$name] = $ignoredAnnotationNames; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php new file mode 100644 index 00000000..60b00f51 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php @@ -0,0 +1,129 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +final class AnnotationRegistry +{ + /** + * A map of namespaces to use for autoloading purposes based on a PSR-0 convention. + * + * Contains the namespace as key and an array of directories as value. If the value is NULL + * the include path is used for checking for the corresponding file. + * + * This autoloading mechanism does not utilize the PHP autoloading but implements autoloading on its own. + * + * @var array + */ + static private $autoloadNamespaces = array(); + + /** + * A map of autoloader callables. + * + * @var array + */ + static private $loaders = array(); + + static public function reset() + { + self::$autoloadNamespaces = array(); + self::$loaders = array(); + } + + static public function registerFile($file) + { + require_once $file; + } + + /** + * Add a namespace with one or many directories to look for files or null for the include path. + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param string $namespace + * @param string|array|null $dirs + */ + static public function registerAutoloadNamespace($namespace, $dirs = null) + { + self::$autoloadNamespaces[$namespace] = $dirs; + } + + /** + * Register multiple namespaces + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param array $namespaces + */ + static public function registerAutoloadNamespaces(array $namespaces) + { + self::$autoloadNamespaces = array_merge(self::$autoloadNamespaces, $namespaces); + } + + /** + * Register an autoloading callabale for annotations, much like spl_autoload_register(). + * + * NOTE: These class loaders HAVE to be silent when a class was not found! + * IMPORTANT: Loaders have to return true if they loaded a class that could contain the searched annotation class. + * + * @param callabale $callabale + */ + static public function registerLoader($callabale) + { + if (!is_callable($callabale)) { + throw new \InvalidArgumentException("A callable is expected in AnnotationRegistry::registerLoader()."); + } + self::$loaders[] = $callabale; + } + + /** + * Autoload an annotation class silently. + * + * @param string $class + * @return void + */ + static public function loadAnnotationClass($class) + { + foreach (self::$autoloadNamespaces AS $namespace => $dirs) { + if (strpos($class, $namespace) === 0) { + $file = str_replace("\\", DIRECTORY_SEPARATOR, $class) . ".php"; + if ($dirs === null) { + if ($path = stream_resolve_include_path($file)) { + require $path; + return true; + } + } else { + foreach((array)$dirs AS $dir) { + if (file_exists($dir . DIRECTORY_SEPARATOR . $file)) { + require $dir . DIRECTORY_SEPARATOR . $file; + return true; + } + } + } + } + } + + foreach (self::$loaders AS $loader) { + if (call_user_func($loader, $class) === true) { + return true; + } + } + return false; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php new file mode 100644 index 00000000..6ea47c6a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php @@ -0,0 +1,179 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Cache\Cache; + +/** + * A cache aware annotation reader. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + */ +final class CachedReader implements Reader +{ + private static $CACHE_SALT = '@[Annot]'; + + /** + * @var Reader + */ + private $delegate; + + /** + * @var Cache + */ + private $cache; + + /** + * @var boolean + */ + private $debug; + + /** + * @var array + */ + private $loadedAnnotations; + + /** + * @param Reader $reader + * @param Cache $cache + */ + public function __construct(Reader $reader, Cache $cache, $debug = false) + { + $this->delegate = $reader; + $this->cache = $cache; + $this->debug = $debug; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $cacheKey = $class->getName() . self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getClassAnnotations($class); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $cacheKey = $class->getName().'$'.$property->getName().self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getPropertyAnnotations($property); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $cacheKey = $class->getName().'#'.$method->getName().self::$CACHE_SALT; + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + // Attempt to grab data from cache + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + $annots = $this->delegate->getMethodAnnotations($method); + $this->cache->save($cacheKey, $annots); + $this->cache->save('[C]'.$cacheKey, time()); + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = array(); + } + + private function isCacheFresh($cacheKey, \ReflectionClass $class) + { + if (false === $filename = $class->getFilename()) { + return true; + } + + return $this->cache->fetch('[C]'.$cacheKey) >= filemtime($filename); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php new file mode 100644 index 00000000..c6223e36 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php @@ -0,0 +1,140 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Lexer; + +/** + * Simple lexer for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +final class DocLexer extends Lexer +{ + const T_NONE = 1; + const T_IDENTIFIER = 2; + const T_INTEGER = 3; + const T_STRING = 4; + const T_FLOAT = 5; + + const T_AT = 101; + const T_CLOSE_CURLY_BRACES = 102; + const T_CLOSE_PARENTHESIS = 103; + const T_COMMA = 104; + const T_EQUALS = 105; + const T_FALSE = 106; + const T_NAMESPACE_SEPARATOR = 107; + const T_OPEN_CURLY_BRACES = 108; + const T_OPEN_PARENTHESIS = 109; + const T_TRUE = 110; + const T_NULL = 111; + const T_COLON = 112; + + /** + * @inheritdoc + */ + protected function getCatchablePatterns() + { + return array( + '[a-z_][a-z0-9_:]*', + '(?:[+-]?[0-9]+(?:[\.][0-9]+)*)(?:[eE][+-]?[0-9]+)?', + '"(?:[^"]|"")*"', + ); + } + + /** + * @inheritdoc + */ + protected function getNonCatchablePatterns() + { + return array('\s+', '\*+', '(.)'); + } + + /** + * @inheritdoc + */ + protected function getType(&$value) + { + $type = self::T_NONE; + + // Checking numeric value + if (is_numeric($value)) { + return (strpos($value, '.') !== false || stripos($value, 'e') !== false) + ? self::T_FLOAT : self::T_INTEGER; + } + + if ($value[0] === '"') { + $value = str_replace('""', '"', substr($value, 1, strlen($value) - 2)); + + return self::T_STRING; + } else { + switch (strtolower($value)) { + case '@': + return self::T_AT; + + case ',': + return self::T_COMMA; + + case '(': + return self::T_OPEN_PARENTHESIS; + + case ')': + return self::T_CLOSE_PARENTHESIS; + + case '{': + return self::T_OPEN_CURLY_BRACES; + + case '}': + return self::T_CLOSE_CURLY_BRACES; + + case '=': + return self::T_EQUALS; + + case '\\': + return self::T_NAMESPACE_SEPARATOR; + + case 'true': + return self::T_TRUE; + + case 'false': + return self::T_FALSE; + + case 'null': + return self::T_NULL; + + case ':': + return self::T_COLON; + + default: + if (ctype_alpha($value[0]) || $value[0] === '_') { + return self::T_IDENTIFIER; + } + + break; + } + } + + return $type; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php new file mode 100644 index 00000000..9d16b176 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php @@ -0,0 +1,891 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Closure; +use ReflectionClass; +use Doctrine\Common\Annotations\Annotation\Target; +use Doctrine\Common\Annotations\Annotation\Attribute; +use Doctrine\Common\Annotations\Annotation\Attributes; + +/** + * A parser for docblock annotations. + * + * It is strongly discouraged to change the default annotation parsing process. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +final class DocParser +{ + /** + * An array of all valid tokens for a class name. + * + * @var array + */ + private static $classIdentifiers = array(DocLexer::T_IDENTIFIER, DocLexer::T_TRUE, DocLexer::T_FALSE, DocLexer::T_NULL); + + /** + * The lexer. + * + * @var Doctrine\Common\Annotations\DocLexer + */ + private $lexer; + + /** + * Current target context + * + * @var string + */ + private $target; + + /** + * Doc Parser used to collect annotation target + * + * @var Doctrine\Common\Annotations\DocParser + */ + private static $metadataParser; + + /** + * Flag to control if the current annotation is nested or not. + * + * @var boolean + */ + private $isNestedAnnotation = false; + + /** + * Hashmap containing all use-statements that are to be used when parsing + * the given doc block. + * + * @var array + */ + private $imports = array(); + + /** + * This hashmap is used internally to cache results of class_exists() + * look-ups. + * + * @var array + */ + private $classExists = array(); + + /** + * Whether annotations that have not been imported should be ignored. + * + * @var boolean + */ + private $ignoreNotImportedAnnotations = false; + + /** + * An array of default namespaces if operating in simple mode. + * + * @var array + */ + private $namespaces = array(); + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names must be the raw names as used in the class, not the fully qualified + * class names. + * + * @var array + */ + private $ignoredAnnotationNames = array(); + + /** + * @var string + */ + private $context = ''; + + /** + * Hash-map for caching annotation metadata + * @var array + */ + private static $annotationMetadata = array( + 'Doctrine\Common\Annotations\Annotation\Target' => array( + 'is_annotation' => true, + 'has_constructor' => true, + 'properties' => array(), + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'attribute_types' => array( + 'value' => array( + 'required' => false, + 'type' =>'array', + 'array_type'=>'string', + 'value' =>'array' + ) + ), + ), + 'Doctrine\Common\Annotations\Annotation\Attribute' => array( + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_ANNOTATION', + 'targets' => Target::TARGET_ANNOTATION, + 'default_property' => 'name', + 'properties' => array( + 'name' => 'name', + 'type' => 'type', + 'required' => 'required' + ), + 'attribute_types' => array( + 'value' => array( + 'required' => true, + 'type' =>'string', + 'value' =>'string' + ), + 'type' => array( + 'required' =>true, + 'type' =>'string', + 'value' =>'string' + ), + 'required' => array( + 'required' =>false, + 'type' =>'boolean', + 'value' =>'boolean' + ) + ), + ), + 'Doctrine\Common\Annotations\Annotation\Attributes' => array( + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'properties' => array( + 'value' => 'value' + ), + 'attribute_types' => array( + 'value' => array( + 'type' =>'array', + 'required' =>true, + 'array_type'=>'Doctrine\Common\Annotations\Annotation\Attribute', + 'value' =>'array' + ) + ), + ), + ); + + /** + * Hash-map for handle types declaration + * + * @var array + */ + private static $typeMap = array( + 'float' => 'double', + 'bool' => 'boolean', + // allow uppercase Boolean in honor of George Boole + 'Boolean' => 'boolean', + 'int' => 'integer', + ); + + /** + * Constructs a new DocParser. + */ + public function __construct() + { + $this->lexer = new DocLexer; + } + + /** + * Sets the annotation names that are ignored during the parsing process. + * + * The names are supposed to be the raw names as used in the class, not the + * fully qualified class names. + * + * @param array $names + */ + public function setIgnoredAnnotationNames(array $names) + { + $this->ignoredAnnotationNames = $names; + } + + public function setIgnoreNotImportedAnnotations($bool) + { + $this->ignoreNotImportedAnnotations = (Boolean) $bool; + } + + /** + * Sets the default namespaces. + * @param array $namespaces + */ + public function addNamespace($namespace) + { + if ($this->imports) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + $this->namespaces[] = $namespace; + } + + public function setImports(array $imports) + { + if ($this->namespaces) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + $this->imports = $imports; + } + + /** + * Sets current target context as bitmask. + * + * @param integer $target + */ + public function setTarget($target) + { + $this->target = $target; + } + + /** + * Parses the given docblock string for annotations. + * + * @param string $input The docblock string to parse. + * @param string $context The parsing context. + * @return array Array of annotations. If no annotations are found, an empty array is returned. + */ + public function parse($input, $context = '') + { + if (false === $pos = strpos($input, '@')) { + return array(); + } + + // also parse whatever character is before the @ + if ($pos > 0) { + $pos -= 1; + } + + $this->context = $context; + $this->lexer->setInput(trim(substr($input, $pos), '* /')); + $this->lexer->moveNext(); + + return $this->Annotations(); + } + + /** + * Attempts to match the given token with the current lookahead token. + * If they match, updates the lookahead token; otherwise raises a syntax error. + * + * @param int Token type. + * @return bool True if tokens match; false otherwise. + */ + private function match($token) + { + if ( ! $this->lexer->isNextToken($token) ) { + $this->syntaxError($this->lexer->getLiteral($token)); + } + + return $this->lexer->moveNext(); + } + + /** + * Attempts to match the current lookahead token with any of the given tokens. + * + * If any of them matches, this method updates the lookahead token; otherwise + * a syntax error is raised. + * + * @param array $tokens + * @return bool + */ + private function matchAny(array $tokens) + { + if ( ! $this->lexer->isNextTokenAny($tokens)) { + $this->syntaxError(implode(' or ', array_map(array($this->lexer, 'getLiteral'), $tokens))); + } + + return $this->lexer->moveNext(); + } + + /** + * Generates a new syntax error. + * + * @param string $expected Expected string. + * @param array $token Optional token. + * @throws SyntaxException + */ + private function syntaxError($expected, $token = null) + { + if ($token === null) { + $token = $this->lexer->lookahead; + } + + $message = "Expected {$expected}, got "; + + if ($this->lexer->lookahead === null) { + $message .= 'end of string'; + } else { + $message .= "'{$token['value']}' at position {$token['position']}"; + } + + if (strlen($this->context)) { + $message .= ' in ' . $this->context; + } + + $message .= '.'; + + throw AnnotationException::syntaxError($message); + } + + /** + * Attempt to check if a class exists or not. This never goes through the PHP autoloading mechanism + * but uses the {@link AnnotationRegistry} to load classes. + * + * @param string $fqcn + * @return boolean + */ + private function classExists($fqcn) + { + if (isset($this->classExists[$fqcn])) { + return $this->classExists[$fqcn]; + } + + // first check if the class already exists, maybe loaded through another AnnotationReader + if (class_exists($fqcn, false)) { + return $this->classExists[$fqcn] = true; + } + + // final check, does this class exist? + return $this->classExists[$fqcn] = AnnotationRegistry::loadAnnotationClass($fqcn); + } + + /** + * Collects parsing metadata for a given annotation class + * + * @param string $name The annotation name + */ + private function collectAnnotationMetadata($name) + { + if (self::$metadataParser == null){ + self::$metadataParser = new self(); + self::$metadataParser->setTarget(Target::TARGET_CLASS); + self::$metadataParser->setIgnoreNotImportedAnnotations(true); + self::$metadataParser->setImports(array( + 'target' => 'Doctrine\Common\Annotations\Annotation\Target', + 'attribute' => 'Doctrine\Common\Annotations\Annotation\Attribute', + 'attributes' => 'Doctrine\Common\Annotations\Annotation\Attributes' + )); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Target.php'); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attribute.php'); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attributes.php'); + } + + $class = new \ReflectionClass($name); + $docComment = $class->getDocComment(); + + // Sets default values for annotation metadata + $metadata = array( + 'default_property' => null, + 'has_constructor' => (null !== $constructor = $class->getConstructor()) && $constructor->getNumberOfParameters() > 0, + 'properties' => array(), + 'property_types' => array(), + 'attribute_types' => array(), + 'targets_literal' => null, + 'targets' => Target::TARGET_ALL, + 'is_annotation' => false !== strpos($docComment, '@Annotation'), + ); + + // verify that the class is really meant to be an annotation + if ($metadata['is_annotation']) { + foreach (self::$metadataParser->parse($docComment, 'class @' . $name) as $annotation) { + if ($annotation instanceof Target) { + $metadata['targets'] = $annotation->targets; + $metadata['targets_literal'] = $annotation->literal; + + } elseif ($annotation instanceof Attributes) { + foreach ($annotation->value as $attrib) { + // handle internal type declaration + $type = isset(self::$typeMap[$attrib->type]) ? self::$typeMap[$attrib->type] : $attrib->type; + + // handle the case if the property type is mixed + if ('mixed' !== $type) { + // Checks if the property has array + if (false !== $pos = strpos($type, '<')) { + $arrayType = substr($type, $pos+1, -1); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$attrib->name]['array_type'] = $arrayType; + } + + $metadata['attribute_types'][$attrib->name]['type'] = $type; + $metadata['attribute_types'][$attrib->name]['value'] = $attrib->type; + $metadata['attribute_types'][$attrib->name]['required'] = $attrib->required; + } + } + } + } + + // if not has a constructor will inject values into public properties + if (false === $metadata['has_constructor']) { + // collect all public properties + foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) { + $metadata['properties'][$property->name] = $property->name; + + // checks if the property has @var annotation + if ((false !== $propertyComment = $property->getDocComment()) + && false !== strpos($propertyComment, '@var') + && preg_match('/@var\s+([^\s]+)/',$propertyComment, $matches)) { + // literal type declaration + $value = $matches[1]; + + // handle internal type declaration + $type = isset(self::$typeMap[$value]) ? self::$typeMap[$value] : $value; + + // handle the case if the property type is mixed + if ('mixed' !== $type) { + // Checks if the property has @var array annotation + if (false !== $pos = strpos($type, '<')) { + $arrayType = substr($type, $pos+1, -1); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$property->name]['array_type'] = $arrayType; + } + + $metadata['attribute_types'][$property->name]['type'] = $type; + $metadata['attribute_types'][$property->name]['value'] = $value; + $metadata['attribute_types'][$property->name]['required'] = false !== strpos($propertyComment, '@Required'); + } + } + } + + // choose the first property as default property + $metadata['default_property'] = reset($metadata['properties']); + } + } + + self::$annotationMetadata[$name] = $metadata; + } + + /** + * Annotations ::= Annotation {[ "*" ]* [Annotation]}* + * + * @return array + */ + private function Annotations() + { + $annotations = array(); + + while (null !== $this->lexer->lookahead) { + if (DocLexer::T_AT !== $this->lexer->lookahead['type']) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is preceded by non-catchable pattern + if (null !== $this->lexer->token && $this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value'])) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is followed by either a namespace separator, or + // an identifier token + if ((null === $peek = $this->lexer->glimpse()) + || (DocLexer::T_NAMESPACE_SEPARATOR !== $peek['type'] && !in_array($peek['type'], self::$classIdentifiers, true)) + || $peek['position'] !== $this->lexer->lookahead['position'] + 1) { + $this->lexer->moveNext(); + continue; + } + + $this->isNestedAnnotation = false; + if (false !== $annot = $this->Annotation()) { + $annotations[] = $annot; + } + } + + return $annotations; + } + + /** + * Annotation ::= "@" AnnotationName ["(" [Values] ")"] + * AnnotationName ::= QualifiedName | SimpleName + * QualifiedName ::= NameSpacePart "\" {NameSpacePart "\"}* SimpleName + * NameSpacePart ::= identifier | null | false | true + * SimpleName ::= identifier | null | false | true + * + * @return mixed False if it is not a valid annotation. + */ + private function Annotation() + { + $this->match(DocLexer::T_AT); + + // check if we have an annotation + if ($this->lexer->isNextTokenAny(self::$classIdentifiers)) { + $this->lexer->moveNext(); + $name = $this->lexer->token['value']; + } else if ($this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) { + $name = ''; + } else { + $this->syntaxError('namespace separator or identifier'); + } + + while ($this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value']) && $this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) { + $this->match(DocLexer::T_NAMESPACE_SEPARATOR); + $this->matchAny(self::$classIdentifiers); + $name .= '\\'.$this->lexer->token['value']; + } + + // only process names which are not fully qualified, yet + // fully qualified names must start with a \ + $originalName = $name; + if ('\\' !== $name[0]) { + $alias = (false === $pos = strpos($name, '\\'))? $name : substr($name, 0, $pos); + + $found = false; + if ($this->namespaces) { + foreach ($this->namespaces as $namespace) { + if ($this->classExists($namespace.'\\'.$name)) { + $name = $namespace.'\\'.$name; + $found = true; + break; + } + } + } elseif (isset($this->imports[$loweredAlias = strtolower($alias)])) { + if (false !== $pos) { + $name = $this->imports[$loweredAlias].substr($name, $pos); + } else { + $name = $this->imports[$loweredAlias]; + } + $found = true; + } elseif (isset($this->imports['__NAMESPACE__']) && $this->classExists($this->imports['__NAMESPACE__'].'\\'.$name)) { + $name = $this->imports['__NAMESPACE__'].'\\'.$name; + $found = true; + } elseif ($this->classExists($name)) { + $found = true; + } + + if (!$found) { + if ($this->ignoreNotImportedAnnotations || isset($this->ignoredAnnotationNames[$name])) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s was never imported. Did you maybe forget to add a "use" statement for this annotation?', $name, $this->context)); + } + } + + if (!$this->classExists($name)) { + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s does not exist, or could not be auto-loaded.', $name, $this->context)); + } + + // at this point, $name contains the fully qualified class name of the + // annotation, and it is also guaranteed that this class exists, and + // that it is loaded + + + // collects the metadata annotation only if there is not yet + if (!isset(self::$annotationMetadata[$name])) { + $this->collectAnnotationMetadata($name); + } + + // verify that the class is really meant to be an annotation and not just any ordinary class + if (self::$annotationMetadata[$name]['is_annotation'] === false) { + if (isset($this->ignoredAnnotationNames[$originalName])) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The class "%s" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "%s". If it is indeed no annotation, then you need to add @IgnoreAnnotation("%s") to the _class_ doc comment of %s.', $name, $name, $originalName, $this->context)); + } + + //if target is nested annotation + $target = $this->isNestedAnnotation ? Target::TARGET_ANNOTATION : $this->target; + + // Next will be nested + $this->isNestedAnnotation = true; + + //if annotation does not support current target + if (0 === (self::$annotationMetadata[$name]['targets'] & $target) && $target) { + throw AnnotationException::semanticalError( + sprintf('Annotation @%s is not allowed to be declared on %s. You may only use this annotation on these code elements: %s.', + $originalName, $this->context, self::$annotationMetadata[$name]['targets_literal']) + ); + } + + $values = array(); + if ($this->lexer->isNextToken(DocLexer::T_OPEN_PARENTHESIS)) { + $this->match(DocLexer::T_OPEN_PARENTHESIS); + + if ( ! $this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) { + $values = $this->Values(); + } + + $this->match(DocLexer::T_CLOSE_PARENTHESIS); + } + + // checks all declared attributes + foreach (self::$annotationMetadata[$name]['attribute_types'] as $property => $type) { + if ($property === self::$annotationMetadata[$name]['default_property'] + && !isset($values[$property]) && isset($values['value'])) { + $property = 'value'; + } + + // handle a not given attribute or null value + if (!isset($values[$property])) { + if ($type['required']) { + throw AnnotationException::requiredError($property, $originalName, $this->context, 'a(n) '.$type['value']); + } + + continue; + } + + if ($type['type'] === 'array') { + // handle the case of a single value + if (!is_array($values[$property])) { + $values[$property] = array($values[$property]); + } + + // checks if the attribute has array type declaration, such as "array" + if (isset($type['array_type'])) { + foreach ($values[$property] as $item) { + if (gettype($item) !== $type['array_type'] && !$item instanceof $type['array_type']) { + throw AnnotationException::typeError($property, $originalName, $this->context, 'either a(n) '.$type['array_type'].', or an array of '.$type['array_type'].'s', $item); + } + } + } + } elseif (gettype($values[$property]) !== $type['type'] && !$values[$property] instanceof $type['type']) { + throw AnnotationException::typeError($property, $originalName, $this->context, 'a(n) '.$type['value'], $values[$property]); + } + } + + // check if the annotation expects values via the constructor, + // or directly injected into public properties + if (self::$annotationMetadata[$name]['has_constructor'] === true) { + return new $name($values); + } + + $instance = new $name(); + foreach ($values as $property => $value) { + if (!isset(self::$annotationMetadata[$name]['properties'][$property])) { + if ('value' !== $property) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not have a property named "%s". Available properties: %s', $originalName, $this->context, $property, implode(', ', self::$annotationMetadata[$name]['properties']))); + } + + // handle the case if the property has no annotations + if (!$property = self::$annotationMetadata[$name]['default_property']) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not accept any values, but got %s.', $originalName, $this->context, json_encode($values))); + } + } + + $instance->{$property} = $value; + } + + return $instance; + } + + /** + * Values ::= Array | Value {"," Value}* + * + * @return array + */ + private function Values() + { + $values = array(); + + // Handle the case of a single array as value, i.e. @Foo({....}) + if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { + $values['value'] = $this->Value(); + return $values; + } + + $values[] = $this->Value(); + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + $token = $this->lexer->lookahead; + $value = $this->Value(); + + if ( ! is_object($value) && ! is_array($value)) { + $this->syntaxError('Value', $token); + } + + $values[] = $value; + } + + foreach ($values as $k => $value) { + if (is_object($value) && $value instanceof \stdClass) { + $values[$value->name] = $value->value; + } else if ( ! isset($values['value'])){ + $values['value'] = $value; + } else { + if ( ! is_array($values['value'])) { + $values['value'] = array($values['value']); + } + + $values['value'][] = $value; + } + + unset($values[$k]); + } + + return $values; + } + + /** + * Value ::= PlainValue | FieldAssignment + * + * @return mixed + */ + private function Value() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type']) { + return $this->FieldAssignment(); + } + + return $this->PlainValue(); + } + + /** + * PlainValue ::= integer | string | float | boolean | Array | Annotation + * + * @return mixed + */ + private function PlainValue() + { + if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { + return $this->Arrayx(); + } + + if ($this->lexer->isNextToken(DocLexer::T_AT)) { + return $this->Annotation(); + } + + switch ($this->lexer->lookahead['type']) { + case DocLexer::T_STRING: + $this->match(DocLexer::T_STRING); + return $this->lexer->token['value']; + + case DocLexer::T_INTEGER: + $this->match(DocLexer::T_INTEGER); + return (int)$this->lexer->token['value']; + + case DocLexer::T_FLOAT: + $this->match(DocLexer::T_FLOAT); + return (float)$this->lexer->token['value']; + + case DocLexer::T_TRUE: + $this->match(DocLexer::T_TRUE); + return true; + + case DocLexer::T_FALSE: + $this->match(DocLexer::T_FALSE); + return false; + + case DocLexer::T_NULL: + $this->match(DocLexer::T_NULL); + return null; + + default: + $this->syntaxError('PlainValue'); + } + } + + /** + * FieldAssignment ::= FieldName "=" PlainValue + * FieldName ::= identifier + * + * @return array + */ + private function FieldAssignment() + { + $this->match(DocLexer::T_IDENTIFIER); + $fieldName = $this->lexer->token['value']; + + $this->match(DocLexer::T_EQUALS); + + $item = new \stdClass(); + $item->name = $fieldName; + $item->value = $this->PlainValue(); + + return $item; + } + + /** + * Array ::= "{" ArrayEntry {"," ArrayEntry}* [","] "}" + * + * @return array + */ + private function Arrayx() + { + $array = $values = array(); + + $this->match(DocLexer::T_OPEN_CURLY_BRACES); + $values[] = $this->ArrayEntry(); + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + + // optional trailing comma + if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) { + break; + } + + $values[] = $this->ArrayEntry(); + } + + $this->match(DocLexer::T_CLOSE_CURLY_BRACES); + + foreach ($values as $value) { + list ($key, $val) = $value; + + if ($key !== null) { + $array[$key] = $val; + } else { + $array[] = $val; + } + } + + return $array; + } + + /** + * ArrayEntry ::= Value | KeyValuePair + * KeyValuePair ::= Key ("=" | ":") PlainValue + * Key ::= string | integer + * + * @return array + */ + private function ArrayEntry() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type'] + || DocLexer::T_COLON === $peek['type']) { + $this->matchAny(array(DocLexer::T_INTEGER, DocLexer::T_STRING)); + + $key = $this->lexer->token['value']; + $this->matchAny(array(DocLexer::T_EQUALS, DocLexer::T_COLON)); + + return array($key, $this->PlainValue()); + } + + return array(null, $this->Value()); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php new file mode 100644 index 00000000..4a42b583 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php @@ -0,0 +1,209 @@ +. + */ + +namespace Doctrine\Common\Annotations; + + +/** + * File cache reader for annotations. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + */ +class FileCacheReader implements Reader +{ + /** + * @var Reader + */ + private $reader; + private $dir; + private $debug; + private $loadedAnnotations = array(); + + public function __construct(Reader $reader, $cacheDir, $debug = false) + { + $this->reader = $reader; + if (!is_dir($cacheDir) && !@mkdir($cacheDir, 0777, true)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist and could not be created.', $cacheDir)); + } + if (!is_writable($cacheDir)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" is not writable. Both, the webserver and the console user need access. You can manage access rights for multiple users with "chmod +a". If your system does not support this, check out the acl package.', $cacheDir)); + } + + $this->dir = rtrim($cacheDir, '\\/'); + $this->debug = $debug; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $key = $class->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + @unlink($path); + + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $key = $class->getName().'$'.$property->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + unlink($path); + + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $key = $class->getName().'#'.$method->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + unlink($path); + + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + private function saveCacheFile($path, $data) + { + file_put_contents($path, 'getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = array(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php new file mode 100644 index 00000000..1eea4921 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php @@ -0,0 +1,94 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Reader; + +/** + * Allows the reader to be used in-place of Doctrine's reader. + * + * @author Johannes M. Schmitt + */ +class IndexedReader implements Reader +{ + private $delegate; + + public function __construct(Reader $reader) + { + $this->delegate = $reader; + } + + public function getClassAnnotations(\ReflectionClass $class) + { + $annotations = array(); + foreach ($this->delegate->getClassAnnotations($class) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getClassAnnotation(\ReflectionClass $class, $annotation) + { + return $this->delegate->getClassAnnotation($class, $annotation); + } + + public function getMethodAnnotations(\ReflectionMethod $method) + { + $annotations = array(); + foreach ($this->delegate->getMethodAnnotations($method) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getMethodAnnotation(\ReflectionMethod $method, $annotation) + { + return $this->delegate->getMethodAnnotation($method, $annotation); + } + + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $annotations = array(); + foreach ($this->delegate->getPropertyAnnotations($property) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + public function getPropertyAnnotation(\ReflectionProperty $property, $annotation) + { + return $this->delegate->getPropertyAnnotation($property, $annotation); + } + + /** + * Proxy all methods to the delegate. + * + * @param type $method + * @param type $args + * @return type + */ + public function __call($method, $args) + { + return call_user_func_array(array($this->delegate, $method), $args); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php new file mode 100644 index 00000000..a14f8f5b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php @@ -0,0 +1,203 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use SplFileObject; + +/** + * Parses a file for namespaces/use/class declarations. + * + * @author Fabien Potencier + * @author Christian Kaps + */ +final class PhpParser +{ + /** + * The token list. + * + * @var array + */ + private $tokens; + + /** + * The number of tokens. + * + * @var int + */ + private $numTokens = 0; + + /** + * The current array pointer. + * + * @var int + */ + private $pointer = 0; + + /** + * Parses a class. + * + * @param \ReflectionClass $class A ReflectionClass object. + * @return array A list with use statements in the form (Alias => FQN). + */ + public function parseClass(\ReflectionClass $class) + { + if (false === $filename = $class->getFilename()) { + return array(); + } + + $content = $this->getFileContent($filename, $class->getStartLine()); + $namespace = str_replace('\\', '\\\\', $class->getNamespaceName()); + $content = preg_replace('/^.*?(\bnamespace\s+' . $namespace . '\s*[;{].*)$/s', '\\1', $content); + $this->tokens = token_get_all('numTokens = count($this->tokens); + $this->pointer = 0; + + $statements = $this->parseUseStatements($class->getNamespaceName()); + + return $statements; + } + + /** + * Get the content of the file right up to the given line number. + * + * @param string $filename The name of the file to load. + * @param int $lineNumber The number of lines to read from file. + * @return string The content of the file. + */ + private function getFileContent($filename, $lineNumber) + { + $content = ''; + $lineCnt = 0; + $file = new SplFileObject($filename); + while(!$file->eof()) { + if ($lineCnt++ == $lineNumber) { + break; + } + + $content .= $file->fgets(); + } + + return $content; + } + + /** + * Gets the next non whitespace and non comment token. + * + * @return array The token if exists, null otherwise. + */ + private function next() + { + for ($i = $this->pointer; $i < $this->numTokens; $i++) { + $this->pointer++; + if ($this->tokens[$i][0] === T_WHITESPACE || + $this->tokens[$i][0] === T_COMMENT || + $this->tokens[$i][0] === T_DOC_COMMENT) { + + continue; + } + + return $this->tokens[$i]; + } + + return null; + } + + /** + * Get all use statements. + * + * @param string $namespaceName The namespace name of the reflected class. + * @return array A list with all found use statements. + */ + private function parseUseStatements($namespaceName) + { + $statements = array(); + while (($token = $this->next())) { + if ($token[0] === T_USE) { + $statements = array_merge($statements, $this->parseUseStatement()); + continue; + } else if ($token[0] !== T_NAMESPACE || $this->parseNamespace() != $namespaceName) { + continue; + } + + // Get fresh array for new namespace. This is to prevent the parser to collect the use statements + // for a previous namespace with the same name. This is the case if a namespace is defined twice + // or if a namespace with the same name is commented out. + $statements = array(); + } + + return $statements; + } + + /** + * Get the namespace name. + * + * @return string The found namespace name. + */ + private function parseNamespace() + { + $namespace = ''; + while (($token = $this->next())){ + if ($token[0] === T_STRING || $token[0] === T_NS_SEPARATOR) { + $namespace .= $token[1]; + } else { + break; + } + } + + return $namespace; + } + + /** + * Parse a single use statement. + * + * @return array A list with all found class names for a use statement. + */ + private function parseUseStatement() + { + $class = ''; + $alias = ''; + $statements = array(); + $explicitAlias = false; + while (($token = $this->next())) { + $isNameToken = $token[0] === T_STRING || $token[0] === T_NS_SEPARATOR; + if (!$explicitAlias && $isNameToken) { + $class .= $token[1]; + $alias = $token[1]; + } else if ($explicitAlias && $isNameToken) { + $alias .= $token[1]; + } else if ($token[0] === T_AS) { + $explicitAlias = true; + $alias = ''; + } else if ($token === ',') { + $statements[strtolower($alias)] = $class; + $class = ''; + $alias = ''; + $explicitAlias = false; + } else if ($token === ';') { + $statements[strtolower($alias)] = $class; + break; + } else { + break; + } + } + + return $statements; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php new file mode 100644 index 00000000..8e85d392 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php @@ -0,0 +1,35 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Interface for annotation readers. + * + * @author Johannes M. Schmitt + */ +interface Reader +{ + function getClassAnnotations(\ReflectionClass $class); + function getClassAnnotation(\ReflectionClass $class, $annotationName); + function getMethodAnnotations(\ReflectionMethod $method); + function getMethodAnnotation(\ReflectionMethod $method, $annotationName); + function getPropertyAnnotations(\ReflectionProperty $property); + function getPropertyAnnotation(\ReflectionProperty $property, $annotationName); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php new file mode 100644 index 00000000..a13c7fa0 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php @@ -0,0 +1,152 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\Target; + +/** + * Simple Annotation Reader. + * + * This annotation reader is intended to be used in projects where you have + * full-control over all annotations that are available. + * + * @since 2.2 + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +class SimpleAnnotationReader implements Reader +{ + /** + * @var DocParser + */ + private $parser; + + /** + * Constructor. + * + * Initializes a new SimpleAnnotationReader. + */ + public function __construct() + { + $this->parser = new DocParser(); + $this->parser->setIgnoreNotImportedAnnotations(true); + } + + /** + * Adds a namespace in which we will look for annotations. + * + * @param string $namespace + */ + public function addNamespace($namespace) + { + $this->parser->addNamespace($namespace); + } + + /** + * Gets the annotations applied to a class. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @return array An array of Annotations. + */ + public function getClassAnnotations(\ReflectionClass $class) + { + return $this->parser->parse($class->getDocComment(), 'class '.$class->getName()); + } + + /** + * Gets the annotations applied to a method. + * + * @param ReflectionMethod $property The ReflectionMethod of the method from which + * the annotations should be read. + * @return array An array of Annotations. + */ + public function getMethodAnnotations(\ReflectionMethod $method) + { + return $this->parser->parse($method->getDocComment(), 'method '.$method->getDeclaringClass()->name.'::'.$method->getName().'()'); + } + + /** + * Gets the annotations applied to a property. + * + * @param ReflectionProperty $property The ReflectionProperty of the property + * from which the annotations should be read. + * @return array An array of Annotations. + */ + public function getPropertyAnnotations(\ReflectionProperty $property) + { + return $this->parser->parse($property->getDocComment(), 'property '.$property->getDeclaringClass()->name.'::$'.$property->getName()); + } + + /** + * Gets a class annotation. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php new file mode 100644 index 00000000..a59296f5 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php @@ -0,0 +1,97 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * APC cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class ApcCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return apc_fetch($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + $found = false; + + apc_fetch($id, $found); + + return $found; + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return (bool) apc_store($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return apc_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return apc_clear_cache() && apc_clear_cache('user'); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = apc_cache_info(); + $sma = apc_sma_info(); + + return array( + Cache::STATS_HITS => $info['num_hits'], + Cache::STATS_MISSES => $info['num_misses'], + Cache::STATS_UPTIME => $info['start_time'], + Cache::STATS_MEMORY_USAGE => $info['mem_size'], + Cache::STATS_MEMORY_AVAILIABLE => $sma['avail_mem'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php new file mode 100644 index 00000000..8a0b982b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php @@ -0,0 +1,96 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Array cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class ArrayCache extends CacheProvider +{ + /** + * @var array $data + */ + private $data = array(); + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return (isset($this->data[$id])) ? $this->data[$id] : false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return isset($this->data[$id]); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + $this->data[$id] = $data; + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + unset($this->data[$id]); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->data = array(); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php new file mode 100644 index 00000000..d303bde4 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php @@ -0,0 +1,102 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Interface for cache drivers. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Fabio B. Silva + */ +interface Cache +{ + const STATS_HITS = 'hits'; + const STATS_MISSES = 'misses'; + const STATS_UPTIME = 'uptime'; + const STATS_MEMORY_USAGE = 'memory_usage'; + const STATS_MEMORY_AVAILIABLE = 'memory_available'; + + /** + * Fetches an entry from the cache. + * + * @param string $id cache id The id of the cache entry to fetch. + * @return string The cached data or FALSE, if no cache entry exists for the given id. + */ + function fetch($id); + + /** + * Test if an entry exists in the cache. + * + * @param string $id cache id The cache id of the entry to check for. + * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. + */ + function contains($id); + + /** + * Puts data into the cache. + * + * @param string $id The cache id. + * @param string $data The cache entry/data. + * @param int $lifeTime The lifetime. If != 0, sets a specific lifetime for this cache entry (0 => infinite lifeTime). + * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. + */ + function save($id, $data, $lifeTime = 0); + + /** + * Deletes a cache entry. + * + * @param string $id cache id + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + function delete($id); + + /** + * Retrieves cached information from data store + * + * The server's statistics array has the following values: + * + * - hits + * Number of keys that have been requested and found present. + * + * - misses + * Number of items that have been requested and not found. + * + * - uptime + * Time that the server is running. + * + * - memory_usage + * Memory used by this server to store items. + * + * - memory_available + * Memory allowed to use for storage. + * + * @since 2.2 + * @var array Associative array with server's statistics if available, NULL otherwise. + */ + function getStats(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php new file mode 100644 index 00000000..fa11fc22 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php @@ -0,0 +1,188 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Base class for cache provider implementations. + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Fabio B. Silva + */ +abstract class CacheProvider implements Cache +{ + const DOCTRINE_NAMESPACE_CACHEKEY = 'DoctrineNamespaceCacheKey[%s]'; + + /** + * @var string The namespace to prefix all cache ids with + */ + private $namespace = ''; + + /** + * Set the namespace to prefix all cache ids with. + * + * @param string $namespace + * @return void + */ + public function setNamespace($namespace) + { + $this->namespace = (string) $namespace; + } + + /** + * Retrieve the namespace that prefixes all cache ids. + * + * @return string + */ + public function getNamespace() + { + return $this->namespace; + } + + /** + * {@inheritdoc} + */ + public function fetch($id) + { + return $this->doFetch($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function contains($id) + { + return $this->doContains($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function save($id, $data, $lifeTime = 0) + { + return $this->doSave($this->getNamespacedId($id), $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + public function delete($id) + { + return $this->doDelete($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function getStats() + { + return $this->doGetStats(); + } + + /** + * Deletes all cache entries. + * + * @return boolean TRUE if the cache entries were successfully flushed, FALSE otherwise. + */ + public function flushAll() + { + return $this->doFlush(); + } + + /** + * Delete all cache entries. + * + * @return boolean TRUE if the cache entries were successfully deleted, FALSE otherwise. + */ + public function deleteAll() + { + $namespaceCacheKey = sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); + $namespaceVersion = ($this->doContains($namespaceCacheKey)) ? $this->doFetch($namespaceCacheKey) : 1; + + return $this->doSave($namespaceCacheKey, $namespaceVersion + 1); + } + + /** + * Prefix the passed id with the configured namespace value + * + * @param string $id The id to namespace + * @return string $id The namespaced id + */ + private function getNamespacedId($id) + { + $namespaceCacheKey = sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); + $namespaceVersion = ($this->doContains($namespaceCacheKey)) ? $this->doFetch($namespaceCacheKey) : 1; + + return sprintf('%s[%s][%s]', $this->namespace, $id, $namespaceVersion); + } + + /** + * Fetches an entry from the cache. + * + * @param string $id cache id The id of the cache entry to fetch. + * @return string The cached data or FALSE, if no cache entry exists for the given id. + */ + abstract protected function doFetch($id); + + /** + * Test if an entry exists in the cache. + * + * @param string $id cache id The cache id of the entry to check for. + * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. + */ + abstract protected function doContains($id); + + /** + * Puts data into the cache. + * + * @param string $id The cache id. + * @param string $data The cache entry/data. + * @param int $lifeTime The lifetime. If != false, sets a specific lifetime for this cache entry (null => infinite lifeTime). + * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. + */ + abstract protected function doSave($id, $data, $lifeTime = false); + + /** + * Deletes a cache entry. + * + * @param string $id cache id + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + abstract protected function doDelete($id); + + /** + * Deletes all cache entries. + * + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + abstract protected function doFlush(); + + /** + * Retrieves cached information from data store + * + * @since 2.2 + * @return array An associative array with server's statistics if available, NULL otherwise. + */ + abstract protected function doGetStats(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php new file mode 100644 index 00000000..dd6d1e31 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php @@ -0,0 +1,121 @@ +. + */ + +namespace Doctrine\Common\Cache; + +use \Memcache; + +/** + * Memcache cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class MemcacheCache extends CacheProvider +{ + /** + * @var Memcache + */ + private $memcache; + + /** + * Sets the memcache instance to use. + * + * @param Memcache $memcache + */ + public function setMemcache(Memcache $memcache) + { + $this->memcache = $memcache; + } + + /** + * Gets the memcache instance used by the cache. + * + * @return Memcache + */ + public function getMemcache() + { + return $this->memcache; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcache->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (bool) $this->memcache->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + return $this->memcache->set($id, $data, 0, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->memcache->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcache->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcache->getStats(); + return array( + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php new file mode 100644 index 00000000..4675fae7 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php @@ -0,0 +1,124 @@ +. + */ + +namespace Doctrine\Common\Cache; + +use \Memcached; + +/** + * Memcached cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class MemcachedCache extends CacheProvider +{ + /** + * @var Memcached + */ + private $memcached; + + /** + * Sets the memcache instance to use. + * + * @param Memcached $memcached + */ + public function setMemcached(Memcached $memcached) + { + $this->memcached = $memcached; + } + + /** + * Gets the memcached instance used by the cache. + * + * @return Memcached + */ + public function getMemcached() + { + return $this->memcached; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcached->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (false !== $this->memcached->get($id)); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + return $this->memcached->set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->memcached->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcached->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcached->getStats(); + $servers = $this->memcached->getServerList(); + $key = $servers[0]['host'] . ':' . $servers[0]['port']; + $stats = $stats[$key]; + return array( + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php new file mode 100644 index 00000000..ed8ca74a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php @@ -0,0 +1,92 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * WinCache cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class WincacheCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return wincache_ucache_get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return wincache_ucache_exists($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return (bool) wincache_ucache_set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return wincache_ucache_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return wincache_ucache_clear(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = wincache_ucache_info(); + $meminfo= wincache_ucache_meminfo(); + return array( + Cache::STATS_HITS => $info['total_hit_count'], + Cache::STATS_MISSES => $info['total_miss_count'], + Cache::STATS_UPTIME => $info['total_cache_uptime'], + Cache::STATS_MEMORY_USAGE => $meminfo['memory_total'], + Cache::STATS_MEMORY_AVAILIABLE => $meminfo['memory_free'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php new file mode 100644 index 00000000..6e22d265 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php @@ -0,0 +1,110 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Xcache cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class XcacheCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->doContains($id) ? unserialize(xcache_get($id)) : false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return xcache_isset($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return xcache_set($id, serialize($data), (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return xcache_unset($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->checkAuthorization(); + + xcache_clear_cache(XC_TYPE_VAR, 0); + + return true; + } + + /** + * Checks that xcache.admin.enable_auth is Off + * + * @throws \BadMethodCallException When xcache.admin.enable_auth is On + * @return void + */ + protected function checkAuthorization() + { + if (ini_get('xcache.admin.enable_auth')) { + throw new \BadMethodCallException('To use all features of \Doctrine\Common\Cache\XcacheCache, you must set "xcache.admin.enable_auth" to "Off" in your php.ini.'); + } + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $this->checkAuthorization(); + + $info = xcache_info(XC_TYPE_VAR, 0); + return array( + Cache::STATS_HITS => $info['hits'], + Cache::STATS_MISSES => $info['misses'], + Cache::STATS_UPTIME => null, + Cache::STATS_MEMORY_USAGE => $info['size'], + Cache::STATS_MEMORY_AVAILIABLE => $info['avail'], + ); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php new file mode 100644 index 00000000..4e4dabe7 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php @@ -0,0 +1,84 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Zend Data Cache cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Ralph Schindler + * @author Guilherme Blanco + */ +class ZendDataCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return zend_shm_cache_fetch($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (false !== zend_shm_cache_fetch($id)); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return zend_shm_cache_store($id, $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return zend_shm_cache_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $namespace = $this->getNamespace(); + if (empty($namespace)) { + return zend_shm_cache_clear(); + } + return zend_shm_cache_clear($namespace); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php new file mode 100644 index 00000000..375b0d6b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php @@ -0,0 +1,262 @@ +. + */ + +namespace Doctrine\Common; + +/** + * A ClassLoader is an autoloader for class files that can be + * installed on the SPL autoload stack. It is a class loader that either loads only classes + * of a specific namespace or all namespaces and it is suitable for working together + * with other autoloaders in the SPL autoload stack. + * + * If no include path is configured through the constructor or {@link setIncludePath}, a ClassLoader + * relies on the PHP include_path. + * + * @author Roman Borschel + * @since 2.0 + */ +class ClassLoader +{ + /** + * @var string PHP file extension + */ + protected $fileExtension = '.php'; + + /** + * @var string Current namespace + */ + protected $namespace; + + /** + * @var string Current include path + */ + protected $includePath; + + /** + * @var string PHP namespace separator + */ + protected $namespaceSeparator = '\\'; + + /** + * Creates a new ClassLoader that loads classes of the + * specified namespace from the specified include path. + * + * If no include path is given, the ClassLoader relies on the PHP include_path. + * If neither a namespace nor an include path is given, the ClassLoader will + * be responsible for loading all classes, thereby relying on the PHP include_path. + * + * @param string $ns The namespace of the classes to load. + * @param string $includePath The base include path to use. + */ + public function __construct($ns = null, $includePath = null) + { + $this->namespace = $ns; + $this->includePath = $includePath; + } + + /** + * Sets the namespace separator used by classes in the namespace of this ClassLoader. + * + * @param string $sep The separator to use. + */ + public function setNamespaceSeparator($sep) + { + $this->namespaceSeparator = $sep; + } + + /** + * Gets the namespace separator used by classes in the namespace of this ClassLoader. + * + * @return string + */ + public function getNamespaceSeparator() + { + return $this->namespaceSeparator; + } + + /** + * Sets the base include path for all class files in the namespace of this ClassLoader. + * + * @param string $includePath + */ + public function setIncludePath($includePath) + { + $this->includePath = $includePath; + } + + /** + * Gets the base include path for all class files in the namespace of this ClassLoader. + * + * @return string + */ + public function getIncludePath() + { + return $this->includePath; + } + + /** + * Sets the file extension of class files in the namespace of this ClassLoader. + * + * @param string $fileExtension + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * Gets the file extension of class files in the namespace of this ClassLoader. + * + * @return string + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Registers this ClassLoader on the SPL autoload stack. + */ + public function register() + { + spl_autoload_register(array($this, 'loadClass')); + } + + /** + * Removes this ClassLoader from the SPL autoload stack. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $classname The name of the class to load. + * @return boolean TRUE if the class has been successfully loaded, FALSE otherwise. + */ + public function loadClass($className) + { + if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) { + return false; + } + + require ($this->includePath !== null ? $this->includePath . DIRECTORY_SEPARATOR : '') + . str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) + . $this->fileExtension; + + return true; + } + + /** + * Asks this ClassLoader whether it can potentially load the class (file) with + * the given name. + * + * @param string $className The fully-qualified name of the class. + * @return boolean TRUE if this ClassLoader can load the class, FALSE otherwise. + */ + public function canLoadClass($className) + { + if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) { + return false; + } + + $file = str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) . $this->fileExtension; + + if ($this->includePath !== null) { + return file_exists($this->includePath . DIRECTORY_SEPARATOR . $file); + } + + return (false !== stream_resolve_include_path($file)); + } + + /** + * Checks whether a class with a given name exists. A class "exists" if it is either + * already defined in the current request or if there is an autoloader on the SPL + * autoload stack that is a) responsible for the class in question and b) is able to + * load a class file in which the class definition resides. + * + * If the class is not already defined, each autoloader in the SPL autoload stack + * is asked whether it is able to tell if the class exists. If the autoloader is + * a ClassLoader, {@link canLoadClass} is used, otherwise the autoload + * function of the autoloader is invoked and expected to return a value that + * evaluates to TRUE if the class (file) exists. As soon as one autoloader reports + * that the class exists, TRUE is returned. + * + * Note that, depending on what kinds of autoloaders are installed on the SPL + * autoload stack, the class (file) might already be loaded as a result of checking + * for its existence. This is not the case with a ClassLoader, who separates + * these responsibilities. + * + * @param string $className The fully-qualified name of the class. + * @return boolean TRUE if the class exists as per the definition given above, FALSE otherwise. + */ + public static function classExists($className) + { + if (class_exists($className, false) || interface_exists($className, false)) { + return true; + } + + foreach (spl_autoload_functions() as $loader) { + if (is_array($loader)) { // array(???, ???) + if (is_object($loader[0])) { + if ($loader[0] instanceof ClassLoader) { // array($obj, 'methodName') + if ($loader[0]->canLoadClass($className)) { + return true; + } + } else if ($loader[0]->{$loader[1]}($className)) { + return true; + } + } else if ($loader[0]::$loader[1]($className)) { // array('ClassName', 'methodName') + return true; + } + } else if ($loader instanceof \Closure) { // function($className) {..} + if ($loader($className)) { + return true; + } + } else if (is_string($loader) && $loader($className)) { // "MyClass::loadClass" + return true; + } + } + + return class_exists($className, false) || interface_exists($className, false); + } + + /** + * Gets the ClassLoader from the SPL autoload stack that is responsible + * for (and is able to load) the class with the given name. + * + * @param string $className The name of the class. + * @return The ClassLoader for the class or NULL if no such ClassLoader exists. + */ + public static function getClassLoader($className) + { + foreach (spl_autoload_functions() as $loader) { + if (is_array($loader) + && $loader[0] instanceof ClassLoader + && $loader[0]->canLoadClass($className) + ) { + return $loader[0]; + } + } + + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php new file mode 100644 index 00000000..2a7d4eaf --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php @@ -0,0 +1,447 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Closure, ArrayIterator; + +/** + * An ArrayCollection is a Collection implementation that wraps a regular PHP array. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class ArrayCollection implements Collection +{ + /** + * An array containing the entries of this collection. + * + * @var array + */ + private $_elements; + + /** + * Initializes a new ArrayCollection. + * + * @param array $elements + */ + public function __construct(array $elements = array()) + { + $this->_elements = $elements; + } + + /** + * Gets the PHP array representation of this collection. + * + * @return array The PHP array representation of this collection. + */ + public function toArray() + { + return $this->_elements; + } + + /** + * Sets the internal iterator to the first element in the collection and + * returns this element. + * + * @return mixed + */ + public function first() + { + return reset($this->_elements); + } + + /** + * Sets the internal iterator to the last element in the collection and + * returns this element. + * + * @return mixed + */ + public function last() + { + return end($this->_elements); + } + + /** + * Gets the current key/index at the current internal iterator position. + * + * @return mixed + */ + public function key() + { + return key($this->_elements); + } + + /** + * Moves the internal iterator position to the next element. + * + * @return mixed + */ + public function next() + { + return next($this->_elements); + } + + /** + * Gets the element of the collection at the current internal iterator position. + * + * @return mixed + */ + public function current() + { + return current($this->_elements); + } + + /** + * Removes an element with a specific key/index from the collection. + * + * @param mixed $key + * @return mixed The removed element or NULL, if no element exists for the given key. + */ + public function remove($key) + { + if (isset($this->_elements[$key])) { + $removed = $this->_elements[$key]; + unset($this->_elements[$key]); + + return $removed; + } + + return null; + } + + /** + * Removes the specified element from the collection, if it is found. + * + * @param mixed $element The element to remove. + * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. + */ + public function removeElement($element) + { + $key = array_search($element, $this->_elements, true); + + if ($key !== false) { + unset($this->_elements[$key]); + + return true; + } + + return false; + } + + /** + * ArrayAccess implementation of offsetExists() + * + * @see containsKey() + */ + public function offsetExists($offset) + { + return $this->containsKey($offset); + } + + /** + * ArrayAccess implementation of offsetGet() + * + * @see get() + */ + public function offsetGet($offset) + { + return $this->get($offset); + } + + /** + * ArrayAccess implementation of offsetGet() + * + * @see add() + * @see set() + */ + public function offsetSet($offset, $value) + { + if ( ! isset($offset)) { + return $this->add($value); + } + return $this->set($offset, $value); + } + + /** + * ArrayAccess implementation of offsetUnset() + * + * @see remove() + */ + public function offsetUnset($offset) + { + return $this->remove($offset); + } + + /** + * Checks whether the collection contains a specific key/index. + * + * @param mixed $key The key to check for. + * @return boolean TRUE if the given key/index exists, FALSE otherwise. + */ + public function containsKey($key) + { + return isset($this->_elements[$key]); + } + + /** + * Checks whether the given element is contained in the collection. + * Only element values are compared, not keys. The comparison of two elements + * is strict, that means not only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element + * @return boolean TRUE if the given element is contained in the collection, + * FALSE otherwise. + */ + public function contains($element) + { + foreach ($this->_elements as $collectionElement) { + if ($element === $collectionElement) { + return true; + } + } + + return false; + } + + /** + * Tests for the existance of an element that satisfies the given predicate. + * + * @param Closure $p The predicate. + * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. + */ + public function exists(Closure $p) + { + foreach ($this->_elements as $key => $element) { + if ($p($key, $element)) { + return true; + } + } + return false; + } + + /** + * Searches for a given element and, if found, returns the corresponding key/index + * of that element. The comparison of two elements is strict, that means not + * only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element The element to search for. + * @return mixed The key/index of the element or FALSE if the element was not found. + */ + public function indexOf($element) + { + return array_search($element, $this->_elements, true); + } + + /** + * Gets the element with the given key/index. + * + * @param mixed $key The key. + * @return mixed The element or NULL, if no element exists for the given key. + */ + public function get($key) + { + if (isset($this->_elements[$key])) { + return $this->_elements[$key]; + } + return null; + } + + /** + * Gets all keys/indexes of the collection elements. + * + * @return array + */ + public function getKeys() + { + return array_keys($this->_elements); + } + + /** + * Gets all elements. + * + * @return array + */ + public function getValues() + { + return array_values($this->_elements); + } + + /** + * Returns the number of elements in the collection. + * + * Implementation of the Countable interface. + * + * @return integer The number of elements in the collection. + */ + public function count() + { + return count($this->_elements); + } + + /** + * Adds/sets an element in the collection at the index / with the specified key. + * + * When the collection is a Map this is like put(key,value)/add(key,value). + * When the collection is a List this is like add(position,value). + * + * @param mixed $key + * @param mixed $value + */ + public function set($key, $value) + { + $this->_elements[$key] = $value; + } + + /** + * Adds an element to the collection. + * + * @param mixed $value + * @return boolean Always TRUE. + */ + public function add($value) + { + $this->_elements[] = $value; + return true; + } + + /** + * Checks whether the collection is empty. + * + * Note: This is preferrable over count() == 0. + * + * @return boolean TRUE if the collection is empty, FALSE otherwise. + */ + public function isEmpty() + { + return ! $this->_elements; + } + + /** + * Gets an iterator for iterating over the elements in the collection. + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_elements); + } + + /** + * Applies the given function to each element in the collection and returns + * a new collection with the elements returned by the function. + * + * @param Closure $func + * @return Collection + */ + public function map(Closure $func) + { + return new static(array_map($func, $this->_elements)); + } + + /** + * Returns all the elements of this collection that satisfy the predicate p. + * The order of the elements is preserved. + * + * @param Closure $p The predicate used for filtering. + * @return Collection A collection with the results of the filter operation. + */ + public function filter(Closure $p) + { + return new static(array_filter($this->_elements, $p)); + } + + /** + * Applies the given predicate p to all elements of this collection, + * returning true, if the predicate yields true for all elements. + * + * @param Closure $p The predicate. + * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. + */ + public function forAll(Closure $p) + { + foreach ($this->_elements as $key => $element) { + if ( ! $p($key, $element)) { + return false; + } + } + + return true; + } + + /** + * Partitions this collection in two collections according to a predicate. + * Keys are preserved in the resulting collections. + * + * @param Closure $p The predicate on which to partition. + * @return array An array with two elements. The first element contains the collection + * of elements where the predicate returned TRUE, the second element + * contains the collection of elements where the predicate returned FALSE. + */ + public function partition(Closure $p) + { + $coll1 = $coll2 = array(); + foreach ($this->_elements as $key => $element) { + if ($p($key, $element)) { + $coll1[$key] = $element; + } else { + $coll2[$key] = $element; + } + } + return array(new static($coll1), new static($coll2)); + } + + /** + * Returns a string representation of this object. + * + * @return string + */ + public function __toString() + { + return __CLASS__ . '@' . spl_object_hash($this); + } + + /** + * Clears the collection. + */ + public function clear() + { + $this->_elements = array(); + } + + /** + * Extract a slice of $length elements starting at position $offset from the Collection. + * + * If $length is null it returns all elements from $offset to the end of the Collection. + * Keys have to be preserved by this method. Calling this method will only return the + * selected slice and NOT change the elements contained in the collection slice is called on. + * + * @param int $offset + * @param int $length + * @return array + */ + public function slice($offset, $length = null) + { + return array_slice($this->_elements, $offset, $length, true); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php new file mode 100644 index 00000000..9fca659c --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php @@ -0,0 +1,243 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Closure, Countable, IteratorAggregate, ArrayAccess; + +/** + * The missing (SPL) Collection/Array/OrderedMap interface. + * + * A Collection resembles the nature of a regular PHP array. That is, + * it is essentially an ordered map that can also be used + * like a list. + * + * A Collection has an internal iterator just like a PHP array. In addition, + * a Collection can be iterated with external iterators, which is preferrable. + * To use an external iterator simply use the foreach language construct to + * iterate over the collection (which calls {@link getIterator()} internally) or + * explicitly retrieve an iterator though {@link getIterator()} which can then be + * used to iterate over the collection. + * You can not rely on the internal iterator of the collection being at a certain + * position unless you explicitly positioned it before. Prefer iteration with + * external iterators. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface Collection extends Countable, IteratorAggregate, ArrayAccess +{ + /** + * Adds an element at the end of the collection. + * + * @param mixed $element The element to add. + * @return boolean Always TRUE. + */ + function add($element); + + /** + * Clears the collection, removing all elements. + */ + function clear(); + + /** + * Checks whether an element is contained in the collection. + * This is an O(n) operation, where n is the size of the collection. + * + * @param mixed $element The element to search for. + * @return boolean TRUE if the collection contains the element, FALSE otherwise. + */ + function contains($element); + + /** + * Checks whether the collection is empty (contains no elements). + * + * @return boolean TRUE if the collection is empty, FALSE otherwise. + */ + function isEmpty(); + + /** + * Removes the element at the specified index from the collection. + * + * @param string|integer $key The kex/index of the element to remove. + * @return mixed The removed element or NULL, if the collection did not contain the element. + */ + function remove($key); + + /** + * Removes the specified element from the collection, if it is found. + * + * @param mixed $element The element to remove. + * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. + */ + function removeElement($element); + + /** + * Checks whether the collection contains an element with the specified key/index. + * + * @param string|integer $key The key/index to check for. + * @return boolean TRUE if the collection contains an element with the specified key/index, + * FALSE otherwise. + */ + function containsKey($key); + + /** + * Gets the element at the specified key/index. + * + * @param string|integer $key The key/index of the element to retrieve. + * @return mixed + */ + function get($key); + + /** + * Gets all keys/indices of the collection. + * + * @return array The keys/indices of the collection, in the order of the corresponding + * elements in the collection. + */ + function getKeys(); + + /** + * Gets all values of the collection. + * + * @return array The values of all elements in the collection, in the order they + * appear in the collection. + */ + function getValues(); + + /** + * Sets an element in the collection at the specified key/index. + * + * @param string|integer $key The key/index of the element to set. + * @param mixed $value The element to set. + */ + function set($key, $value); + + /** + * Gets a native PHP array representation of the collection. + * + * @return array + */ + function toArray(); + + /** + * Sets the internal iterator to the first element in the collection and + * returns this element. + * + * @return mixed + */ + function first(); + + /** + * Sets the internal iterator to the last element in the collection and + * returns this element. + * + * @return mixed + */ + function last(); + + /** + * Gets the key/index of the element at the current iterator position. + * + */ + function key(); + + /** + * Gets the element of the collection at the current iterator position. + * + */ + function current(); + + /** + * Moves the internal iterator position to the next element. + * + */ + function next(); + + /** + * Tests for the existence of an element that satisfies the given predicate. + * + * @param Closure $p The predicate. + * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. + */ + function exists(Closure $p); + + /** + * Returns all the elements of this collection that satisfy the predicate p. + * The order of the elements is preserved. + * + * @param Closure $p The predicate used for filtering. + * @return Collection A collection with the results of the filter operation. + */ + function filter(Closure $p); + + /** + * Applies the given predicate p to all elements of this collection, + * returning true, if the predicate yields true for all elements. + * + * @param Closure $p The predicate. + * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. + */ + function forAll(Closure $p); + + /** + * Applies the given function to each element in the collection and returns + * a new collection with the elements returned by the function. + * + * @param Closure $func + * @return Collection + */ + function map(Closure $func); + + /** + * Partitions this collection in two collections according to a predicate. + * Keys are preserved in the resulting collections. + * + * @param Closure $p The predicate on which to partition. + * @return array An array with two elements. The first element contains the collection + * of elements where the predicate returned TRUE, the second element + * contains the collection of elements where the predicate returned FALSE. + */ + function partition(Closure $p); + + /** + * Gets the index/key of a given element. The comparison of two elements is strict, + * that means not only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element The element to search for. + * @return mixed The key/index of the element or FALSE if the element was not found. + */ + function indexOf($element); + + /** + * Extract a slice of $length elements starting at position $offset from the Collection. + * + * If $length is null it returns all elements from $offset to the end of the Collection. + * Keys have to be preserved by this method. Calling this method will only return the + * selected slice and NOT change the elements contained in the collection slice is called on. + * + * @param int $offset + * @param int $length + * @return array + */ + function slice($offset, $length = null); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php new file mode 100644 index 00000000..8c5669be --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php @@ -0,0 +1,28 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Base exception class for package Doctrine\Common + * @author heinrich + * + */ +class CommonException extends \Exception { +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php new file mode 100644 index 00000000..bc95d303 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php @@ -0,0 +1,47 @@ +. + */ + + +namespace Doctrine\Common; + +/** + * Comparable interface that allows to compare two value objects to each other for similarity. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.com + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + */ +interface Comparable +{ + /** + * Compare the current object to the passed $other. + * + * Returns 0 if they are semantically equal, 1 if the other object + * is less than the current one, or -1 if its more than the current one. + * + * This method should not check for identity using ===, only for semantical equality for example + * when two different DateTime instances point to the exact same Date + TZ. + * + * @return int + */ + public function compareTo($other); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php new file mode 100644 index 00000000..6a3c0699 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php @@ -0,0 +1,69 @@ +. + */ + +namespace Doctrine\Common; + +/** + * EventArgs is the base class for classes containing event data. + * + * This class contains no event data. It is used by events that do not pass state + * information to an event handler when an event is raised. The single empty EventArgs + * instance can be obtained through {@link getEmptyInstance}. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class EventArgs +{ + /** + * @var EventArgs Single instance of EventArgs + * @static + */ + private static $_emptyEventArgsInstance; + + /** + * Gets the single, empty and immutable EventArgs instance. + * + * This instance will be used when events are dispatched without any parameter, + * like this: EventManager::dispatchEvent('eventname'); + * + * The benefit from this is that only one empty instance is instantiated and shared + * (otherwise there would be instances for every dispatched in the abovementioned form) + * + * @see EventManager::dispatchEvent + * @link http://msdn.microsoft.com/en-us/library/system.eventargs.aspx + * @static + * @return EventArgs + */ + public static function getEmptyInstance() + { + if ( ! self::$_emptyEventArgsInstance) { + self::$_emptyEventArgsInstance = new EventArgs; + } + + return self::$_emptyEventArgsInstance; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php new file mode 100644 index 00000000..a1f11ed2 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php @@ -0,0 +1,136 @@ +. + */ + +namespace Doctrine\Common; + +/** + * The EventManager is the central point of Doctrine's event listener system. + * Listeners are registered on the manager and events are dispatched through the + * manager. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class EventManager +{ + /** + * Map of registered listeners. + * => + * + * @var array + */ + private $_listeners = array(); + + /** + * Dispatches an event to all registered listeners. + * + * @param string $eventName The name of the event to dispatch. The name of the event is + * the name of the method that is invoked on listeners. + * @param EventArgs $eventArgs The event arguments to pass to the event handlers/listeners. + * If not supplied, the single empty EventArgs instance is used. + * @return boolean + */ + public function dispatchEvent($eventName, EventArgs $eventArgs = null) + { + if (isset($this->_listeners[$eventName])) { + $eventArgs = $eventArgs === null ? EventArgs::getEmptyInstance() : $eventArgs; + + foreach ($this->_listeners[$eventName] as $listener) { + $listener->$eventName($eventArgs); + } + } + } + + /** + * Gets the listeners of a specific event or all listeners. + * + * @param string $event The name of the event. + * @return array The event listeners for the specified event, or all event listeners. + */ + public function getListeners($event = null) + { + return $event ? $this->_listeners[$event] : $this->_listeners; + } + + /** + * Checks whether an event has any registered listeners. + * + * @param string $event + * @return boolean TRUE if the specified event has any listeners, FALSE otherwise. + */ + public function hasListeners($event) + { + return isset($this->_listeners[$event]) && $this->_listeners[$event]; + } + + /** + * Adds an event listener that listens on the specified events. + * + * @param string|array $events The event(s) to listen on. + * @param object $listener The listener object. + */ + public function addEventListener($events, $listener) + { + // Picks the hash code related to that listener + $hash = spl_object_hash($listener); + + foreach ((array) $events as $event) { + // Overrides listener if a previous one was associated already + // Prevents duplicate listeners on same event (same instance only) + $this->_listeners[$event][$hash] = $listener; + } + } + + /** + * Removes an event listener from the specified events. + * + * @param string|array $events + * @param object $listener + */ + public function removeEventListener($events, $listener) + { + // Picks the hash code related to that listener + $hash = spl_object_hash($listener); + + foreach ((array) $events as $event) { + // Check if actually have this listener associated + if (isset($this->_listeners[$event][$hash])) { + unset($this->_listeners[$event][$hash]); + } + } + } + + /** + * Adds an EventSubscriber. The subscriber is asked for all the events he is + * interested in and added as a listener for these events. + * + * @param Doctrine\Common\EventSubscriber $subscriber The subscriber. + */ + public function addEventSubscriber(EventSubscriber $subscriber) + { + $this->addEventListener($subscriber->getSubscribedEvents(), $subscriber); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php new file mode 100644 index 00000000..ed3383fa --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php @@ -0,0 +1,45 @@ +. + */ + +namespace Doctrine\Common; + +/** + * An EventSubscriber knows himself what events he is interested in. + * If an EventSubscriber is added to an EventManager, the manager invokes + * {@link getSubscribedEvents} and registers the subscriber as a listener for all + * returned events. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface EventSubscriber +{ + /** + * Returns an array of events this subscriber wants to listen to. + * + * @return array + */ + function getSubscribedEvents(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php new file mode 100644 index 00000000..8df3b843 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php @@ -0,0 +1,266 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Base class for writing simple lexers, i.e. for creating small DSLs. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @todo Rename: AbstractLexer + */ +abstract class Lexer +{ + /** + * @var array Array of scanned tokens + */ + private $tokens = array(); + + /** + * @var integer Current lexer position in input string + */ + private $position = 0; + + /** + * @var integer Current peek of current lexer position + */ + private $peek = 0; + + /** + * @var array The next token in the input. + */ + public $lookahead; + + /** + * @var array The last matched/seen token. + */ + public $token; + + /** + * Sets the input data to be tokenized. + * + * The Lexer is immediately reset and the new input tokenized. + * Any unprocessed tokens from any previous input are lost. + * + * @param string $input The input to be tokenized. + */ + public function setInput($input) + { + $this->tokens = array(); + $this->reset(); + $this->scan($input); + } + + /** + * Resets the lexer. + */ + public function reset() + { + $this->lookahead = null; + $this->token = null; + $this->peek = 0; + $this->position = 0; + } + + /** + * Resets the peek pointer to 0. + */ + public function resetPeek() + { + $this->peek = 0; + } + + /** + * Resets the lexer position on the input to the given position. + * + * @param integer $position Position to place the lexical scanner + */ + public function resetPosition($position = 0) + { + $this->position = $position; + } + + /** + * Checks whether a given token matches the current lookahead. + * + * @param integer|string $token + * @return boolean + */ + public function isNextToken($token) + { + return null !== $this->lookahead && $this->lookahead['type'] === $token; + } + + /** + * Checks whether any of the given tokens matches the current lookahead + * + * @param array $tokens + * @return boolean + */ + public function isNextTokenAny(array $tokens) + { + return null !== $this->lookahead && in_array($this->lookahead['type'], $tokens, true); + } + + /** + * Moves to the next token in the input string. + * + * A token is an associative array containing three items: + * - 'value' : the string value of the token in the input string + * - 'type' : the type of the token (identifier, numeric, string, input + * parameter, none) + * - 'position' : the position of the token in the input string + * + * @return array|null the next token; null if there is no more tokens left + */ + public function moveNext() + { + $this->peek = 0; + $this->token = $this->lookahead; + $this->lookahead = (isset($this->tokens[$this->position])) + ? $this->tokens[$this->position++] : null; + + return $this->lookahead !== null; + } + + /** + * Tells the lexer to skip input tokens until it sees a token with the given value. + * + * @param $type The token type to skip until. + */ + public function skipUntil($type) + { + while ($this->lookahead !== null && $this->lookahead['type'] !== $type) { + $this->moveNext(); + } + } + + /** + * Checks if given value is identical to the given token + * + * @param mixed $value + * @param integer $token + * @return boolean + */ + public function isA($value, $token) + { + return $this->getType($value) === $token; + } + + /** + * Moves the lookahead token forward. + * + * @return array | null The next token or NULL if there are no more tokens ahead. + */ + public function peek() + { + if (isset($this->tokens[$this->position + $this->peek])) { + return $this->tokens[$this->position + $this->peek++]; + } else { + return null; + } + } + + /** + * Peeks at the next token, returns it and immediately resets the peek. + * + * @return array|null The next token or NULL if there are no more tokens ahead. + */ + public function glimpse() + { + $peek = $this->peek(); + $this->peek = 0; + return $peek; + } + + /** + * Scans the input string for tokens. + * + * @param string $input a query string + */ + protected function scan($input) + { + static $regex; + + if ( ! isset($regex)) { + $regex = '/(' . implode(')|(', $this->getCatchablePatterns()) . ')|' + . implode('|', $this->getNonCatchablePatterns()) . '/i'; + } + + $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE; + $matches = preg_split($regex, $input, -1, $flags); + + foreach ($matches as $match) { + // Must remain before 'value' assignment since it can change content + $type = $this->getType($match[0]); + + $this->tokens[] = array( + 'value' => $match[0], + 'type' => $type, + 'position' => $match[1], + ); + } + } + + /** + * Gets the literal for a given token. + * + * @param integer $token + * @return string + */ + public function getLiteral($token) + { + $className = get_class($this); + $reflClass = new \ReflectionClass($className); + $constants = $reflClass->getConstants(); + + foreach ($constants as $name => $value) { + if ($value === $token) { + return $className . '::' . $name; + } + } + + return $token; + } + + /** + * Lexical catchable patterns. + * + * @return array + */ + abstract protected function getCatchablePatterns(); + + /** + * Lexical non-catchable patterns. + * + * @return array + */ + abstract protected function getNonCatchablePatterns(); + + /** + * Retrieve token type. Also processes the token value if necessary. + * + * @param string $value + * @return integer + */ + abstract protected function getType(&$value); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php new file mode 100644 index 00000000..93e504ae --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php @@ -0,0 +1,45 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Contract for classes that provide the service of notifying listeners of + * changes to their properties. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface NotifyPropertyChanged +{ + /** + * Adds a listener that wants to be notified about property changes. + * + * @param PropertyChangedListener $listener + */ + function addPropertyChangedListener(PropertyChangedListener $listener); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php new file mode 100644 index 00000000..9fff343c --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php @@ -0,0 +1,224 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\ManagerRegistry; + +/** + * Abstract implementation of the ManagerRegistry contract. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +abstract class AbstractManagerRegistry implements ManagerRegistry +{ + private $name; + private $connections; + private $managers; + private $defaultConnection; + private $defaultManager; + private $proxyInterfaceName; + + public function __construct($name, array $connections, array $managers, $defaultConnection, $defaultManager, $proxyInterfaceName) + { + $this->name = $name; + $this->connections = $connections; + $this->managers = $managers; + $this->defaultConnection = $defaultConnection; + $this->defaultManager = $defaultManager; + $this->proxyInterfaceName = $proxyInterfaceName; + } + + /** + * Fetches/creates the given services + * + * A service in this context is connection or a manager instance + * + * @param string $name name of the service + * @return object instance of the given service + */ + abstract protected function getService($name); + + /** + * Resets the given services + * + * A service in this context is connection or a manager instance + * + * @param string $name name of the service + * @return void + */ + abstract protected function resetService($name); + + /** + * Get the name of the registry + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @inheritdoc + */ + public function getConnection($name = null) + { + if (null === $name) { + $name = $this->defaultConnection; + } + + if (!isset($this->connections[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Connection named "%s" does not exist.', $this->name, $name)); + } + + return $this->getService($this->connections[$name]); + } + + /** + * @inheritdoc + */ + public function getConnectionNames() + { + return $this->connections; + } + + /** + * @inheritdoc + */ + public function getConnections() + { + $connections = array(); + foreach ($this->connections as $name => $id) { + $connections[$name] = $this->getService($id); + } + + return $connections; + } + + /** + * @inheritdoc + */ + public function getDefaultConnectionName() + { + return $this->defaultConnection; + } + + /** + * @inheritdoc + */ + public function getDefaultManagerName() + { + return $this->defaultManager; + } + + /** + * @inheritdoc + */ + public function getManager($name = null) + { + if (null === $name) { + $name = $this->defaultManager; + } + + if (!isset($this->managers[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); + } + + return $this->getService($this->managers[$name]); + } + + /** + * @inheritdoc + */ + public function getManagerForClass($class) + { + // Check for namespace alias + if (strpos($class, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $class); + $class = $this->getAliasNamespace($namespaceAlias) . '\\' . $simpleClassName; + } + + $proxyClass = new \ReflectionClass($class); + if ($proxyClass->implementsInterface($this->proxyInterfaceName)) { + $class = $proxyClass->getParentClass()->getName(); + } + + foreach ($this->managers as $id) { + $manager = $this->getService($id); + + if (!$manager->getMetadataFactory()->isTransient($class)) { + return $manager; + } + } + } + + /** + * @inheritdoc + */ + public function getManagerNames() + { + return $this->managers; + } + + /** + * @inheritdoc + */ + public function getManagers() + { + $dms = array(); + foreach ($this->managers as $name => $id) { + $dms[$name] = $this->getService($id); + } + + return $dms; + } + + /** + * @inheritdoc + */ + public function getRepository($persistentObjectName, $persistentManagerName = null) + { + return $this->getManager($persistentManagerName)->getRepository($persistentObjectName); + } + + /** + * @inheritdoc + */ + public function resetManager($name = null) + { + if (null === $name) { + $name = $this->defaultManager; + } + + if (!isset($this->managers[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); + } + + // force the creation of a new document manager + // if the current one is closed + $this->resetService($this->managers[$name]); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php new file mode 100644 index 00000000..a47727fa --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php @@ -0,0 +1,63 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract covering connection for a Doctrine persistence layer ManagerRegistry class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +interface ConnectionRegistry +{ + /** + * Gets the default connection name. + * + * @return string The default connection name + */ + function getDefaultConnectionName(); + + /** + * Gets the named connection. + * + * @param string $name The connection name (null for the default one) + * + * @return Connection + */ + function getConnection($name = null); + + /** + * Gets an array of all registered connections + * + * @return array An array of Connection instances + */ + function getConnections(); + + /** + * Gets all connection names. + * + * @return array An array of connection names + */ + function getConnectionNames(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php new file mode 100644 index 00000000..8055b66d --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php @@ -0,0 +1,77 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs; +use Doctrine\Common\Persistence\ObjectManager; + +/** + * Lifecycle Events are triggered by the UnitOfWork during lifecycle transitions + * of entities. + * + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class LifecycleEventArgs extends EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var object + */ + private $entity; + + /** + * Constructor + * + * @param object $entity + * @param ObjectManager $objectManager + */ + public function __construct($entity, ObjectManager $objectManager) + { + $this->entity = $entity; + $this->objectManager = $objectManager; + } + + /** + * Retireve associated Entity. + * + * @return object + */ + public function getEntity() + { + return $this->entity; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php new file mode 100644 index 00000000..4a18d167 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php @@ -0,0 +1,76 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs; +use Doctrine\Common\Persistence\ObjectManager; +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Class that holds event arguments for a loadMetadata event. + * + * @author Jonathan H. Wage + * @since 2.2 + */ +class LoadClassMetadataEventArgs extends EventArgs +{ + /** + * @var ClassMetadata + */ + private $classMetadata; + + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * Constructor. + * + * @param ClasseMetadata $classMetadata + * @param ObjectManager $objectManager + */ + public function __construct(ClassMetadata $classMetadata, ObjectManager $objectManager) + { + $this->classMetadata = $classMetadata; + $this->objectManager = $objectManager; + } + + /** + * Retrieve associated ClassMetadata. + * + * @return ClassMetadata + */ + public function getClassMetadata() + { + return $this->classMetadata; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php new file mode 100644 index 00000000..33c4d796 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php @@ -0,0 +1,59 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\Persistence\ObjectManager; + +/** + * Provides event arguments for the preFlush event. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class ManagerEventArgs extends \Doctrine\Common\EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * Constructor. + * + * @param ObjectManager $objectManager + */ + public function __construct(ObjectManager $objectManager) + { + $this->objectManager = $objectManager; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php new file mode 100644 index 00000000..f67ab50e --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php @@ -0,0 +1,84 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +/** + * Provides event arguments for the onClear event. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class OnClearEventArgs extends \Doctrine\Common\EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var string + */ + private $entityClass; + + /** + * Constructor. + * + * @param ObjectManager $objectManager + * @param string $entityClass Optional entity class + */ + public function __construct($objectManager, $entityClass = null) + { + $this->objectManager = $objectManager; + $this->entityClass = $entityClass; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } + + /** + * Name of the entity class that is cleared, or empty if all are cleared. + * + * @return string + */ + public function getEntityClass() + { + return $this->entityClass; + } + + /** + * Check if event clears all entities. + * + * @return bool + */ + public function clearsAllEntities() + { + return ($this->entityClass === null); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php new file mode 100644 index 00000000..191d053a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php @@ -0,0 +1,129 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs, + Doctrine\Common\Persistence\ObjectManager; + +/** + * Class that holds event arguments for a preUpdate event. + * + * @author Guilherme Blanco + * @author Roman Borschel + * @author Benjamin Eberlei + * @since 2.2 + */ +class PreUpdateEventArgs extends LifecycleEventArgs +{ + /** + * @var array + */ + private $entityChangeSet; + + /** + * Constructor. + * + * @param object $entity + * @param ObjectManager $objectManager + * @param array $changeSet + */ + public function __construct($entity, ObjectManager $objectManager, array &$changeSet) + { + parent::__construct($entity, $objectManager); + + $this->entityChangeSet = &$changeSet; + } + + /** + * Retrieve entity changeset. + * + * @return array + */ + public function getEntityChangeSet() + { + return $this->entityChangeSet; + } + + /** + * Check if field has a changeset. + * + * @return boolean + */ + public function hasChangedField($field) + { + return isset($this->entityChangeSet[$field]); + } + + /** + * Get the old value of the changeset of the changed field. + * + * @param string $field + * @return mixed + */ + public function getOldValue($field) + { + $this->assertValidField($field); + + return $this->entityChangeSet[$field][0]; + } + + /** + * Get the new value of the changeset of the changed field. + * + * @param string $field + * @return mixed + */ + public function getNewValue($field) + { + $this->assertValidField($field); + + return $this->entityChangeSet[$field][1]; + } + + /** + * Set the new value of this field. + * + * @param string $field + * @param mixed $value + */ + public function setNewValue($field, $value) + { + $this->assertValidField($field); + + $this->entityChangeSet[$field][1] = $value; + } + + /** + * Assert the field exists in changeset. + * + * @param string $field + */ + private function assertValidField($field) + { + if ( ! isset($this->entityChangeSet[$field])) { + throw new \InvalidArgumentException(sprintf( + 'Field "%s" is not a valid field of the entity "%s" in PreUpdateEventArgs.', + $field, + get_class($this->getEntity()) + )); + } + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php new file mode 100644 index 00000000..4d92426b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php @@ -0,0 +1,112 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract covering object managers for a Doctrine persistence layer ManagerRegistry class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +interface ManagerRegistry extends ConnectionRegistry +{ + /** + * Gets the default object manager name. + * + * @return string The default object manager name + */ + function getDefaultManagerName(); + + /** + * Gets a named object manager. + * + * @param string $name The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectManager + */ + function getManager($name = null); + + /** + * Gets an array of all registered object managers + * + * @return array An array of ObjectManager instances + */ + function getManagers(); + + /** + * Resets a named object manager. + * + * This method is useful when an object manager has been closed + * because of a rollbacked transaction AND when you think that + * it makes sense to get a new one to replace the closed one. + * + * Be warned that you will get a brand new object manager as + * the existing one is not useable anymore. This means that any + * other object with a dependency on this object manager will + * hold an obsolete reference. You can inject the registry instead + * to avoid this problem. + * + * @param string $name The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectManager + */ + function resetManager($name = null); + + /** + * Resolves a registered namespace alias to the full namespace. + * + * This method looks for the alias in all registered object managers. + * + * @param string $alias The alias + * + * @return string The full namespace + */ + function getAliasNamespace($alias); + + /** + * Gets all connection names. + * + * @return array An array of connection names + */ + function getManagerNames(); + + /** + * Gets the ObjectRepository for an persistent object. + * + * @param string $persistentObject The name of the persistent object. + * @param string $persistentManagerName The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectRepository + */ + function getRepository($persistentObject, $persistentManagerName = null); + + /** + * Gets the object manager associated with a given class. + * + * @param string $class A persistent object class name + * + * @return \Doctrine\Common\Persistence\ObjectManager|null + */ + function getManagerForClass($class); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php new file mode 100644 index 00000000..a2a61850 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php @@ -0,0 +1,359 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use Doctrine\Common\Cache\Cache; + +/** + * The ClassMetadataFactory is used to create ClassMetadata objects that contain all the + * metadata mapping informations of a class which describes how a class should be mapped + * to a relational database. + * + * This class was abstracted from the ORM ClassMetadataFactory + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +abstract class AbstractClassMetadataFactory implements ClassMetadataFactory +{ + /** + * Salt used by specific Object Manager implementation. + * + * @var string + */ + protected $cacheSalt = "\$CLASSMETADATA"; + + /** + * @var \Doctrine\Common\Cache\Cache + */ + private $cacheDriver; + + /** + * @var array + */ + private $loadedMetadata = array(); + + /** + * @var bool + */ + protected $initialized = false; + + /** + * @var ReflectionService + */ + private $reflectionService; + + /** + * Sets the cache driver used by the factory to cache ClassMetadata instances. + * + * @param Doctrine\Common\Cache\Cache $cacheDriver + */ + public function setCacheDriver(Cache $cacheDriver = null) + { + $this->cacheDriver = $cacheDriver; + } + + /** + * Gets the cache driver used by the factory to cache ClassMetadata instances. + * + * @return Doctrine\Common\Cache\Cache + */ + public function getCacheDriver() + { + return $this->cacheDriver; + } + + /** + * Return an array of all the loaded metadata currently in memory. + * + * @return array + */ + public function getLoadedMetadata() + { + return $this->loadedMetadata; + } + + /** + * Forces the factory to load the metadata of all classes known to the underlying + * mapping driver. + * + * @return array The ClassMetadata instances of all mapped classes. + */ + public function getAllMetadata() + { + if ( ! $this->initialized) { + $this->initialize(); + } + + $driver = $this->getDriver(); + $metadata = array(); + foreach ($driver->getAllClassNames() as $className) { + $metadata[] = $this->getMetadataFor($className); + } + + return $metadata; + } + + /** + * Lazy initialization of this stuff, especially the metadata driver, + * since these are not needed at all when a metadata cache is active. + * + * @return void + */ + abstract protected function initialize(); + + /** + * Get the fully qualified class-name from the namespace alias. + * + * @param string $namespaceAlias + * @param string $simpleClassName + * @return string + */ + abstract protected function getFqcnFromAlias($namespaceAlias, $simpleClassName); + + /** + * Return the mapping driver implementation. + * + * @return MappingDriver + */ + abstract protected function getDriver(); + + /** + * Wakeup reflection after ClassMetadata gets unserialized from cache. + * + * @param ClassMetadata $class + * @param ReflectionService $reflService + * @return void + */ + abstract protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService); + + /** + * Initialize Reflection after ClassMetadata was constructed. + * + * @param ClassMetadata $class + * @param ReflectionSErvice $reflService + * @return void + */ + abstract protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService); + + /** + * Gets the class metadata descriptor for a class. + * + * @param string $className The name of the class. + * @return Doctrine\Common\Persistence\Mapping\ClassMetadata + */ + public function getMetadataFor($className) + { + if ( ! isset($this->loadedMetadata[$className])) { + $realClassName = $className; + + // Check for namespace alias + if (strpos($className, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $className); + $realClassName = $this->getFqcnFromAlias($namespaceAlias, $simpleClassName); + + if (isset($this->loadedMetadata[$realClassName])) { + // We do not have the alias name in the map, include it + $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; + + return $this->loadedMetadata[$realClassName]; + } + } + + if ($this->cacheDriver) { + if (($cached = $this->cacheDriver->fetch($realClassName . $this->cacheSalt)) !== false) { + $this->loadedMetadata[$realClassName] = $cached; + $this->wakeupReflection($cached, $this->getReflectionService()); + } else { + foreach ($this->loadMetadata($realClassName) as $loadedClassName) { + $this->cacheDriver->save( + $loadedClassName . $this->cacheSalt, $this->loadedMetadata[$loadedClassName], null + ); + } + } + } else { + $this->loadMetadata($realClassName); + } + + if ($className != $realClassName) { + // We do not have the alias name in the map, include it + $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; + } + } + + return $this->loadedMetadata[$className]; + } + + /** + * Checks whether the factory has the metadata for a class loaded already. + * + * @param string $className + * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. + */ + public function hasMetadataFor($className) + { + return isset($this->loadedMetadata[$className]); + } + + /** + * Sets the metadata descriptor for a specific class. + * + * NOTE: This is only useful in very special cases, like when generating proxy classes. + * + * @param string $className + * @param ClassMetadata $class + */ + public function setMetadataFor($className, $class) + { + $this->loadedMetadata[$className] = $class; + } + + /** + * Get array of parent classes for the given entity class + * + * @param string $name + * @return array $parentClasses + */ + protected function getParentClasses($name) + { + // Collect parent classes, ignoring transient (not-mapped) classes. + $parentClasses = array(); + foreach (array_reverse($this->getReflectionService()->getParentClasses($name)) as $parentClass) { + if ( ! $this->getDriver()->isTransient($parentClass)) { + $parentClasses[] = $parentClass; + } + } + return $parentClasses; + } + + /** + * Loads the metadata of the class in question and all it's ancestors whose metadata + * is still not loaded. + * + * @param string $name The name of the class for which the metadata should get loaded. + * @param array $tables The metadata collection to which the loaded metadata is added. + */ + protected function loadMetadata($name) + { + if ( ! $this->initialized) { + $this->initialize(); + } + + $loaded = array(); + + $parentClasses = $this->getParentClasses($name); + $parentClasses[] = $name; + + // Move down the hierarchy of parent classes, starting from the topmost class + $parent = null; + $rootEntityFound = false; + $visited = array(); + $reflService = $this->getReflectionService(); + foreach ($parentClasses as $className) { + if (isset($this->loadedMetadata[$className])) { + $parent = $this->loadedMetadata[$className]; + if (isset($parent->isMappedSuperclass) && $parent->isMappedSuperclass === false) { + $rootEntityFound = true; + array_unshift($visited, $className); + } + continue; + } + + $class = $this->newClassMetadataInstance($className); + $this->initializeReflection($class, $reflService); + + $this->doLoadMetadata($class, $parent, $rootEntityFound); + + $this->loadedMetadata[$className] = $class; + + $parent = $class; + + if (isset($parent->isMappedSuperclass) && $class->isMappedSuperclass === false) { + $rootEntityFound = true; + array_unshift($visited, $className); + } + + $this->wakeupReflection($class, $reflService); + + $loaded[] = $className; + } + + return $loaded; + } + + /** + * Actually load the metadata from the underlying metadata + * + * @param ClassMetadata $class + * @param ClassMetadata $parent + * @param bool $rootEntityFound + * @return void + */ + abstract protected function doLoadMetadata($class, $parent, $rootEntityFound); + + /** + * Creates a new ClassMetadata instance for the given class name. + * + * @param string $className + * @return ClassMetadata + */ + abstract protected function newClassMetadataInstance($className); + + /** + * Check if this class is mapped by this Object Manager + ClassMetadata configuration + * + * @param $class + * @return bool + */ + public function isTransient($class) + { + if ( ! $this->initialized) { + $this->initialize(); + } + + return $this->getDriver()->isTransient($class); + } + + /** + * Set reflectionService. + * + * @param ReflectionService $reflectionService + */ + public function setReflectionService(ReflectionService $reflectionService) + { + $this->reflectionService = $reflectionService; + } + + /** + * Get the reflection service associated with this metadata factory. + * + * @return ReflectionService + */ + public function getReflectionService() + { + if ($this->reflectionService === null) { + $this->reflectionService = new RuntimeReflectionService(); + } + return $this->reflectionService; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php new file mode 100644 index 00000000..705d59ac --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php @@ -0,0 +1,165 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ClassMetadata +{ + /** + * Get fully-qualified class name of this persistent class. + * + * @return string + */ + function getName(); + + /** + * Gets the mapped identifier field name. + * + * The returned structure is an array of the identifier field names. + * + * @return array + */ + function getIdentifier(); + + /** + * Gets the ReflectionClass instance for this mapped class. + * + * @return ReflectionClass + */ + function getReflectionClass(); + + /** + * Checks if the given field name is a mapped identifier for this class. + * + * @param string $fieldName + * @return boolean + */ + function isIdentifier($fieldName); + + /** + * Checks if the given field is a mapped property for this class. + * + * @param string $fieldName + * @return boolean + */ + function hasField($fieldName); + + /** + * Checks if the given field is a mapped association for this class. + * + * @param string $fieldName + * @return boolean + */ + function hasAssociation($fieldName); + + /** + * Checks if the given field is a mapped single valued association for this class. + * + * @param string $fieldName + * @return boolean + */ + function isSingleValuedAssociation($fieldName); + + /** + * Checks if the given field is a mapped collection valued association for this class. + * + * @param string $fieldName + * @return boolean + */ + function isCollectionValuedAssociation($fieldName); + + /** + * A numerically indexed list of field names of this persistent class. + * + * This array includes identifier fields if present on this class. + * + * @return array + */ + function getFieldNames(); + + /** + * Returns an array of identifier field names numerically indexed. + * + * @return array + */ + function getIdentifierFieldNames(); + + /** + * A numerically indexed list of association names of this persistent class. + * + * This array includes identifier associations if present on this class. + * + * @return array + */ + function getAssociationNames(); + + /** + * Returns a type name of this field. + * + * This type names can be implementation specific but should at least include the php types: + * integer, string, boolean, float/double, datetime. + * + * @param string $fieldName + * @return string + */ + function getTypeOfField($fieldName); + + /** + * Returns the target class name of the given association. + * + * @param string $assocName + * @return string + */ + function getAssociationTargetClass($assocName); + + /** + * Checks if the association is the inverse side of a bidirectional association + * + * @param string $assocName + * @return boolean + */ + function isAssociationInverseSide($assocName); + + /** + * Returns the target field of the owning side of the association + * + * @param string $assocName + * @return string + */ + function getAssociationMappedByTargetField($assocName); + + /** + * Return the identifier of this object as an array with field name as key. + * + * Has to return an empty array if no identifier isset. + * + * @param object $object + * @return array + */ + function getIdentifierValues($object); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php new file mode 100644 index 00000000..bf27ba9a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php @@ -0,0 +1,74 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ClassMetadataFactory +{ + /** + * Forces the factory to load the metadata of all classes known to the underlying + * mapping driver. + * + * @return array The ClassMetadata instances of all mapped classes. + */ + function getAllMetadata(); + + /** + * Gets the class metadata descriptor for a class. + * + * @param string $className The name of the class. + * @return ClassMetadata + */ + function getMetadataFor($className); + + /** + * Checks whether the factory has the metadata for a class loaded already. + * + * @param string $className + * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. + */ + function hasMetadataFor($className); + + /** + * Sets the metadata descriptor for a specific class. + * + * @param string $className + * @param ClassMetadata $class + */ + function setMetadataFor($className, $class); + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped directly or as a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + function isTransient($className); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php new file mode 100644 index 00000000..f52d37ee --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php @@ -0,0 +1,214 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Cache\ArrayCache, + Doctrine\Common\Annotations\AnnotationReader, + Doctrine\Common\Annotations\AnnotationRegistry, + Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The AnnotationDriver reads the mapping metadata from docblock annotations. + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +abstract class AnnotationDriver implements MappingDriver +{ + /** + * The AnnotationReader. + * + * @var AnnotationReader + */ + protected $reader; + + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * The file extension of mapping documents. + * + * @var string + */ + protected $fileExtension = '.php'; + + /** + * Cache for AnnotationDriver#getAllClassNames() + * + * @var array + */ + protected $classNames; + + /** + * Name of the entity annotations as keys + * + * @var array + */ + protected $entityAnnotationClasses = array(); + + /** + * Initializes a new AnnotationDriver that uses the given AnnotationReader for reading + * docblock annotations. + * + * @param AnnotationReader $reader The AnnotationReader to use, duck-typed. + * @param string|array $paths One or multiple paths where mapping classes can be found. + */ + public function __construct($reader, $paths = null) + { + $this->reader = $reader; + if ($paths) { + $this->addPaths((array) $paths); + } + } + + /** + * Append lookup paths to metadata driver. + * + * @param array $paths + */ + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * Retrieve the defined metadata lookup paths. + * + * @return array + */ + public function getPaths() + { + return $this->paths; + } + + /** + * Retrieve the current annotation reader + * + * @return AnnotationReader + */ + public function getReader() + { + return $this->reader; + } + + /** + * Get the file extension used to look for mapping files under + * + * @return void + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * Whether the class with the specified name is transient. Only non-transient + * classes, that is entities and mapped superclasses, should have their metadata loaded. + * + * A class is non-transient if it is annotated with an annotation + * from the {@see AnnotationDriver::entityAnnotationClasses}. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + $classAnnotations = $this->reader->getClassAnnotations(new \ReflectionClass($className)); + + foreach ($classAnnotations as $annot) { + if (isset($this->entityAnnotationClasses[get_class($annot)])) { + return false; + } + } + return true; + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames() + { + if ($this->classNames !== null) { + return $this->classNames; + } + + if (!$this->paths) { + throw MappingException::pathRequired(); + } + + $classes = array(); + $includedFiles = array(); + + foreach ($this->paths as $path) { + if ( ! is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RegexIterator( + new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS), + \RecursiveIteratorIterator::LEAVES_ONLY + ), + '/^.+' . str_replace('.', '\.', $this->fileExtension) . '$/i', + \RecursiveRegexIterator::GET_MATCH + ); + + foreach ($iterator as $file) { + $sourceFile = realpath($file[0]); + + require_once $sourceFile; + + $includedFiles[] = $sourceFile; + } + } + + $declared = get_declared_classes(); + + foreach ($declared as $className) { + $rc = new \ReflectionClass($className); + $sourceFile = $rc->getFileName(); + if (in_array($sourceFile, $includedFiles) && ! $this->isTransient($className)) { + $classes[] = $className; + } + } + + $this->classNames = $classes; + + return $classes; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php new file mode 100644 index 00000000..efaf545e --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php @@ -0,0 +1,169 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * Locate the file that contains the metadata information for a given class name. + * + * This behavior is inpependent of the actual content of the file. It just detects + * the file which is responsible for the given class name. + * + * @author Benjamin Eberlei + * @author Johannes M. Schmitt + */ +class DefaultFileLocator implements FileLocator +{ + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * The file extension of mapping documents. + * + * @var string + */ + protected $fileExtension; + + /** + * Initializes a new FileDriver that looks in the given path(s) for mapping + * documents and operates in the specified operating mode. + * + * @param string|array $paths One or multiple paths where mapping documents can be found. + */ + public function __construct($paths, $fileExtension = null) + { + $this->addPaths((array) $paths); + $this->fileExtension = $fileExtension; + } + + /** + * Append lookup paths to metadata driver. + * + * @param array $paths + */ + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * Retrieve the defined metadata lookup paths. + * + * @return array + */ + public function getPaths() + { + return $this->paths; + } + + /** + * Get the file extension used to look for mapping files under + * + * @return void + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * {@inheritDoc} + */ + public function findMappingFile($className) + { + $fileName = str_replace('\\', '.', $className) . $this->fileExtension; + + // Check whether file exists + foreach ($this->paths as $path) { + if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { + return $path . DIRECTORY_SEPARATOR . $fileName; + } + } + + throw MappingException::mappingFileNotFound($className, $fileName); + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames($globalBasename) + { + $classes = array(); + + if ($this->paths) { + foreach ($this->paths as $path) { + if ( ! is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + $fileName = $file->getBasename($this->fileExtension); + + if ($fileName == $file->getBasename() || $fileName == $globalBasename) { + continue; + } + + // NOTE: All files found here means classes are not transient! + $classes[] = str_replace('.', '\\', $fileName); + } + } + } + + return $classes; + } + + /** + * {@inheritDoc} + */ + public function fileExists($className) + { + $fileName = str_replace('\\', '.', $className) . $this->fileExtension; + + // Check whether file exists + foreach ((array) $this->paths as $path) { + if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php new file mode 100644 index 00000000..22cf117d --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php @@ -0,0 +1,178 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * Base driver for file-based metadata drivers. + * + * A file driver operates in a mode where it loads the mapping files of individual + * classes on demand. This requires the user to adhere to the convention of 1 mapping + * file per class and the file names of the mapping files must correspond to the full + * class name, including namespace, with the namespace delimiters '\', replaced by dots '.'. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.com + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +abstract class FileDriver implements MappingDriver +{ + /** + * @var FileLocator + */ + protected $locator; + + /** + * @var array + */ + protected $classCache; + + /** + * @var string + */ + protected $globalBasename; + + /** + * Initializes a new FileDriver that looks in the given path(s) for mapping + * documents and operates in the specified operating mode. + * + * @param string|array|FileLocator $paths A FileLocator or one/multiple paths where mapping documents can be found. + * @param string $fileExtension + */ + public function __construct($locator, $fileExtension = null) + { + if ($locator instanceof FileLocator) { + $this->locator = $locator; + } else { + $this->locator = new DefaultFileLocator((array)$locator, $fileExtension); + } + } + + public function setGlobalBasename($file) + { + $this->globalBasename = $file; + } + + public function getGlobalBasename() + { + return $this->globalBasename; + } + + /** + * Get the element of schema meta data for the class from the mapping file. + * This will lazily load the mapping file if it is not loaded yet + * + * @return array $element The element of schema meta data + */ + public function getElement($className) + { + if ($this->classCache === null) { + $this->initialize(); + } + + if (isset($this->classCache[$className])) { + return $this->classCache[$className]; + } + + $result = $this->loadMappingFile($this->locator->findMappingFile($className)); + + return $result[$className]; + } + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped as an Entity or a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + if ($this->classCache === null) { + $this->initialize(); + } + + if (isset($this->classCache[$className])) { + return false; + } + + return !$this->locator->fileExists($className); + } + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + public function getAllClassNames() + { + if ($this->classCache === null) { + $this->initialize(); + } + + $classNames = (array)$this->locator->getAllClassNames($this->globalBasename); + if ($this->classCache) { + $classNames = array_merge(array_keys($this->classCache), $classNames); + } + return $classNames; + } + + /** + * Loads a mapping file with the given name and returns a map + * from class/entity names to their corresponding file driver elements. + * + * @param string $file The mapping file to load. + * @return array + */ + abstract protected function loadMappingFile($file); + + /** + * Initialize the class cache from all the global files. + * + * Using this feature adds a substantial performance hit to file drivers as + * more metadata has to be loaded into memory than might actually be + * necessary. This may not be relevant to scenarios where caching of + * metadata is in place, however hits very hard in scenarios where no + * caching is used. + * + * @return void + */ + protected function initialize() + { + $this->classCache = array(); + if (null !== $this->globalBasename) { + foreach ($this->locator->getPaths() as $path) { + $file = $path.'/'.$this->globalBasename.$this->locator->getFileExtension(); + if (is_file($file)) { + $this->classCache = array_merge( + $this->classCache, + $this->loadMappingFile($file) + ); + } + } + } + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php new file mode 100644 index 00000000..a1019d71 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php @@ -0,0 +1,69 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +/** + * Locate the file that contains the metadata information for a given class name. + * + * This behavior is inpependent of the actual content of the file. It just detects + * the file which is responsible for the given class name. + * + * @author Benjamin Eberlei + * @author Johannes M. Schmitt + */ +interface FileLocator +{ + /** + * Locate mapping file for the given class name. + * + * @param string $className + * @return string + */ + function findMappingFile($className); + + /** + * Get all class names that are found with this file locator. + * + * @param string $globalBasename Passed to allow excluding the basename + * @return array + */ + function getAllClassNames($globalBasename); + + /** + * Check if a file can be found for this class name. + * + * @return bool + */ + function fileExists($className); + + /** + * Get all the paths that this file locator looks for mapping files. + * + * @return array + */ + function getPaths(); + + /** + * Get the file extension that mapping files are suffixed with. + * + * @return string + */ + function getFileExtension(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php new file mode 100644 index 00000000..c050d323 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php @@ -0,0 +1,56 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Contract for metadata drivers. + * + * @since 2.2 + * @author Jonathan H. Wage + */ +interface MappingDriver +{ + /** + * Loads the metadata for the specified class into the provided container. + * + * @param string $className + * @param ClassMetadata $metadata + */ + function loadMetadataForClass($className, ClassMetadata $metadata); + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + function getAllClassNames(); + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped as an Entity or a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + function isTransient($className); +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php new file mode 100644 index 00000000..c7c14527 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php @@ -0,0 +1,125 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\Driver\MappingDriver, + Doctrine\Common\Persistence\Mapping\ClassMetadata, + Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The DriverChain allows you to add multiple other mapping drivers for + * certain namespaces + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class MappingDriverChain implements MappingDriver +{ + /** + * @var array + */ + private $drivers = array(); + + /** + * Add a nested driver. + * + * @param Driver $nestedDriver + * @param string $namespace + */ + public function addDriver(MappingDriver $nestedDriver, $namespace) + { + $this->drivers[$namespace] = $nestedDriver; + } + + /** + * Get the array of nested drivers. + * + * @return array $drivers + */ + public function getDrivers() + { + return $this->drivers; + } + + /** + * Loads the metadata for the specified class into the provided container. + * + * @param string $className + * @param ClassMetadataInfo $metadata + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + foreach ($this->drivers as $namespace => $driver) { + if (strpos($className, $namespace) === 0) { + $driver->loadMetadataForClass($className, $metadata); + return; + } + } + + throw MappingException::classNotFoundInNamespaces($className, array_keys($this->drivers)); + } + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + public function getAllClassNames() + { + $classNames = array(); + $driverClasses = array(); + foreach ($this->drivers AS $namespace => $driver) { + $oid = spl_object_hash($driver); + if (!isset($driverClasses[$oid])) { + $driverClasses[$oid] = $driver->getAllClassNames(); + } + + foreach ($driverClasses[$oid] AS $className) { + if (strpos($className, $namespace) === 0) { + $classNames[$className] = true; + } + } + } + return array_keys($classNames); + } + + /** + * Whether the class with the specified name should have its metadata loaded. + * + * This is only the case for non-transient classes either mapped as an Entity or MappedSuperclass. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + foreach ($this->drivers AS $namespace => $driver) { + if (strpos($className, $namespace) === 0) { + return $driver->isTransient($className); + } + } + + // class isTransient, i.e. not an entity or mapped superclass + return true; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php new file mode 100644 index 00000000..7751dae3 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * The PHPDriver includes php files which just populate ClassMetadataInfo + * instances with plain php code + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class PHPDriver extends FileDriver +{ + /** + * {@inheritdoc} + */ + protected $metadata; + + /** + * {@inheritDoc} + */ + public function __construct($locator, $fileExtension = null) + { + $fileExtension = ".php"; + parent::__construct($locator, $fileExtension); + } + + /** + * {@inheritdoc} + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + $this->metadata = $metadata; + $this->loadMappingFile($this->locator->findMappingFile($className)); + } + + /** + * {@inheritdoc} + */ + protected function loadMappingFile($file) + { + $metadata = $this->metadata; + include $file; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php new file mode 100644 index 00000000..9103ed86 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php @@ -0,0 +1,131 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The StaticPHPDriver calls a static loadMetadata() method on your entity + * classes where you can manually populate the ClassMetadata instance. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class StaticPHPDriver implements MappingDriver +{ + /** + * Paths of entity directories. + * + * @var array + */ + private $paths = array(); + + /** + * Map of all class names. + * + * @var array + */ + private $classNames; + + public function __construct($paths) + { + $this->addPaths((array) $paths); + } + + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * {@inheritdoc} + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + $className::loadMetadata($metadata); + } + + /** + * {@inheritDoc} + * @todo Same code exists in AnnotationDriver, should we re-use it somehow or not worry about it? + */ + public function getAllClassNames() + { + if ($this->classNames !== null) { + return $this->classNames; + } + + if (!$this->paths) { + throw MappingException::pathRequired(); + } + + $classes = array(); + $includedFiles = array(); + + foreach ($this->paths as $path) { + if (!is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + if ($file->getBasename('.php') == $file->getBasename()) { + continue; + } + + $sourceFile = realpath($file->getPathName()); + require_once $sourceFile; + $includedFiles[] = $sourceFile; + } + } + + $declared = get_declared_classes(); + + foreach ($declared as $className) { + $rc = new \ReflectionClass($className); + $sourceFile = $rc->getFileName(); + if (in_array($sourceFile, $includedFiles) && !$this->isTransient($className)) { + $classes[] = $className; + } + } + + $this->classNames = $classes; + + return $classes; + } + + /** + * {@inheritdoc} + */ + public function isTransient($className) + { + return ! method_exists($className, 'loadMetadata'); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php new file mode 100644 index 00000000..d338cf60 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php @@ -0,0 +1,198 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The Symfony File Locator makes a simplifying assumptions compared + * to the DefaultFileLocator. By assuming paths only contain entities of a certain + * namespace the mapping files consists of the short classname only. + * + * @author Fabien Potencier + * @author Benjamin Eberlei + * @license MIT + */ +class SymfonyFileLocator implements FileLocator +{ + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * A map of mapping directory path to namespace prefix used to expand class shortnames. + * + * @var array + */ + protected $prefixes = array(); + + /** + * File extension that is searched for. + * + * @var string + */ + protected $fileExtension; + + public function __construct(array $prefixes, $fileExtension = null) + { + $this->addNamespacePrefixes($prefixes); + $this->fileExtension = $fileExtension; + } + + public function addNamespacePrefixes(array $prefixes) + { + $this->prefixes = array_merge($this->prefixes, $prefixes); + $this->paths = array_merge($this->paths, array_keys($prefixes)); + } + + public function getNamespacePrefixes() + { + return $this->prefixes; + } + + /** + * {@inheritDoc} + */ + public function getPaths() + { + return $this->paths; + } + + /** + * {@inheritDoc} + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * {@inheritDoc} + */ + public function fileExists($className) + { + $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; + foreach ($this->paths as $path) { + if (!isset($this->prefixes[$path])) { + // global namespace class + if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { + return true; + } + + continue; + } + + $prefix = $this->prefixes[$path]; + + if (0 !== strpos($className, $prefix.'\\')) { + continue; + } + + $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; + return is_file($filename); + } + + return false; + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames($globalBasename = null) + { + $classes = array(); + + if ($this->paths) { + foreach ((array) $this->paths as $path) { + if (!is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + $fileName = $file->getBasename($this->fileExtension); + + if ($fileName == $file->getBasename() || $fileName == $globalBasename) { + continue; + } + + // NOTE: All files found here means classes are not transient! + if (isset($this->prefixes[$path])) { + $classes[] = $this->prefixes[$path].'\\'.str_replace('.', '\\', $fileName); + } else { + $classes[] = str_replace('.', '\\', $fileName); + } + } + } + } + + return $classes; + } + + /** + * {@inheritDoc} + */ + public function findMappingFile($className) + { + $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; + foreach ($this->paths as $path) { + if (!isset($this->prefixes[$path])) { + if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { + return $path.DIRECTORY_SEPARATOR.$defaultFileName; + } + + continue; + } + + $prefix = $this->prefixes[$path]; + + if (0 !== strpos($className, $prefix.'\\')) { + continue; + } + + $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; + if (is_file($filename)) { + return $filename; + } + + throw MappingException::mappingFileNotFound($className, $filename); + } + + throw MappingException::mappingFileNotFound($className, substr($className, strrpos($className, '\\') + 1).$this->fileExtension); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php new file mode 100644 index 00000000..4ecd2ad5 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php @@ -0,0 +1,57 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * A MappingException indicates that something is wrong with the mapping setup. + * + * @since 2.2 + */ +class MappingException extends \Exception +{ + public static function classNotFoundInNamespaces($className, $namespaces) + { + return new self("The class '" . $className . "' was not found in the ". + "chain configured namespaces " . implode(", ", $namespaces)); + } + + public static function pathRequired() + { + return new self("Specifying the paths to your entities is required ". + "in the AnnotationDriver to retrieve all class names."); + } + + public static function fileMappingDriversRequireConfiguredDirectoryPath($path = null) + { + if ( ! empty($path)) { + $path = '[' . $path . ']'; + } + + return new self( + 'File mapping drivers must have a valid directory path, ' . + 'however the given path ' . $path . ' seems to be incorrect!' + ); + } + + public static function mappingFileNotFound($entityName, $fileName) + { + return new self("No mapping file found named '$fileName' for class '$entityName'."); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php new file mode 100644 index 00000000..4e0e312f --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php @@ -0,0 +1,80 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Very simple reflection service abstraction. + * + * This is required inside metadata layers that may require either + * static or runtime reflection. + * + * @author Benjamin Eberlei + */ +interface ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + function getParentClasses($class); + + /** + * Return the shortname of a class. + * + * @param string $class + * @return string + */ + function getClassShortName($class); + + /** + * @param string $class + * @return string + */ + function getClassNamespace($class); + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + function getClass($class); + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + function getAccessibleProperty($class, $property); + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + function hasPublicMethod($class, $method); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php new file mode 100644 index 00000000..abcff581 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php @@ -0,0 +1,102 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use ReflectionClass; +use ReflectionProperty; + +/** + * PHP Runtime Reflection Service + * + * @author Benjamin Eberlei + */ +class RuntimeReflectionService implements ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + public function getParentClasses($class) + { + return class_parents($class); + } + + /** + * Return the shortname of a class. + * + * @param string $class + * @return string + */ + public function getClassShortName($class) + { + $r = new ReflectionClass($class); + return $r->getShortName(); + } + + /** + * @param string $class + * @return string + */ + public function getClassNamespace($class) + { + $r = new ReflectionClass($class); + return $r->getNamespaceName(); + } + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + public function getClass($class) + { + return new ReflectionClass($class); + } + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + public function getAccessibleProperty($class, $property) + { + $property = new ReflectionProperty($class, $property); + $property->setAccessible(true); + return $property; + } + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + public function hasPublicMethod($class, $method) + { + return method_exists($class, $method) && is_callable(array($class, $method)); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php new file mode 100644 index 00000000..2de6e761 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php @@ -0,0 +1,107 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use ReflectionClass; +use ReflectionProperty; + +/** + * PHP Runtime Reflection Service + * + * @author Benjamin Eberlei + */ +class StaticReflectionService implements ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + public function getParentClasses($class) + { + return array(); + } + + /** + * Return the shortname of a class. + * + * @param string $className + * @return string + */ + public function getClassShortName($className) + { + if (strpos($className, '\\') !== false) { + $className = substr($className, strrpos($className, "\\")+1); + } + return $className; + } + + /** + * Return the namespace of a class. + * + * @param string $className + * @return string + */ + public function getClassNamespace($className) + { + $namespace = ''; + if (strpos($className, '\\') !== false) { + $namespace = strrev(substr( strrev($className), strpos(strrev($className), '\\')+1 )); + } + return $namespace; + } + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + public function getClass($class) + { + return null; + } + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + public function getAccessibleProperty($class, $property) + { + return null; + } + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + public function hasPublicMethod($class, $method) + { + return method_exists($class, $method) && is_callable(array($class, $method)); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php new file mode 100644 index 00000000..6d70fc12 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php @@ -0,0 +1,143 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract for a Doctrine persistence layer ObjectManager class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ObjectManager +{ + /** + * Finds a object by its identifier. + * + * This is just a convenient shortcut for getRepository($className)->find($id). + * + * @param string + * @param mixed + * @return object + */ + function find($className, $id); + + /** + * Tells the ObjectManager to make an instance managed and persistent. + * + * The object will be entered into the database as a result of the flush operation. + * + * NOTE: The persist operation always considers objects that are not yet known to + * this ObjectManager as NEW. Do not pass detached objects to the persist operation. + * + * @param object $object The instance to make managed and persistent. + */ + function persist($object); + + /** + * Removes an object instance. + * + * A removed object will be removed from the database as a result of the flush operation. + * + * @param object $object The object instance to remove. + */ + function remove($object); + + /** + * Merges the state of a detached object into the persistence context + * of this ObjectManager and returns the managed copy of the object. + * The object passed to merge will not become associated/managed with this ObjectManager. + * + * @param object $object + */ + function merge($object); + + /** + * Detaches an object from the ObjectManager, causing a managed object to + * become detached. Unflushed changes made to the object if any + * (including removal of the object), will not be synchronized to the database. + * Objects which previously referenced the detached object will continue to + * reference it. + * + * @param object $object The object to detach. + */ + function detach($object); + + /** + * Refreshes the persistent state of an object from the database, + * overriding any local changes that have not yet been persisted. + * + * @param object $object The object to refresh. + */ + function refresh($object); + + /** + * Flushes all changes to objects that have been queued up to now to the database. + * This effectively synchronizes the in-memory state of managed objects with the + * database. + */ + function flush(); + + /** + * Gets the repository for a class. + * + * @param string $className + * @return \Doctrine\Common\Persistence\ObjectRepository + */ + function getRepository($className); + + /** + * Returns the ClassMetadata descriptor for a class. + * + * The class name must be the fully-qualified class name without a leading backslash + * (as it is returned by get_class($obj)). + * + * @param string $className + * @return \Doctrine\Common\Persistence\Mapping\ClassMetadata + */ + function getClassMetadata($className); + + /** + * Gets the metadata factory used to gather the metadata of classes. + * + * @return Doctrine\Common\Persistence\Mapping\ClassMetadataFactory + */ + function getMetadataFactory(); + + /** + * Helper method to initialize a lazy loading proxy or persistent collection. + * + * This method is a no-op for other objects. + * + * @param object $obj + */ + function initializeObject($obj); + + /** + * Check if the object is part of the current UnitOfWork and therefore + * managed. + * + * @param object $object + * @return bool + */ + function contains($object); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php new file mode 100644 index 00000000..015dd3dd --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php @@ -0,0 +1,49 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Makes a Persistent Objects aware of its own object-manager. + * + * Using this interface the managing object manager and class metadata instances + * are injected into the persistent object after construction. This allows + * you to implement ActiveRecord functionality on top of the persistance-ignorance + * that Doctrine propagates. + * + * Word of Warning: This is a very powerful hook to change how you can work with your domain models. + * Using this hook will break the Single Responsibility Principle inside your Domain Objects + * and increase the coupling of database and objects. + * + * Every ObjectManager has to implement this functionality itself. + * + * @author Benjamin Eberlei + */ +interface ObjectManagerAware +{ + /** + * Injects responsible ObjectManager and the ClassMetadata into this persistent object. + * + * @param ObjectManager $objectManager + * @param ClassMetadata $classMetadata + */ + public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php new file mode 100644 index 00000000..22633288 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php @@ -0,0 +1,78 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract for a Doctrine persistence layer ObjectRepository class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ObjectRepository +{ + /** + * Finds an object by its primary key / identifier. + * + * @param $id The identifier. + * @return object The object. + */ + function find($id); + + /** + * Finds all objects in the repository. + * + * @return mixed The objects. + */ + function findAll(); + + /** + * Finds objects by a set of criteria. + * + * Optionally sorting and limiting details can be passed. An implementation may throw + * an UnexpectedValueException if certain values of the sorting or limiting details are + * not supported. + * + * @throws UnexpectedValueException + * @param array $criteria + * @param array|null $orderBy + * @param int|null $limit + * @param int|null $offset + * @return mixed The objects. + */ + function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null); + + /** + * Finds a single object by a set of criteria. + * + * @param array $criteria + * @return object The object. + */ + function findOneBy(array $criteria); + + /** + * Returns the class name of the object managed by the repository + * + * @return string + */ + function getClassName(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php new file mode 100644 index 00000000..4274af62 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php @@ -0,0 +1,233 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; + +/** + * PersistentObject base class that implements getter/setter methods for all mapped fields and associations + * by overriding __call. + * + * This class is a forward compatible implementation of the PersistentObject trait. + * + * + * Limitations: + * + * 1. All persistent objects have to be associated with a single ObjectManager, multiple + * ObjectManagers are not supported. You can set the ObjectManager with `PersistentObject#setObjectManager()`. + * 2. Setters and getters only work if a ClassMetadata instance was injected into the PersistentObject. + * This is either done on `postLoad` of an object or by accessing the global object manager. + * 3. There are no hooks for setters/getters. Just implement the method yourself instead of relying on __call(). + * 4. Slower than handcoded implementations: An average of 7 method calls per access to a field and 11 for an association. + * 5. Only the inverse side associations get autoset on the owning side aswell. Setting objects on the owning side + * will not set the inverse side associations. + * + * @example + * + * PersistentObject::setObjectManager($em); + * + * class Foo extends PersistentObject + * { + * private $id; + * } + * + * $foo = new Foo(); + * $foo->getId(); // method exists through __call + * + * @author Benjamin Eberlei + */ +abstract class PersistentObject implements ObjectManagerAware +{ + /** + * @var ObjectManager + */ + private static $objectManager; + + /** + * @var ClassMetadata + */ + private $cm; + + /** + * Set the object manager responsible for all persistent object base classes. + * + * @param ObjectManager $objectManager + */ + static public function setObjectManager(ObjectManager $objectManager = null) + { + self::$objectManager = $objectManager; + } + + /** + * @return ObjectManager + */ + static public function getObjectManager() + { + return self::$objectManager; + } + + /** + * Inject Doctrine Object Manager + * + * @param ObjectManager $objectManager + * @param ClassMetadata $classMetadata + */ + public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata) + { + if ($objectManager !== self::$objectManager) { + throw new \RuntimeException("Trying to use PersistentObject with different ObjectManager instances. " . + "Was PersistentObject::setObjectManager() called?"); + } + + $this->cm = $classMetadata; + } + + /** + * Sets a persistent fields value. + * + * @throws InvalidArgumentException - When the wrong target object type is passed to an association + * @throws BadMethodCallException - When no persistent field exists by that name. + * @param string $field + * @param array $args + * @return void + */ + private function set($field, $args) + { + $this->initializeDoctrine(); + + if ($this->cm->hasField($field) && !$this->cm->isIdentifier($field)) { + $this->$field = $args[0]; + } else if ($this->cm->hasAssociation($field) && $this->cm->isSingleValuedAssociation($field)) { + $targetClass = $this->cm->getAssociationTargetClass($field); + if (!($args[0] instanceof $targetClass) && $args[0] !== null) { + throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); + } + $this->$field = $args[0]; + $this->completeOwningSide($field, $targetClass, $args[0]); + } else { + throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); + } + } + + /** + * Get persistent field value. + * + * @throws BadMethodCallException - When no persistent field exists by that name. + * @param string $field + * @return mixed + */ + private function get($field) + { + $this->initializeDoctrine(); + + if ( $this->cm->hasField($field) || $this->cm->hasAssociation($field) ) { + return $this->$field; + } else { + throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); + } + } + + /** + * If this is an inverse side association complete the owning side. + * + * @param string $field + * @param ClassMetadata $targetClass + * @param object $targetObject + */ + private function completeOwningSide($field, $targetClass, $targetObject) + { + // add this object on the owning side aswell, for obvious infinite recursion + // reasons this is only done when called on the inverse side. + if ($this->cm->isAssociationInverseSide($field)) { + $mappedByField = $this->cm->getAssociationMappedByTargetField($field); + $targetMetadata = self::$objectManager->getClassMetadata($targetClass); + + $setter = ($targetMetadata->isCollectionValuedAssociation($mappedByField) ? "add" : "set").$mappedByField; + $targetObject->$setter($this); + } + } + + /** + * Add an object to a collection + * + * @param type $field + * @param assoc $args + */ + private function add($field, $args) + { + $this->initializeDoctrine(); + + if ($this->cm->hasAssociation($field) && $this->cm->isCollectionValuedAssociation($field)) { + $targetClass = $this->cm->getAssociationTargetClass($field); + if (!($args[0] instanceof $targetClass)) { + throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); + } + if (!($this->$field instanceof Collection)) { + $this->$field = new ArrayCollection($this->$field ?: array()); + } + $this->$field->add($args[0]); + $this->completeOwningSide($field, $targetClass, $args[0]); + } else { + throw new \BadMethodCallException("There is no method add".$field."() on ".$this->cm->getName()); + } + } + + /** + * Initialize Doctrine Metadata for this class. + * + * @return void + */ + private function initializeDoctrine() + { + if ($this->cm !== null) { + return; + } + + if (!self::$objectManager) { + throw new \RuntimeException("No runtime object manager set. Call PersistentObject#setObjectManager()."); + } + + $this->cm = self::$objectManager->getClassMetadata(get_class($this)); + } + + /** + * Magic method that implements + * + * @param string $method + * @param array $args + * @return mixed + */ + public function __call($method, $args) + { + $command = substr($method, 0, 3); + $field = lcfirst(substr($method, 3)); + if ($command == "set") { + $this->set($field, $args); + } else if ($command == "get") { + return $this->get($field); + } else if ($command == "add") { + $this->add($field, $args); + } else { + throw new \BadMethodCallException("There is no method ".$method." on ".$this->cm->getName()); + } + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php new file mode 100644 index 00000000..726979fc --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php @@ -0,0 +1,60 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Interface for proxy classes. + * + * @author Roman Borschel + * @since 2.2 + */ +interface Proxy +{ + /** + * Marker for Proxy class names. + * + * @var string + */ + const MARKER = '__CG__'; + + /** + * Length of the proxy marker + * + * @var int + */ + const MARKER_LENGTH = 6; + + /** + * Initialize this proxy if its not yet initialized. + * + * Acts as a no-op if already initialized. + * + * @return void + */ + public function __load(); + + /** + * Is this proxy initialized or not. + * + * @return bool + */ + public function __isInitialized(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php b/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php new file mode 100644 index 00000000..87c5b413 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php @@ -0,0 +1,48 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Contract for classes that are potential listeners of a NotifyPropertyChanged + * implementor. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface PropertyChangedListener +{ + /** + * Notifies the listener of a property change. + * + * @param object $sender The object on which the property changed. + * @param string $propertyName The name of the property that changed. + * @param mixed $oldValue The old value of the property that changed. + * @param mixed $newValue The new value of the property that changed. + */ + function propertyChanged($sender, $propertyName, $oldValue, $newValue); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php new file mode 100644 index 00000000..c3462782 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php @@ -0,0 +1,103 @@ +. + */ + +namespace Doctrine\Common\Util; + +use Doctrine\Common\Persistence\Proxy; + +/** + * Class and reflection related functionality for objects that + * might or not be proxy objects at the moment. + * + * @author Benjamin Eberlei + * @author Johannes Schmitt + */ +class ClassUtils +{ + /** + * Get the real class name of a class name that could be a proxy. + * + * @param string + * @return string + */ + public static function getRealClass($class) + { + if (false === $pos = strrpos($class, '\\'.Proxy::MARKER.'\\')) { + return $class; + } + + return substr($class, $pos + Proxy::MARKER_LENGTH + 2); + } + + /** + * Get the real class name of an object (even if its a proxy) + * + * @param object + * @return string + */ + public static function getClass($object) + { + return self::getRealClass(get_class($object)); + } + + /** + * Get the real parent class name of a class or object + * + * @param string + * @return string + */ + public static function getParentClass($className) + { + return get_parent_class( self::getRealClass( $className ) ); + } + + /** + * Create a new reflection class + * + * @param string + * @return ReflectionClass + */ + public static function newReflectionClass($class) + { + return new \ReflectionClass( self::getRealClass( $class ) ); + } + + /** + * Create a new reflection object + * + * @param object + * @return ReflectionObject + */ + public static function newReflectionObject($object) + { + return self::newReflectionClass( self::getClass( $object ) ); + } + + /** + * Given a class name and a proxy namespace return the proxy name. + * + * @param string $className + * @param string $proxyNamespace + * @return string + */ + public static function generateProxyClassName($className, $proxyNamespace) + { + return rtrim($proxyNamespace, '\\') . '\\'.Proxy::MARKER.'\\' . ltrim($className, '\\'); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php new file mode 100644 index 00000000..57ae3120 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php @@ -0,0 +1,123 @@ +. + */ + +namespace Doctrine\Common\Util; + +/** + * Static class containing most used debug methods. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Giorgio Sironi + */ +final class Debug +{ + /** + * Private constructor (prevents from instantiation) + * + */ + private function __construct() {} + + /** + * Prints a dump of the public, protected and private properties of $var. + * + * @static + * @link http://xdebug.org/ + * @param mixed $var + * @param integer $maxDepth Maximum nesting level for object properties + * @param boolean $stripTags Flag that indicate if output should strip HTML tags + */ + public static function dump($var, $maxDepth = 2, $stripTags = true) + { + ini_set('html_errors', 'On'); + + if (extension_loaded('xdebug')) { + ini_set('xdebug.var_display_max_depth', $maxDepth); + } + + $var = self::export($var, $maxDepth++); + + ob_start(); + var_dump($var); + $dump = ob_get_contents(); + ob_end_clean(); + + echo ($stripTags ? strip_tags(html_entity_decode($dump)) : $dump); + + ini_set('html_errors', 'Off'); + } + + public static function export($var, $maxDepth) + { + $return = null; + $isObj = is_object($var); + + if ($isObj && in_array('Doctrine\Common\Collections\Collection', class_implements($var))) { + $var = $var->toArray(); + } + + if ($maxDepth) { + if (is_array($var)) { + $return = array(); + + foreach ($var as $k => $v) { + $return[$k] = self::export($v, $maxDepth - 1); + } + } else if ($isObj) { + $return = new \stdclass(); + if ($var instanceof \DateTime) { + $return->__CLASS__ = "DateTime"; + $return->date = $var->format('c'); + $return->timezone = $var->getTimeZone()->getName(); + } else { + $reflClass = ClassUtils::newReflectionObject($var); + $return->__CLASS__ = ClassUtils::getClass($var); + + if ($var instanceof \Doctrine\Common\Persistence\Proxy) { + $return->__IS_PROXY__ = true; + $return->__PROXY_INITIALIZED__ = $var->__isInitialized(); + } + + foreach ($reflClass->getProperties() as $reflProperty) { + $name = $reflProperty->getName(); + + $reflProperty->setAccessible(true); + $return->$name = self::export($reflProperty->getValue($var), $maxDepth - 1); + } + } + } else { + $return = $var; + } + } else { + $return = is_object($var) ? get_class($var) + : (is_array($var) ? 'Array(' . count($var) . ')' : $var); + } + + return $return; + } + + public static function toString($obj) + { + return method_exists('__toString', $obj) ? (string) $obj : get_class($obj) . '@' . spl_object_hash($obj); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php new file mode 100644 index 00000000..ba1eb17b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php @@ -0,0 +1,72 @@ +. + */ + +namespace Doctrine\Common\Util; + +/** + * Doctrine inflector has static methods for inflecting text + * + * The methods in these classes are from several different sources collected + * across several different php projects and several different authors. The + * original author names and emails are not known + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 1.0 + * @version $Revision: 3189 $ + * @author Konsta Vesterinen + * @author Jonathan H. Wage + */ +class Inflector +{ + /** + * Convert word in to the format for a Doctrine table name. Converts 'ModelName' to 'model_name' + * + * @param string $word Word to tableize + * @return string $word Tableized word + */ + public static function tableize($word) + { + return strtolower(preg_replace('~(?<=\\w)([A-Z])~', '_$1', $word)); + } + + /** + * Convert a word in to the format for a Doctrine class name. Converts 'table_name' to 'TableName' + * + * @param string $word Word to classify + * @return string $word Classified word + */ + public static function classify($word) + { + return str_replace(" ", "", ucwords(strtr($word, "_-", " "))); + } + + /** + * Camelize a word. This uses the classify() method and turns the first character to lowercase + * + * @param string $word + * @return string $word + */ + public static function camelize($word) + { + return lcfirst(self::classify($word)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Version.php b/vendor/doctrine/common/lib/Doctrine/Common/Version.php new file mode 100644 index 00000000..7a87311f --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Version.php @@ -0,0 +1,55 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Class to store and retrieve the version of Doctrine + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class Version +{ + /** + * Current Doctrine Version + */ + const VERSION = '2.2.3'; + + /** + * Compares a Doctrine version with the current one. + * + * @param string $version Doctrine version to compare. + * @return int Returns -1 if older, 0 if it is the same, 1 if version + * passed as argument is newer. + */ + public static function compare($version) + { + $currentVersion = str_replace(' ', '', strtolower(self::VERSION)); + $version = str_replace(' ', '', $version); + + return version_compare($version, $currentVersion); + } +} diff --git a/vendor/doctrine/common/phpunit.xml.dist b/vendor/doctrine/common/phpunit.xml.dist new file mode 100644 index 00000000..b9d3b340 --- /dev/null +++ b/vendor/doctrine/common/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + ./tests/Doctrine/ + + + + + + ./lib/Doctrine/ + + + + + + performance + + + diff --git a/vendor/doctrine/common/tests/.gitignore b/vendor/doctrine/common/tests/.gitignore new file mode 100644 index 00000000..72104052 --- /dev/null +++ b/vendor/doctrine/common/tests/.gitignore @@ -0,0 +1,3 @@ +Doctrine/Tests/Proxies/ +Doctrine/Tests/ORM/Proxy/generated/ +Doctrine/Tests/ORM/Tools/Export/export diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php new file mode 100644 index 00000000..0a329a3c --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php @@ -0,0 +1,538 @@ +getReader(); + + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\DummyClass'); + $this->assertEquals(1, count($reader->getClassAnnotations($class))); + $this->assertInstanceOf($annotName = 'Doctrine\Tests\Common\Annotations\DummyAnnotation', $annot = $reader->getClassAnnotation($class, $annotName)); + $this->assertEquals("hello", $annot->dummyValue); + + $field1Prop = $class->getProperty('field1'); + $propAnnots = $reader->getPropertyAnnotations($field1Prop); + $this->assertEquals(1, count($propAnnots)); + $this->assertInstanceOf($annotName, $annot = $reader->getPropertyAnnotation($field1Prop, $annotName)); + $this->assertEquals("fieldHello", $annot->dummyValue); + + $getField1Method = $class->getMethod('getField1'); + $methodAnnots = $reader->getMethodAnnotations($getField1Method); + $this->assertEquals(1, count($methodAnnots)); + $this->assertInstanceOf($annotName, $annot = $reader->getMethodAnnotation($getField1Method, $annotName)); + $this->assertEquals(array(1, 2, "three"), $annot->value); + + $field2Prop = $class->getProperty('field2'); + $propAnnots = $reader->getPropertyAnnotations($field2Prop); + $this->assertEquals(1, count($propAnnots)); + $this->assertInstanceOf($annotName = 'Doctrine\Tests\Common\Annotations\DummyJoinTable', $joinTableAnnot = $reader->getPropertyAnnotation($field2Prop, $annotName)); + $this->assertEquals(1, count($joinTableAnnot->joinColumns)); + $this->assertEquals(1, count($joinTableAnnot->inverseJoinColumns)); + $this->assertTrue($joinTableAnnot->joinColumns[0] instanceof DummyJoinColumn); + $this->assertTrue($joinTableAnnot->inverseJoinColumns[0] instanceof DummyJoinColumn); + $this->assertEquals('col1', $joinTableAnnot->joinColumns[0]->name); + $this->assertEquals('col2', $joinTableAnnot->joinColumns[0]->referencedColumnName); + $this->assertEquals('col3', $joinTableAnnot->inverseJoinColumns[0]->name); + $this->assertEquals('col4', $joinTableAnnot->inverseJoinColumns[0]->referencedColumnName); + + $dummyAnnot = $reader->getMethodAnnotation($class->getMethod('getField1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('', $dummyAnnot->dummyValue); + $this->assertEquals(array(1, 2, 'three'), $dummyAnnot->value); + + $dummyAnnot = $reader->getPropertyAnnotation($class->getProperty('field1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('fieldHello', $dummyAnnot->dummyValue); + + $classAnnot = $reader->getClassAnnotation($class, 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('hello', $classAnnot->dummyValue); + } + + public function testAnnotationsWithValidTargets() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithValidAnnotationTarget'); + + $this->assertEquals(1,count($reader->getClassAnnotations($class))); + $this->assertEquals(1,count($reader->getPropertyAnnotations($class->getProperty('foo')))); + $this->assertEquals(1,count($reader->getMethodAnnotations($class->getMethod('someFunction')))); + $this->assertEquals(1,count($reader->getPropertyAnnotations($class->getProperty('nested')))); + } + + public function testAnnotationsWithVarType() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $this->assertEquals(1,count($fooAnnot = $reader->getPropertyAnnotations($class->getProperty('foo')))); + $this->assertEquals(1,count($barAnnot = $reader->getMethodAnnotations($class->getMethod('bar')))); + + $this->assertInternalType('string', $fooAnnot[0]->string); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', $barAnnot[0]->annotation); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetPropertyMethod is not allowed to be declared on class Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass. You may only use this annotation on these code elements: METHOD, PROPERTY + */ + public function testClassWithInvalidAnnotationTargetAtClassDocBlock() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetClass is not allowed to be declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty::$foo. You may only use this annotation on these code elements: CLASS + */ + public function testClassWithInvalidAnnotationTargetAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty', 'foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetAnnotation is not allowed to be declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty::$bar. You may only use this annotation on these code elements: ANNOTATION + */ + public function testClassWithInvalidNestedAnnotationTargetAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty', 'bar')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetClass is not allowed to be declared on method Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod::functionName(). You may only use this annotation on these code elements: CLASS + */ + public function testClassWithInvalidAnnotationTargetAtMethodDocBlock() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod', 'functionName')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtClassDocBlock() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError','foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtMethodDocBlock() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError','bar')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Type Error] Attribute "string" of @AnnotationWithVarType declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType::$invalidProperty expects a(n) string, but got integer. + */ + public function testClassWithPropertyInvalidVarTypeError() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $reader->getPropertyAnnotations($class->getProperty('invalidProperty')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Type Error] Attribute "annotation" of @AnnotationWithVarType declared on method Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType::invalidMethod() expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll, but got an instance of Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. + */ + public function testClassWithMethodInvalidVarTypeError() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $reader->getMethodAnnotations($class->getMethod('invalidMethod')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in class Doctrine\Tests\Common\Annotations\DummyClassSyntaxError. + */ + public function testClassSyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\DummyClassSyntaxError')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in method Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError::foo(). + */ + public function testMethodSyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError', 'foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in property Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError::$foo. + */ + public function testPropertySyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError', 'foo')); + } + + /** + * @group regression + */ + public function testMultipleAnnotationsOnSameLine() + { + $reader = $this->getReader(); + $annots = $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClass2', 'id')); + $this->assertEquals(3, count($annots)); + } + + public function testNonAnnotationProblem() + { + $reader = $this->getReader(); + + $this->assertNotNull($annot = $reader->getPropertyAnnotation(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClassNonAnnotationProblem', 'foo'), $name = 'Doctrine\Tests\Common\Annotations\DummyAnnotation')); + $this->assertInstanceOf($name, $annot); + } + + public function testImportWithConcreteAnnotation() + { + $reader = $this->getReader(); + $property = new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestImportWithConcreteAnnotation', 'field'); + $annotations = $reader->getPropertyAnnotations($property); + $this->assertEquals(1, count($annotations)); + $this->assertNotNull($reader->getPropertyAnnotation($property, 'Doctrine\Tests\Common\Annotations\DummyAnnotation')); + } + + public function testImportWithInheritance() + { + $reader = $this->getReader(); + + $class = new TestParentClass(); + $ref = new \ReflectionClass($class); + + $childAnnotations = $reader->getPropertyAnnotations($ref->getProperty('child')); + $this->assertEquals(1, count($childAnnotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Foo\Name', reset($childAnnotations)); + + $parentAnnotations = $reader->getPropertyAnnotations($ref->getProperty('parent')); + $this->assertEquals(1, count($parentAnnotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Bar\Name', reset($parentAnnotations)); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation "@NameFoo" in property Doctrine\Tests\Common\Annotations\TestAnnotationNotImportedClass::$field was never imported. + */ + public function testImportDetectsNotImportedAnnotation() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestAnnotationNotImportedClass', 'field')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation "@Foo\Bar\Name" in property Doctrine\Tests\Common\Annotations\TestNonExistentAnnotationClass::$field was never imported. + */ + public function testImportDetectsNonExistentAnnotation() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestNonExistentAnnotationClass', 'field')); + } + + public function testTopLevelAnnotation() + { + $reader = $this->getReader(); + $annotations = $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestTopLevelAnnotationClass', 'field')); + + $this->assertEquals(1, count($annotations)); + $this->assertInstanceOf('\TopLevelAnnotation', reset($annotations)); + } + + public function testIgnoresAnnotationsNotPrefixedWithWhitespace() + { + $reader = $this->getReader(); + + $annotation = $reader->getClassAnnotation(new \ReflectionClass(new TestIgnoresNonAnnotationsClass()), 'Doctrine\Tests\Common\Annotations\Name'); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Name', $annotation); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The class "Doctrine\Tests\Common\Annotations\Fixtures\NoAnnotation" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "Doctrine\Tests\Common\Annotations\Fixtures\NoAnnotation". If it is indeed no annotation, then you need to add @IgnoreAnnotation("NoAnnotation") to the _class_ doc comment of class Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageClass. + */ + public function testErrorWhenInvalidAnnotationIsUsed() + { + $reader = $this->getReader(); + $ref = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageClass'); + $reader->getClassAnnotations($ref); + } + + public function testInvalidAnnotationUsageButIgnoredClass() + { + $reader = $this->getReader(); + $ref = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageButIgnoredClass'); + $annots = $reader->getClassAnnotations($ref); + + $this->assertEquals(2, count($annots)); + } + + /** + * @group DDC-1660 + * @group regression + */ + public function testInvalidAnnotationButIgnored() + { + $reader = $this->getReader(); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassDDC1660'); + + $this->assertTrue(class_exists('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Version')); + $this->assertCount(0, $reader->getClassAnnotations($class)); + $this->assertCount(0, $reader->getMethodAnnotations($class->getMethod('bar'))); + $this->assertCount(0, $reader->getPropertyAnnotations($class->getProperty('foo'))); + } + + abstract protected function getReader(); +} + +/** + * @parseAnnotation("var") + * @author Johannes M. Schmitt + * + */ +class TestParseAnnotationClass +{ + /** + * @var + */ + private $field; +} + +/** + * @Name + * @author Johannes M. Schmitt + */ +class TestIgnoresNonAnnotationsClass +{ +} + +class TestTopLevelAnnotationClass +{ + /** + * @\TopLevelAnnotation + */ + private $field; +} + +class TestNonExistentAnnotationClass +{ + /** + * @Foo\Bar\Name + */ + private $field; +} + +class TestAnnotationNotImportedClass +{ + /** + * @NameFoo + */ + private $field; +} + +class TestChildClass +{ + /** + * @\Doctrine\Tests\Common\Annotations\Foo\Name(name = "foo") + */ + protected $child; +} + +class TestParentClass extends TestChildClass +{ + /** + * @\Doctrine\Tests\Common\Annotations\Bar\Name(name = "bar") + */ + private $parent; +} + +class TestImportWithConcreteAnnotation +{ + /** + * @DummyAnnotation(dummyValue = "bar") + */ + private $field; +} + +/** + * A description of this class. + * + * Let's see if the parser recognizes that this @ is not really referring to an + * annotation. Also make sure that @var \ is not concated to "@var\is". + * + * @author robo + * @since 2.0 + * @DummyAnnotation(dummyValue="hello") + */ +class DummyClass { + /** + * A nice property. + * + * @var mixed + * @DummyAnnotation(dummyValue="fieldHello") + */ + private $field1; + + /** + * @DummyJoinTable(name="join_table", + * joinColumns={@DummyJoinColumn(name="col1", referencedColumnName="col2")}, + * inverseJoinColumns={ + * @DummyJoinColumn(name="col3", referencedColumnName="col4") + * }) + */ + private $field2; + + /** + * Gets the value of field1. + * + * @return mixed + * @DummyAnnotation({1,2,"three"}) + */ + public function getField1() { + } +} + +/** + * @ignoreAnnotation("var") + */ +class DummyClass2 { + /** + * @DummyId @DummyColumn(type="integer") @DummyGeneratedValue + * @var integer + */ + private $id; +} + +/** @Annotation */ +class DummyId extends \Doctrine\Common\Annotations\Annotation {} +/** @Annotation */ +class DummyColumn extends \Doctrine\Common\Annotations\Annotation { + public $type; +} +/** @Annotation */ +class DummyGeneratedValue extends \Doctrine\Common\Annotations\Annotation {} +/** @Annotation */ +class DummyAnnotation extends \Doctrine\Common\Annotations\Annotation { + public $dummyValue; +} +/** @Annotation */ +class DummyJoinColumn extends \Doctrine\Common\Annotations\Annotation { + public $name; + public $referencedColumnName; +} +/** @Annotation */ +class DummyJoinTable extends \Doctrine\Common\Annotations\Annotation { + public $name; + public $joinColumns; + public $inverseJoinColumns; +} + +/** + * @DummyAnnotation(@) + */ +class DummyClassSyntaxError +{ + +} + +class DummyClassMethodSyntaxError +{ + /** + * @DummyAnnotation(@) + */ + public function foo() + { + + } +} + +class DummyClassPropertySyntaxError +{ + /** + * @DummyAnnotation(@) + */ + public $foo; +} + +/** + * @ignoreAnnotation({"since", "var"}) + */ +class DummyClassNonAnnotationProblem +{ + /** + * @DummyAnnotation + * + * @var \Test + * @since 0.1 + */ + public $foo; +} + + +/** +* @DummyAnnotation Foo bar +*/ +class DummyClassWithEmail +{ + +} + +namespace Doctrine\Tests\Common\Annotations\Foo; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation +{ + public $name; +} + +namespace Doctrine\Tests\Common\Annotations\Bar; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation +{ + public $name; +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php new file mode 100644 index 00000000..d2cc6678 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php @@ -0,0 +1,13 @@ +getMock('Doctrine\Common\Cache\Cache'); + $cache + ->expects($this->at(0)) + ->method('fetch') + ->with($this->equalTo($cacheKey)) + ->will($this->returnValue(array())) + ; + $cache + ->expects($this->at(1)) + ->method('fetch') + ->with($this->equalTo('[C]'.$cacheKey)) + ->will($this->returnValue(time() - 10)) + ; + $cache + ->expects($this->at(2)) + ->method('save') + ->with($this->equalTo($cacheKey)) + ; + $cache + ->expects($this->at(3)) + ->method('save') + ->with($this->equalTo('[C]'.$cacheKey)) + ; + + $reader = new CachedReader(new AnnotationReader(), $cache, true); + $route = new Route(); + $route->pattern = '/someprefix'; + $this->assertEquals(array($route), $reader->getClassAnnotations(new \ReflectionClass($name))); + } + + protected function getReader() + { + $this->cache = new ArrayCache(); + return new CachedReader(new AnnotationReader(), $this->cache); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php new file mode 100644 index 00000000..cb080f08 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php @@ -0,0 +1,27 @@ +setInput("@Name"); + $this->assertNull($lexer->token); + $this->assertNull($lexer->lookahead); + + $this->assertTrue($lexer->moveNext()); + $this->assertNull($lexer->token); + $this->assertEquals('@', $lexer->lookahead['value']); + + $this->assertTrue($lexer->moveNext()); + $this->assertEquals('@', $lexer->token['value']); + $this->assertEquals('Name', $lexer->lookahead['value']); + + $this->assertFalse($lexer->moveNext()); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php new file mode 100644 index 00000000..56cae7fd --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php @@ -0,0 +1,1118 @@ +createTestParser(); + + // Nested arrays with nested annotations + $result = $parser->parse('@Name(foo={1,2, {"key"=@Name}})'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertNull($annot->value); + $this->assertEquals(3, count($annot->foo)); + $this->assertEquals(1, $annot->foo[0]); + $this->assertEquals(2, $annot->foo[1]); + $this->assertTrue(is_array($annot->foo[2])); + + $nestedArray = $annot->foo[2]; + $this->assertTrue(isset($nestedArray['key'])); + $this->assertTrue($nestedArray['key'] instanceof Name); + } + + public function testBasicAnnotations() + { + $parser = $this->createTestParser(); + + // Marker annotation + $result = $parser->parse("@Name"); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertNull($annot->value); + $this->assertNull($annot->foo); + + // Associative arrays + $result = $parser->parse('@Name(foo={"key1" = "value1"})'); + $annot = $result[0]; + $this->assertNull($annot->value); + $this->assertTrue(is_array($annot->foo)); + $this->assertTrue(isset($annot->foo['key1'])); + + // Numerical arrays + $result = $parser->parse('@Name({2="foo", 4="bar"})'); + $annot = $result[0]; + $this->assertTrue(is_array($annot->value)); + $this->assertEquals('foo', $annot->value[2]); + $this->assertEquals('bar', $annot->value[4]); + $this->assertFalse(isset($annot->value[0])); + $this->assertFalse(isset($annot->value[1])); + $this->assertFalse(isset($annot->value[3])); + + // Multiple values + $result = $parser->parse('@Name(@Name, @Name)'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertTrue(is_array($annot->value)); + $this->assertTrue($annot->value[0] instanceof Name); + $this->assertTrue($annot->value[1] instanceof Name); + + // Multiple types as values + $result = $parser->parse('@Name(foo="Bar", @Name, {"key1"="value1", "key2"="value2"})'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertTrue(is_array($annot->value)); + $this->assertTrue($annot->value[0] instanceof Name); + $this->assertTrue(is_array($annot->value[1])); + $this->assertEquals('value1', $annot->value[1]['key1']); + $this->assertEquals('value2', $annot->value[1]['key2']); + + // Complete docblock + $docblock = <<parse($docblock); + $this->assertEquals(1, count($result)); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + $this->assertNull($annot->value); + } + + public function testNamespacedAnnotations() + { + $parser = new DocParser; + $parser->setIgnoreNotImportedAnnotations(true); + + $docblock = << + * @Doctrine\Tests\Common\Annotations\Name(foo="bar") + * @ignore + */ +DOCBLOCK; + + $result = $parser->parse($docblock); + $this->assertEquals(1, count($result)); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + } + + /** + * @group debug + */ + public function testTypicalMethodDocBlock() + { + $parser = $this->createTestParser(); + + $docblock = <<parse($docblock); + $this->assertEquals(2, count($result)); + $this->assertTrue(isset($result[0])); + $this->assertTrue(isset($result[1])); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + $marker = $result[1]; + $this->assertTrue($marker instanceof Marker); + } + + + public function testAnnotationWithoutConstructor() + { + $parser = $this->createTestParser(); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertNotNull($annot); + $this->assertTrue($annot instanceof SomeAnnotationClassNameWithoutConstructor); + + $this->assertNull($annot->name); + $this->assertNotNull($annot->data); + $this->assertEquals($annot->data, "Some data"); + + + + +$docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertNotNull($annot); + $this->assertTrue($annot instanceof SomeAnnotationClassNameWithoutConstructor); + + $this->assertEquals($annot->name, "Some Name"); + $this->assertEquals($annot->data, "Some data"); + + + + +$docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->data, "Some data"); + $this->assertNull($annot->name); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertNull($annot->data); + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->data, "Some data"); + $this->assertNull($annot->name); + + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertEquals($annot->data, "Some data"); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertEquals($annot->data, "Some data"); + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $this->assertTrue($result[0] instanceof SomeAnnotationClassNameWithoutConstructorAndProperties); + } + + public function testAnnotationTarget() + { + + $parser = new DocParser; + $parser->setImports(array( + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations\Fixtures', + )); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithValidAnnotationTarget'); + + + $context = 'class ' . $class->getName(); + $docComment = $class->getDocComment(); + + $parser->setTarget(Target::TARGET_CLASS); + $this->assertNotNull($parser->parse($docComment,$context)); + + + $property = $class->getProperty('foo'); + $docComment = $property->getDocComment(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + + $parser->setTarget(Target::TARGET_PROPERTY); + $this->assertNotNull($parser->parse($docComment,$context)); + + + + $method = $class->getMethod('someFunction'); + $docComment = $property->getDocComment(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + + $parser->setTarget(Target::TARGET_METHOD); + $this->assertNotNull($parser->parse($docComment,$context)); + + + try { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass'); + $context = 'class ' . $class->getName(); + $docComment = $class->getDocComment(); + + $parser->setTarget(Target::TARGET_CLASS); + $parser->parse($class->getDocComment(),$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + + try { + + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod'); + $method = $class->getMethod('functionName'); + $docComment = $method->getDocComment(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + + $parser->setTarget(Target::TARGET_METHOD); + $parser->parse($docComment,$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + + try { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty'); + $property = $class->getProperty('foo'); + $docComment = $property->getDocComment(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + + $parser->setTarget(Target::TARGET_PROPERTY); + $parser->parse($docComment,$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + } + + public function getAnnotationVarTypeProviderValid() + { + //({attribute name}, {attribute value}) + return array( + // mixed type + array('mixed', '"String Value"'), + array('mixed', 'true'), + array('mixed', 'false'), + array('mixed', '1'), + array('mixed', '1.2'), + array('mixed', '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll'), + + // boolean type + array('boolean', 'true'), + array('boolean', 'false'), + + // alias for internal type boolean + array('bool', 'true'), + array('bool', 'false'), + + // integer type + array('integer', '0'), + array('integer', '1'), + array('integer', '123456789'), + array('integer', '9223372036854775807'), + + // alias for internal type double + array('float', '0.1'), + array('float', '1.2'), + array('float', '123.456'), + + // string type + array('string', '"String Value"'), + array('string', '"true"'), + array('string', '"123"'), + + // array type + array('array', '{@AnnotationExtendsAnnotationTargetAll}'), + array('array', '{@AnnotationExtendsAnnotationTargetAll,@AnnotationExtendsAnnotationTargetAll}'), + + array('arrayOfIntegers', '1'), + array('arrayOfIntegers', '{1}'), + array('arrayOfIntegers', '{1,2,3,4}'), + array('arrayOfAnnotations', '@AnnotationExtendsAnnotationTargetAll'), + array('arrayOfAnnotations', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll}'), + array('arrayOfAnnotations', '{@AnnotationExtendsAnnotationTargetAll, @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll}'), + + // annotation instance + array('annotation', '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll'), + array('annotation', '@AnnotationExtendsAnnotationTargetAll'), + ); + } + + public function getAnnotationVarTypeProviderInvalid() + { + //({attribute name}, {type declared type}, {attribute value} , {given type or class}) + return array( + // boolean type + array('boolean','boolean','1','integer'), + array('boolean','boolean','1.2','double'), + array('boolean','boolean','"str"','string'), + array('boolean','boolean','{1,2,3}','array'), + array('boolean','boolean','@Name', 'an instance of Doctrine\Tests\Common\Annotations\Name'), + + // alias for internal type boolean + array('bool','bool', '1','integer'), + array('bool','bool', '1.2','double'), + array('bool','bool', '"str"','string'), + array('bool','bool', '{"str"}','array'), + + // integer type + array('integer','integer', 'true','boolean'), + array('integer','integer', 'false','boolean'), + array('integer','integer', '1.2','double'), + array('integer','integer', '"str"','string'), + array('integer','integer', '{"str"}','array'), + array('integer','integer', '{1,2,3,4}','array'), + + // alias for internal type double + array('float','float', 'true','boolean'), + array('float','float', 'false','boolean'), + array('float','float', '123','integer'), + array('float','float', '"str"','string'), + array('float','float', '{"str"}','array'), + array('float','float', '{12.34}','array'), + array('float','float', '{1,2,3}','array'), + + // string type + array('string','string', 'true','boolean'), + array('string','string', 'false','boolean'), + array('string','string', '12','integer'), + array('string','string', '1.2','double'), + array('string','string', '{"str"}','array'), + array('string','string', '{1,2,3,4}','array'), + + // annotation instance + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'true','boolean'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'false','boolean'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '12','integer'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '1.2','double'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{"str"}','array'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{1,2,3,4}','array'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '@Name','an instance of Doctrine\Tests\Common\Annotations\Name'), + ); + } + + public function getAnnotationVarTypeArrayProviderInvalid() + { + //({attribute name}, {type declared type}, {attribute value} , {given type or class}) + return array( + array('arrayOfIntegers','integer', 'true','boolean'), + array('arrayOfIntegers','integer', 'false','boolean'), + array('arrayOfIntegers','integer', '{true,true}','boolean'), + array('arrayOfIntegers','integer', '{1,true}','boolean'), + array('arrayOfIntegers','integer', '{1,2,1.2}','double'), + array('arrayOfIntegers','integer', '{1,2,"str"}','string'), + + + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'true','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'false','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,true}','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,true}','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,1.2}','double'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,@AnnotationExtendsAnnotationTargetAll,"str"}','string'), + ); + } + + /** + * @dataProvider getAnnotationVarTypeProviderValid + */ + public function testAnnotationWithVarType($attribute, $value) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::$invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + $result = $parser->parse($docblock, $context); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType', $result[0]); + $this->assertNotNull($result[0]->$attribute); + } + + /** + * @dataProvider getAnnotationVarTypeProviderInvalid + */ + public function testAnnotationWithVarTypeError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType declared on property SomeClassName::invalidProperty. expects a(n) $type, but got $given.", $exc->getMessage()); + } + } + + + /** + * @dataProvider getAnnotationVarTypeArrayProviderInvalid + */ + public function testAnnotationWithVarTypeArrayError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType declared on property SomeClassName::invalidProperty. expects either a(n) $type, or an array of {$type}s, but got $given.", $exc->getMessage()); + } + } + + /** + * @dataProvider getAnnotationVarTypeProviderValid + */ + public function testAnnotationWithAttributes($attribute, $value) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::$invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + $result = $parser->parse($docblock, $context); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes', $result[0]); + $getter = "get".ucfirst($attribute); + $this->assertNotNull($result[0]->$getter()); + } + + /** + * @dataProvider getAnnotationVarTypeProviderInvalid + */ + public function testAnnotationWithAttributesError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes declared on property SomeClassName::invalidProperty. expects a(n) $type, but got $given.", $exc->getMessage()); + } + } + + + /** + * @dataProvider getAnnotationVarTypeArrayProviderInvalid + */ + public function testAnnotationWithAttributesWithVarTypeArrayError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes declared on property SomeClassName::invalidProperty. expects either a(n) $type, or an array of {$type}s, but got $given.", $exc->getMessage()); + } + } + + public function testAnnotationWithRequiredAttributes() + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $parser->setTarget(Target::TARGET_PROPERTY); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes("Some Value", annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + $result = $parser->parse($docblock); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes', $result[0]); + $this->assertEquals("Some Value",$result[0]->getValue()); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation', $result[0]->getAnnot()); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes("Some Value")'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "annot" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes declared on property SomeClassName::invalidProperty. expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. This value should not be null.', $exc->getMessage()); + } + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes(annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "value" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes declared on property SomeClassName::invalidProperty. expects a(n) string. This value should not be null.', $exc->getMessage()); + } + + } + + public function testAnnotationWithRequiredAttributesWithoutContructor() + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $parser->setTarget(Target::TARGET_PROPERTY); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor("Some Value", annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + $result = $parser->parse($docblock); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor', $result[0]); + $this->assertEquals("Some Value", $result[0]->value); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation', $result[0]->annot); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor("Some Value")'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "annot" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor declared on property SomeClassName::invalidProperty. expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. This value should not be null.', $exc->getMessage()); + } + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor(annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "value" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor declared on property SomeClassName::invalidProperty. expects a(n) string. This value should not be null.', $exc->getMessage()); + } + + } + + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation @SomeAnnotationClassNameWithoutConstructorAndProperties declared on does not accept any values, but got {"value":"Foo"}. + */ + public function testWithoutConstructorWhenIsNotDefaultValue() + { + $parser = $this->createTestParser(); + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation @SomeAnnotationClassNameWithoutConstructorAndProperties declared on does not accept any values, but got {"value":"Foo"}. + */ + public function testWithoutConstructorWhenHasNoProperties() + { + $parser = $this->createTestParser(); + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testAnnotationTargetSyntaxError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Invalid Target "Foo". Available targets: [ALL, CLASS, METHOD, PROPERTY, ANNOTATION] + */ + public function testAnnotationWithInvalidTargetDeclarationError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage @Target expects either a string value, or an array of strings, "NULL" given. + */ + public function testAnnotationWithTargetEmptyError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @group DDC-575 + */ + public function testRegressionDDC575() + { + $parser = $this->createTestParser(); + + $docblock = <<parse($docblock); + + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Name", $result[0]); + + $docblock = <<parse($docblock); + + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Name", $result[0]); + } + + /** + * @group DDC-77 + */ + public function testAnnotationWithoutClassIsIgnoredWithoutWarning() + { + $parser = new DocParser(); + $parser->setIgnoreNotImportedAnnotations(true); + $result = $parser->parse("@param"); + + $this->assertEquals(0, count($result)); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected PlainValue, got ''' at position 10. + */ + public function testAnnotationDontAcceptSingleQuotes() + { + $parser = $this->createTestParser(); + $parser->parse("@Name(foo='bar')"); + } + + /** + * @group DCOM-41 + */ + public function testAnnotationDoesntThrowExceptionWhenAtSignIsNotFollowedByIdentifier() + { + $parser = new DocParser(); + $result = $parser->parse("'@'"); + + $this->assertEquals(0, count($result)); + } + + /** + * @group DCOM-41 + * @expectedException Doctrine\Common\Annotations\AnnotationException + */ + public function testAnnotationThrowsExceptionWhenAtSignIsNotFollowedByIdentifierInNestedAnnotation() + { + $parser = new DocParser(); + $result = $parser->parse("@Doctrine\Tests\Common\Annotations\Name(@')"); + } + + /** + * @group DCOM-56 + */ + public function testAutoloadAnnotation() + { + $this->assertFalse(class_exists('Doctrine\Tests\Common\Annotations\Fixture\Annotation\Autoload', false), 'Pre-condition: Doctrine\Tests\Common\Annotations\Fixture\Annotation\Autoload not allowed to be loaded.'); + + $parser = new DocParser(); + + AnnotationRegistry::registerAutoloadNamespace('Doctrine\Tests\Common\Annotations\Fixtures\Annotation', __DIR__ . '/../../../../'); + + $parser->setImports(array( + 'autoload' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Autoload', + )); + $annotations = $parser->parse('@Autoload'); + + $this->assertEquals(1, count($annotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Autoload', $annotations[0]); + } + + public function createTestParser() + { + $parser = new DocParser(); + $parser->setIgnoreNotImportedAnnotations(true); + $parser->setImports(array( + 'name' => 'Doctrine\Tests\Common\Annotations\Name', + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations', + )); + + return $parser; + } + + /** + * @group DDC-78 + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected PlainValue, got ''' at position 10 in class \Doctrine\Tests\Common\Annotations\Name + */ + public function testSyntaxErrorWithContextDescription() + { + $parser = $this->createTestParser(); + $parser->parse("@Name(foo='bar')", "class \Doctrine\Tests\Common\Annotations\Name"); + } + + /** + * @group DDC-183 + */ + public function testSyntaxErrorWithUnknownCharacters() + { + $docblock = <<setInput(trim($docblock, '/ *')); + //var_dump($lexer); + + try { + $parser = $this->createTestParser(); + $result = $parser->parse($docblock); + } catch (Exception $e) { + $this->fail($e->getMessage()); + } + } + + /** + * @group DCOM-14 + */ + public function testIgnorePHPDocThrowTag() + { + $docblock = <<createTestParser(); + $result = $parser->parse($docblock); + } catch (Exception $e) { + $this->fail($e->getMessage()); + } + } + + /** + * @group DCOM-38 + */ + public function testCastInt() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=1234)"); + $annot = $result[0]; + $this->assertInternalType('int', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastNegativeInt() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=-1234)"); + $annot = $result[0]; + $this->assertInternalType('int', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastFloat() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastNegativeFloat() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=-1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->foo); + + $result = $parser->parse("@Marker(-1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->value); + } + + public function testReservedKeywordsInAnnotations() + { + $parser = $this->createTestParser(); + + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\True'); + $this->assertTrue($result[0] instanceof True); + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\False'); + $this->assertTrue($result[0] instanceof False); + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\Null'); + $this->assertTrue($result[0] instanceof Null); + + $result = $parser->parse('@True'); + $this->assertTrue($result[0] instanceof True); + $result = $parser->parse('@False'); + $this->assertTrue($result[0] instanceof False); + $result = $parser->parse('@Null'); + $this->assertTrue($result[0] instanceof Null); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Creation Error] The annotation @SomeAnnotationClassNameWithoutConstructor declared on some class does not have a property named "invalidaProperty". Available properties: data, name + */ + public function testSetValuesExeption() + { + $docblock = <<createTestParser()->parse($docblock, 'some class'); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Syntax Error] Expected Doctrine\Common\Annotations\DocLexer::T_IDENTIFIER or Doctrine\Common\Annotations\DocLexer::T_TRUE or Doctrine\Common\Annotations\DocLexer::T_FALSE or Doctrine\Common\Annotations\DocLexer::T_NULL, got '3.42' at position 5. + */ + public function testInvalidIdentifierInAnnotation() + { + $parser = $this->createTestParser(); + $parser->parse('@Foo\3.42'); + } + + public function testTrailingCommaIsAllowed() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Name({ + "Foo", + "Bar", + })'); + $this->assertEquals(1, count($annots)); + $this->assertEquals(array('Foo', 'Bar'), $annots[0]->value); + } + + public function testDefaultAnnotationValueIsNotOverwritten() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Doctrine\Tests\Common\Annotations\Fixtures\Annotation\AnnotWithDefaultValue'); + $this->assertEquals(1, count($annots)); + $this->assertEquals('bar', $annots[0]->foo); + } + + public function testArrayWithColon() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Name({"foo": "bar"})'); + $this->assertEquals(1, count($annots)); + $this->assertEquals(array('foo' => 'bar'), $annots[0]->value); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Syntax Error] Expected PlainValue, got 'foo:' at position 6. + */ + public function testColonNotAllowedOnTopLevel() + { + $parser = $this->createTestParser(); + $parser->parse('@Name(foo: "bar")'); + } +} + +/** @Annotation */ +class SomeAnnotationClassNameWithoutConstructor +{ + public $data; + public $name; +} + +/** @Annotation */ +class SomeAnnotationWithConstructorWithoutParams +{ + function __construct() + { + $this->data = "Some data"; + } + public $data; + public $name; +} + +/** @Annotation */ +class SomeAnnotationClassNameWithoutConstructorAndProperties{} + +/** + * @Annotation + * @Target("Foo") + */ +class AnnotationWithInvalidTargetDeclaration{} + +/** + * @Annotation + * @Target + */ +class AnnotationWithTargetEmpty{} + +/** @Annotation */ +class AnnotationExtendsAnnotationTargetAll extends \Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll +{ +} + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation { + public $foo; +} + +/** @Annotation */ +class Marker { + public $value; +} + +/** @Annotation */ +class True {} + +/** @Annotation */ +class False {} + +/** @Annotation */ +class Null {} + +namespace Doctrine\Tests\Common\Annotations\FooBar; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation { +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php new file mode 100644 index 00000000..c84344d8 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php @@ -0,0 +1,40 @@ +cacheDir = sys_get_temp_dir() . "/annotations_". uniqid(); + @mkdir($this->cacheDir); + return new FileCacheReader(new AnnotationReader(), $this->cacheDir); + } + + public function tearDown() + { + foreach (glob($this->cacheDir.'/*.php') AS $file) { + unlink($file); + } + rmdir($this->cacheDir); + } + + /** + * @group DCOM-81 + */ + public function testAttemptToCreateAnnotationCacheDir() + { + $this->cacheDir = sys_get_temp_dir() . "/not_existed_dir_". uniqid(); + + $this->assertFalse(is_dir($this->cacheDir)); + + $cache = new FileCacheReader(new AnnotationReader(), $this->cacheDir); + + $this->assertTrue(is_dir($this->cacheDir)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php new file mode 100644 index 00000000..44108e19 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php @@ -0,0 +1,10 @@ +roles = $values['value']; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php new file mode 100644 index 00000000..b507e602 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php @@ -0,0 +1,14 @@ +name = isset($values['value']) ? $values['value'] : null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php new file mode 100644 index 00000000..09ef0317 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php @@ -0,0 +1,11 @@ +"), + @Attribute("annotation", type = "Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll"), + @Attribute("arrayOfAnnotations", type = "array"), + }) + */ +final class AnnotationWithAttributes +{ + + public final function __construct(array $data) + { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + private $mixed; + private $boolean; + private $bool; + private $float; + private $string; + private $integer; + private $array; + private $annotation; + private $arrayOfIntegers; + private $arrayOfAnnotations; + + /** + * @return mixed + */ + public function getMixed() + { + return $this->mixed; + } + + /** + * @return boolean + */ + public function getBoolean() + { + return $this->boolean; + } + + /** + * @return bool + */ + public function getBool() + { + return $this->bool; + } + + /** + * @return float + */ + public function getFloat() + { + return $this->float; + } + + /** + * @return string + */ + public function getString() + { + return $this->string; + } + + public function getInteger() + { + return $this->integer; + } + + /** + * @return array + */ + public function getArray() + { + return $this->array; + } + + /** + * @return Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll + */ + public function getAnnotation() + { + return $this->annotation; + } + + /** + * @return array + */ + public function getArrayOfIntegers() + { + return $this->arrayOfIntegers; + } + + /** + * @return array + */ + public function getArrayOfAnnotations() + { + return $this->arrayOfAnnotations; + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php new file mode 100644 index 00000000..6eb1bc5a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php @@ -0,0 +1,50 @@ + $value) { + $this->$key = $value; + } + } + + /** + * @var string + */ + private $value; + + /** + * + * @var Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation + */ + private $annot; + + /** + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * @return Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation + */ + public function getAnnot() + { + return $this->annot; + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php new file mode 100644 index 00000000..bf458ee7 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php @@ -0,0 +1,24 @@ + + */ + public $arrayOfIntegers; + + /** + * @var array + */ + public $arrayOfAnnotations; + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php new file mode 100644 index 00000000..4e652e13 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php @@ -0,0 +1,30 @@ + + */ +class Controller +{ + /** + * @Route("/", name="_demo") + * @Template() + */ + public function indexAction() + { + return array(); + } + + /** + * @Route("/hello/{name}", name="_demo_hello") + * @Template() + */ + public function helloAction($name) + { + return array('name' => $name); + } + + /** + * @Route("/contact", name="_demo_contact") + * @Template() + */ + public function contactAction() + { + $form = ContactForm::create($this->get('form.context'), 'contact'); + + $form->bind($this->container->get('request'), $form); + if ($form->isValid()) { + $form->send($this->get('mailer')); + + $this->get('session')->setFlash('notice', 'Message sent!'); + + return new RedirectResponse($this->generateUrl('_demo')); + } + + return array('form' => $form); + } + + /** + * Creates the ACL for the passed object identity + * + * @param ObjectIdentityInterface $oid + * @return void + */ + private function createObjectIdentity(ObjectIdentityInterface $oid) + { + $classId = $this->createOrRetrieveClassId($oid->getType()); + + $this->connection->executeQuery($this->getInsertObjectIdentitySql($oid->getIdentifier(), $classId, true)); + } + + /** + * Returns the primary key for the passed class type. + * + * If the type does not yet exist in the database, it will be created. + * + * @param string $classType + * @return integer + */ + private function createOrRetrieveClassId($classType) + { + if (false !== $id = $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn()) { + return $id; + } + + $this->connection->executeQuery($this->getInsertClassSql($classType)); + + return $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn(); + } + + /** + * Returns the primary key for the passed security identity. + * + * If the security identity does not yet exist in the database, it will be + * created. + * + * @param SecurityIdentityInterface $sid + * @return integer + */ + private function createOrRetrieveSecurityIdentityId(SecurityIdentityInterface $sid) + { + if (false !== $id = $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn()) { + return $id; + } + + $this->connection->executeQuery($this->getInsertSecurityIdentitySql($sid)); + + return $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn(); + } + + /** + * Deletes all ACEs for the given object identity primary key. + * + * @param integer $oidPK + * @return void + */ + private function deleteAccessControlEntries($oidPK) + { + $this->connection->executeQuery($this->getDeleteAccessControlEntriesSql($oidPK)); + } + + /** + * Deletes the object identity from the database. + * + * @param integer $pk + * @return void + */ + private function deleteObjectIdentity($pk) + { + $this->connection->executeQuery($this->getDeleteObjectIdentitySql($pk)); + } + + /** + * Deletes all entries from the relations table from the database. + * + * @param integer $pk + * @return void + */ + private function deleteObjectIdentityRelations($pk) + { + $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk)); + } + + /** + * This regenerates the ancestor table which is used for fast read access. + * + * @param AclInterface $acl + * @return void + */ + private function regenerateAncestorRelations(AclInterface $acl) + { + $pk = $acl->getId(); + $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk)); + $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $pk)); + + $parentAcl = $acl->getParentAcl(); + while (null !== $parentAcl) { + $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $parentAcl->getId())); + + $parentAcl = $parentAcl->getParentAcl(); + } + } + + /** + * This processes changes on an ACE related property (classFieldAces, or objectFieldAces). + * + * @param string $name + * @param array $changes + * @return void + */ + private function updateFieldAceProperty($name, array $changes) + { + $sids = new \SplObjectStorage(); + $classIds = new \SplObjectStorage(); + $currentIds = array(); + foreach ($changes[1] as $field => $new) { + for ($i=0,$c=count($new); $i<$c; $i++) { + $ace = $new[$i]; + + if (null === $ace->getId()) { + if ($sids->contains($ace->getSecurityIdentity())) { + $sid = $sids->offsetGet($ace->getSecurityIdentity()); + } else { + $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity()); + } + + $oid = $ace->getAcl()->getObjectIdentity(); + if ($classIds->contains($oid)) { + $classId = $classIds->offsetGet($oid); + } else { + $classId = $this->createOrRetrieveClassId($oid->getType()); + } + + $objectIdentityId = $name === 'classFieldAces' ? null : $ace->getAcl()->getId(); + + $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, $field, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure())); + $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, $field, $i))->fetchColumn(); + $this->loadedAces[$aceId] = $ace; + + $aceIdProperty = new \ReflectionProperty('Symfony\Component\Security\Acl\Domain\Entry', 'id'); + $aceIdProperty->setAccessible(true); + $aceIdProperty->setValue($ace, intval($aceId)); + } else { + $currentIds[$ace->getId()] = true; + } + } + } + + foreach ($changes[0] as $old) { + for ($i=0,$c=count($old); $i<$c; $i++) { + $ace = $old[$i]; + + if (!isset($currentIds[$ace->getId()])) { + $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId())); + unset($this->loadedAces[$ace->getId()]); + } + } + } + } + + /** + * This processes changes on an ACE related property (classAces, or objectAces). + * + * @param string $name + * @param array $changes + * @return void + */ + private function updateAceProperty($name, array $changes) + { + list($old, $new) = $changes; + + $sids = new \SplObjectStorage(); + $classIds = new \SplObjectStorage(); + $currentIds = array(); + for ($i=0,$c=count($new); $i<$c; $i++) { + $ace = $new[$i]; + + if (null === $ace->getId()) { + if ($sids->contains($ace->getSecurityIdentity())) { + $sid = $sids->offsetGet($ace->getSecurityIdentity()); + } else { + $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity()); + } + + $oid = $ace->getAcl()->getObjectIdentity(); + if ($classIds->contains($oid)) { + $classId = $classIds->offsetGet($oid); + } else { + $classId = $this->createOrRetrieveClassId($oid->getType()); + } + + $objectIdentityId = $name === 'classAces' ? null : $ace->getAcl()->getId(); + + $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, null, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure())); + $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, null, $i))->fetchColumn(); + $this->loadedAces[$aceId] = $ace; + + $aceIdProperty = new \ReflectionProperty($ace, 'id'); + $aceIdProperty->setAccessible(true); + $aceIdProperty->setValue($ace, intval($aceId)); + } else { + $currentIds[$ace->getId()] = true; + } + } + + for ($i=0,$c=count($old); $i<$c; $i++) { + $ace = $old[$i]; + + if (!isset($currentIds[$ace->getId()])) { + $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId())); + unset($this->loadedAces[$ace->getId()]); + } + } + } + + /** + * Persists the changes which were made to ACEs to the database. + * + * @param \SplObjectStorage $aces + * @return void + */ + private function updateAces(\SplObjectStorage $aces) + { + foreach ($aces as $ace) { + $propertyChanges = $aces->offsetGet($ace); + $sets = array(); + + if (isset($propertyChanges['mask'])) { + $sets[] = sprintf('mask = %d', $propertyChanges['mask'][1]); + } + if (isset($propertyChanges['strategy'])) { + $sets[] = sprintf('granting_strategy = %s', $this->connection->quote($propertyChanges['strategy'])); + } + if (isset($propertyChanges['aceOrder'])) { + $sets[] = sprintf('ace_order = %d', $propertyChanges['aceOrder'][1]); + } + if (isset($propertyChanges['auditSuccess'])) { + $sets[] = sprintf('audit_success = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditSuccess'][1])); + } + if (isset($propertyChanges['auditFailure'])) { + $sets[] = sprintf('audit_failure = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditFailure'][1])); + } + + $this->connection->executeQuery($this->getUpdateAccessControlEntrySql($ace->getId(), $sets)); + } + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php new file mode 100644 index 00000000..bda2cc21 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php @@ -0,0 +1,15 @@ +test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test2() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test3() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test4() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test5() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test6() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test7() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test8() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test9() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test10() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test11() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test12() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test13() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test14() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test15() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test16() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test17() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test18() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test19() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test20() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test21() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test22() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test23() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test24() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test25() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test26() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test27() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test28() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test29() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test30() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test31() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test32() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test33() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test34() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test35() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test36() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test37() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test38() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test39() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php new file mode 100644 index 00000000..1dae104a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php @@ -0,0 +1,5 @@ +test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test2() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test3() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test4() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test5() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test6() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test7() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test8() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test9() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test10() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test11() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test12() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test13() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test14() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test15() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test16() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test17() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test18() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test19() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test20() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test21() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test22() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test23() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test24() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test25() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test26() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test27() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test28() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test29() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test30() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test31() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test32() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test33() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test34() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test35() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test36() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test37() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test38() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test39() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php new file mode 100644 index 00000000..58c5e6af --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php @@ -0,0 +1,13 @@ +getMethod(); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $reader->getMethodAnnotations($method); + } + $time = microtime(true) - $time; + + $this->printResults('cached reader (in-memory)', $time, $c); + } + + /** + * @group performance + */ + public function testCachedReadPerformanceWithFileCache() + { + $method = $this->getMethod(); + + // prime cache + $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir()); + $reader->getMethodAnnotations($method); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir()); + $reader->getMethodAnnotations($method); + clearstatcache(); + } + $time = microtime(true) - $time; + + $this->printResults('cached reader (file)', $time, $c); + } + + /** + * @group performance + */ + public function testReadPerformance() + { + $method = $this->getMethod(); + + $time = microtime(true); + for ($i=0,$c=150; $i<$c; $i++) { + $reader = new AnnotationReader(); + $reader->getMethodAnnotations($method); + } + $time = microtime(true) - $time; + + $this->printResults('reader', $time, $c); + } + + /** + * @group performance + */ + public function testDocParsePerformance() + { + $imports = array( + 'ignorephpdoc' => 'Annotations\Annotation\IgnorePhpDoc', + 'ignoreannotation' => 'Annotations\Annotation\IgnoreAnnotation', + 'route' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Route', + 'template' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Template', + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations\Fixtures', + ); + $ignored = array( + 'access', 'author', 'copyright', 'deprecated', 'example', 'ignore', + 'internal', 'link', 'see', 'since', 'tutorial', 'version', 'package', + 'subpackage', 'name', 'global', 'param', 'return', 'staticvar', + 'static', 'var', 'throws', 'inheritdoc', + ); + + $method = $this->getMethod(); + $methodComment = $method->getDocComment(); + $classComment = $method->getDeclaringClass()->getDocComment(); + + $time = microtime(true); + for ($i=0,$c=200; $i<$c; $i++) { + $parser = new DocParser(); + $parser->setImports($imports); + $parser->setIgnoredAnnotationNames($ignored); + $parser->setIgnoreNotImportedAnnotations(true); + + $parser->parse($methodComment); + $parser->parse($classComment); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser', $time, $c); + } + + /** + * @group performance + */ + public function testDocLexerPerformance() + { + $method = $this->getMethod(); + $methodComment = $method->getDocComment(); + $classComment = $method->getDeclaringClass()->getDocComment(); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $lexer = new DocLexer(); + $lexer->setInput($methodComment); + $lexer->setInput($classComment); + } + $time = microtime(true) - $time; + + $this->printResults('doc-lexer', $time, $c); + } + + /** + * @group performance + */ + public function testPhpParserPerformanceWithShortCut() + { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\NamespacedSingleClassLOC1000'); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $parser = new PhpParser(); + $parser->parseClass($class); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser-with-short-cut', $time, $c); + } + + /** + * @group performance + */ + public function testPhpParserPerformanceWithoutShortCut() + { + $class = new \ReflectionClass('SingleClassLOC1000'); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $parser = new PhpParser(); + $parser->parseClass($class); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser-without-short-cut', $time, $c); + } + + private function getMethod() + { + return new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\Controller', 'helloAction'); + } + + private function printResults($test, $time, $iterations) + { + if (0 == $iterations) { + throw new \InvalidArgumentException('$iterations cannot be zero.'); + } + + $title = $test." results:\n"; + $iterationsText = sprintf("Iterations: %d\n", $iterations); + $totalTime = sprintf("Total Time: %.3f s\n", $time); + $iterationTime = sprintf("Time per iteration: %.3f ms\n", $time/$iterations * 1000); + + $max = max(strlen($title), strlen($iterationTime)) - 1; + + echo "\n".str_repeat('-', $max)."\n"; + echo $title; + echo str_repeat('=', $max)."\n"; + echo $iterationsText; + echo $totalTime; + echo $iterationTime; + echo str_repeat('-', $max)."\n"; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php new file mode 100644 index 00000000..8de4aabf --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php @@ -0,0 +1,179 @@ +assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testParseClassWithMultipleImportsInUseStatement() + { + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\MultipleImportsInUseStatement'); + $parser = new PhpParser(); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testParseClassWhenNotUserDefined() + { + $parser = new PhpParser(); + $this->assertEquals(array(), $parser->parseClass(new \ReflectionClass('\stdClass'))); + } + + public function testParseClassWhenClassIsNotNamespaced() + { + $parser = new PhpParser(); + $class = new ReflectionClass('\AnnotationsTestsFixturesNonNamespacedClass'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testParseClassWhenClassIsInterface() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\TestInterface'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testClassWithFullyQualifiedUseStatements() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\ClassWithFullyQualifiedUseStatements'); + + $this->assertEquals(array( + 'secure' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testNamespaceAndClassCommentedOut() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceAndClassCommentedOut'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testEqualNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\EqualNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + ), $parser->parseClass($class)); + } + + public function testEqualNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\EqualNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testDifferentNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\DifferentNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testDifferentNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\DifferentNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testGlobalNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new \ReflectionClass('\GlobalNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + ), $parser->parseClass($class)); + } + + public function testGlobalNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass('\GlobalNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testNamespaceWithClosureDeclaration() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceWithClosureDeclaration'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testIfPointerResetsOnMultipleParsingTries() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceWithClosureDeclaration'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php new file mode 100644 index 00000000..376539ff --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php @@ -0,0 +1,97 @@ +getReader(); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassDDC1660'); + + $this->assertTrue(class_exists('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Version')); + $this->assertCount(1, $reader->getClassAnnotations($class)); + $this->assertCount(1, $reader->getMethodAnnotations($class->getMethod('bar'))); + $this->assertCount(1, $reader->getPropertyAnnotations($class->getProperty('foo'))); + } + + protected function getReader() + { + $reader = new SimpleAnnotationReader(); + $reader->addNamespace(__NAMESPACE__); + $reader->addNamespace(__NAMESPACE__ . '\Fixtures'); + $reader->addNamespace(__NAMESPACE__ . '\Fixtures\Annotation'); + + return $reader; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php new file mode 100644 index 00000000..a7b9e2f2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php @@ -0,0 +1,65 @@ +getClassAnnotations($class); + } + + public function testAnnotation() + { + $class = new \ReflectionClass(__NAMESPACE__ . '\\DCOM55Consumer'); + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $annots = $reader->getClassAnnotations($class); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf(__NAMESPACE__.'\\DCOM55Annotation', $annots[0]); + } + + public function testParseAnnotationDocblocks() + { + $class = new \ReflectionClass(__NAMESPACE__ . '\\DCOM55Annotation'); + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $annots = $reader->getClassAnnotations($class); + + $this->assertEquals(0, count($annots)); + } +} + +/** + * @Controller + */ +class Dummy +{ + +} + +/** + * @Annotation + */ +class DCOM55Annotation +{ + +} + +/** + * @DCOM55Annotation + */ +class DCOM55Consumer +{ + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php new file mode 100644 index 00000000..708bcc99 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php @@ -0,0 +1,8 @@ +getClassAnnotations(new \ReflectionClass(__NAMESPACE__."\MappedClass")); + + foreach ($result as $annot) { + $classAnnotations[get_class($annot)] = $annot; + } + + $this->assertTrue(!isset($classAnnotations['']), 'Class "xxx" is not a valid entity or mapped super class.'); + } + + public function testIssueGlobalNamespace() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->setImports(array( + "__NAMESPACE__" =>"Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping" + )); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + + public function testIssueNamespaces() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM"); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Entity", $annots[0]); + } + + public function testIssueMultipleNamespaces() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping"); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM"); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + + public function testIssueWithNamespacesOrImports() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Entity", $annots[0]); + $this->assertEquals(1, count($annots)); + } + + + public function testIssueSimpleAnnotationReader() + { + $reader = new \Doctrine\Common\Annotations\SimpleAnnotationReader(); + $reader->addNamespace('Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping'); + $annots = $reader->getClassAnnotations(new \ReflectionClass(__NAMESPACE__."\MappedClass")); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + +} + +/** + * @Entity + */ +class MappedClass +{ + +} + + +namespace Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping; +/** +* @Annotation +*/ +class Entity +{ + +} + +namespace Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM; +/** +* @Annotation +*/ +class Entity +{ + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php new file mode 100644 index 00000000..ff3ca376 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php @@ -0,0 +1,8 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of APC'); + } + } + + protected function _getCacheDriver() + { + return new ApcCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php new file mode 100644 index 00000000..71927174 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php @@ -0,0 +1,13 @@ +_getCacheDriver(); + + // Test save + $cache->save('test_key', 'testing this out'); + + // Test contains to test that save() worked + $this->assertTrue($cache->contains('test_key')); + + // Test fetch + $this->assertEquals('testing this out', $cache->fetch('test_key')); + + // Test delete + $cache->save('test_key2', 'test2'); + $cache->delete('test_key2'); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testDeleteAll() + { + $cache = $this->_getCacheDriver(); + $cache->save('test_key1', '1'); + $cache->save('test_key2', '2'); + $cache->deleteAll(); + + $this->assertFalse($cache->contains('test_key1')); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testFlushAll() + { + $cache = $this->_getCacheDriver(); + $cache->save('test_key1', '1'); + $cache->save('test_key2', '2'); + $cache->flushAll(); + + $this->assertFalse($cache->contains('test_key1')); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testNamespace() + { + $cache = $this->_getCacheDriver(); + $cache->setNamespace('test_'); + $cache->save('key1', 'test'); + + $this->assertTrue($cache->contains('key1')); + + $cache->setNamespace('test2_'); + + $this->assertFalse($cache->contains('key1')); + } + + /** + * @group DCOM-43 + */ + public function testGetStats() + { + if ($this instanceof ArrayCacheTest || $this instanceof ZendDataCacheTest ) { + $this->markTestSkipped("Statistics are not available for this driver"); + } + + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + + $this->assertArrayHasKey(Cache::STATS_HITS, $stats); + $this->assertArrayHasKey(Cache::STATS_MISSES, $stats); + $this->assertArrayHasKey(Cache::STATS_UPTIME, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_USAGE, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_AVAILIABLE, $stats); + } + + /** + * @return \Doctrine\Common\Cache\CacheProvider + */ + abstract protected function _getCacheDriver(); +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php new file mode 100644 index 00000000..362ff69a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php @@ -0,0 +1,38 @@ +_memcache = new \Memcache; + $ok = @$this->_memcache->connect('localhost', 11211); + if (!$ok) { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } else { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } + + public function testNoExpire() { + $cache = $this->_getCacheDriver(); + $cache->save('noexpire', 'value', 0); + sleep(1); + $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire'); + } + + protected function _getCacheDriver() + { + $driver = new MemcacheCache(); + $driver->setMemcache($this->_memcache); + return $driver; + } + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php new file mode 100644 index 00000000..947ba752 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php @@ -0,0 +1,40 @@ +memcached = new \Memcached(); + $this->memcached->setOption(\Memcached::OPT_COMPRESSION, false); + $this->memcached->addServer('127.0.0.1', 11211); + + $fh = @fsockopen('127.0.0.1', 11211); + if (!$fh) { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } else { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } + + public function testNoExpire() { + $cache = $this->_getCacheDriver(); + $cache->save('noexpire', 'value', 0); + sleep(1); + $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire'); + } + + protected function _getCacheDriver() + { + $driver = new MemcachedCache(); + $driver->setMemcached($this->memcached); + return $driver; + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php new file mode 100644 index 00000000..cb363df9 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of Wincache'); + } + } + + protected function _getCacheDriver() + { + return new WincacheCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php new file mode 100644 index 00000000..62598487 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of xcache'); + } + } + + protected function _getCacheDriver() + { + return new XcacheCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php new file mode 100644 index 00000000..27dcf359 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of Zend Data Cache which only works in apache2handler SAPI'); + } + } + + protected function _getCacheDriver() + { + return new ZendDataCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php new file mode 100644 index 00000000..567cf918 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php @@ -0,0 +1,45 @@ +setIncludePath(__DIR__); + $classLoader->setFileExtension('.class.php'); + $classLoader->setNamespaceSeparator('_'); + + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassA')); + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassB')); + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassC')); + $this->assertFalse($classLoader->canLoadClass('OtherClass')); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassA'), true); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassB'), true); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassC'), true); + } + + public function testClassExists() + { + $this->assertFalse(ClassLoader::classExists('ClassLoaderTest\ClassD')); + $badLoader = function($className) { + require __DIR__ . '/ClassLoaderTest/ClassD.php'; + return true; + }; + spl_autoload_register($badLoader); + $this->assertTrue(ClassLoader::classExists('ClassLoaderTest\ClassD')); + spl_autoload_unregister($badLoader); + } + + public function testGetClassLoader() + { + $cl = new ClassLoader('ClassLoaderTest', __DIR__); + $cl->register(); + $this->assertTrue(ClassLoader::getClassLoader('ClassLoaderTest\ClassD') instanceof \Doctrine\Common\ClassLoader); + $this->assertNull(ClassLoader::getClassLoader('This\Class\Does\Not\Exist')); + $cl->unregister(); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php new file mode 100644 index 00000000..85546547 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php @@ -0,0 +1,6 @@ +_coll = new \Doctrine\Common\Collections\ArrayCollection; + } + + public function testIssetAndUnset() + { + $this->assertFalse(isset($this->_coll[0])); + $this->_coll->add('testing'); + $this->assertTrue(isset($this->_coll[0])); + unset($this->_coll[0]); + $this->assertFalse(isset($this->_coll[0])); + } + + public function testToString() + { + $this->_coll->add('testing'); + $this->assertTrue(is_string((string) $this->_coll)); + } + + public function testRemovingNonExistentEntryReturnsNull() + { + $this->assertEquals(null, $this->_coll->remove('testing_does_not_exist')); + } + + public function testExists() + { + $this->_coll->add("one"); + $this->_coll->add("two"); + $exists = $this->_coll->exists(function($k, $e) { return $e == "one"; }); + $this->assertTrue($exists); + $exists = $this->_coll->exists(function($k, $e) { return $e == "other"; }); + $this->assertFalse($exists); + } + + public function testMap() + { + $this->_coll->add(1); + $this->_coll->add(2); + $res = $this->_coll->map(function($e) { return $e * 2; }); + $this->assertEquals(array(2, 4), $res->toArray()); + } + + public function testFilter() + { + $this->_coll->add(1); + $this->_coll->add("foo"); + $this->_coll->add(3); + $res = $this->_coll->filter(function($e) { return is_numeric($e); }); + $this->assertEquals(array(0 => 1, 2 => 3), $res->toArray()); + } + + public function testFirstAndLast() + { + $this->_coll->add('one'); + $this->_coll->add('two'); + + $this->assertEquals($this->_coll->first(), 'one'); + $this->assertEquals($this->_coll->last(), 'two'); + } + + public function testArrayAccess() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + + $this->assertEquals($this->_coll[0], 'one'); + $this->assertEquals($this->_coll[1], 'two'); + + unset($this->_coll[0]); + $this->assertEquals($this->_coll->count(), 1); + } + + public function testContainsKey() + { + $this->_coll[5] = 'five'; + $this->assertTrue($this->_coll->containsKey(5)); + } + + public function testContains() + { + $this->_coll[0] = 'test'; + $this->assertTrue($this->_coll->contains('test')); + } + + public function testSearch() + { + $this->_coll[0] = 'test'; + $this->assertEquals(0, $this->_coll->indexOf('test')); + } + + public function testGet() + { + $this->_coll[0] = 'test'; + $this->assertEquals('test', $this->_coll->get(0)); + } + + public function testGetKeys() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals(array(0, 1), $this->_coll->getKeys()); + } + + public function testGetValues() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals(array('one', 'two'), $this->_coll->getValues()); + } + + public function testCount() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals($this->_coll->count(), 2); + $this->assertEquals(count($this->_coll), 2); + } + + public function testForAll() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_string($e); }), true); + $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_array($e); }), false); + } + + public function testPartition() + { + $this->_coll[] = true; + $this->_coll[] = false; + $partition = $this->_coll->partition(function($k, $e) { return $e == true; }); + $this->assertEquals($partition[0][0], true); + $this->assertEquals($partition[1][0], false); + } + + public function testClear() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->_coll->clear(); + $this->assertEquals($this->_coll->isEmpty(), true); + } + + public function testRemove() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $el = $this->_coll->remove(0); + + $this->assertEquals('one', $el); + $this->assertEquals($this->_coll->contains('one'), false); + $this->assertNull($this->_coll->remove(0)); + } + + public function testRemoveElement() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + + $this->assertTrue($this->_coll->removeElement('two')); + $this->assertFalse($this->_coll->contains('two')); + $this->assertFalse($this->_coll->removeElement('two')); + } + + public function testSlice() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->_coll[] = 'three'; + + $slice = $this->_coll->slice(0, 1); + $this->assertInternalType('array', $slice); + $this->assertEquals(array('one'), $slice); + + $slice = $this->_coll->slice(1); + $this->assertEquals(array(1 => 'two', 2 => 'three'), $slice); + + $slice = $this->_coll->slice(1, 1); + $this->assertEquals(array(1 => 'two'), $slice); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php new file mode 100644 index 00000000..e69de29b diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php new file mode 100644 index 00000000..2b11b20e --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php @@ -0,0 +1,88 @@ +_eventManager = new EventManager; + $this->_preFooInvoked = false; + $this->_postFooInvoked = false; + } + + public function testInitialState() + { + $this->assertEquals(array(), $this->_eventManager->getListeners()); + $this->assertFalse($this->_eventManager->hasListeners(self::preFoo)); + $this->assertFalse($this->_eventManager->hasListeners(self::postFoo)); + } + + public function testAddEventListener() + { + $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); + $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); + $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); + $this->assertEquals(1, count($this->_eventManager->getListeners(self::preFoo))); + $this->assertEquals(1, count($this->_eventManager->getListeners(self::postFoo))); + $this->assertEquals(2, count($this->_eventManager->getListeners())); + } + + public function testDispatchEvent() + { + $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); + $this->_eventManager->dispatchEvent(self::preFoo); + $this->assertTrue($this->_preFooInvoked); + $this->assertFalse($this->_postFooInvoked); + } + + public function testRemoveEventListener() + { + $this->_eventManager->addEventListener(array('preBar'), $this); + $this->assertTrue($this->_eventManager->hasListeners(self::preBar)); + $this->_eventManager->removeEventListener(array('preBar'), $this); + $this->assertFalse($this->_eventManager->hasListeners(self::preBar)); + } + + public function testAddEventSubscriber() + { + $eventSubscriber = new TestEventSubscriber(); + $this->_eventManager->addEventSubscriber($eventSubscriber); + $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); + $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); + } + + /* Listener methods */ + + public function preFoo(EventArgs $e) + { + $this->_preFooInvoked = true; + } + + public function postFoo(EventArgs $e) + { + $this->_postFooInvoked = true; + } +} + +class TestEventSubscriber implements \Doctrine\Common\EventSubscriber +{ + public function getSubscribedEvents() + { + return array('preFoo', 'postFoo'); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php new file mode 100644 index 00000000..e1825ae2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php @@ -0,0 +1,94 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver1->expects($this->never()) + ->method('loadMetadataForClass'); + $driver1->expectS($this->never()) + ->method('isTransient'); + + $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver2->expects($this->at(0)) + ->method('loadMetadataForClass') + ->with($this->equalTo($className), $this->equalTo($classMetadata)); + $driver2->expects($this->at(1)) + ->method('isTransient') + ->with($this->equalTo($className)) + ->will($this->returnValue( true )); + + $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); + $chain->addDriver($driver2, 'Doctrine\Tests\Common\Persistence\Mapping'); + + $chain->loadMetadataForClass($className, $classMetadata); + + $this->assertTrue( $chain->isTransient($className) ); + } + + public function testLoadMetadata_NoDelegatorFound_ThrowsMappingException() + { + $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; + $classMetadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $this->setExpectedException('Doctrine\Common\Persistence\Mapping\MappingException'); + $chain->loadMetadataForClass($className, $classMetadata); + } + + public function testGatherAllClassNames() + { + $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; + $classMetadata = $this->getMock('Doctrine\Common\Peristence\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver1->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Doctrine\Tests\Models\Company\Foo'))); + + $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver2->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Doctrine\Tests\ORM\Mapping\Bar', 'Doctrine\Tests\ORM\Mapping\Baz', 'FooBarBaz'))); + + $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); + $chain->addDriver($driver2, 'Doctrine\Tests\ORM\Mapping'); + + $this->assertEquals(array( + 'Doctrine\Tests\Models\Company\Foo', + 'Doctrine\Tests\ORM\Mapping\Bar', + 'Doctrine\Tests\ORM\Mapping\Baz' + ), $chain->getAllClassNames()); + } + + /** + * @group DDC-706 + */ + public function testIsTransient() + { + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $chain = new MappingDriverChain(); + $chain->addDriver($driver1, 'Doctrine\Tests\Models\CMS'); + + $this->assertTrue($chain->isTransient('stdClass'), "stdClass isTransient"); + } +} + +class DriverChainEntity +{ + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php new file mode 100644 index 00000000..9fe32994 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php @@ -0,0 +1,134 @@ +getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $this->cmf = new TestClassMetadataFactory($driver, $metadata); + } + + public function testGetCacheDriver() + { + $this->assertNull($this->cmf->getCacheDriver()); + $cache = new ArrayCache(); + $this->cmf->setCacheDriver($cache); + $this->assertSame($cache, $this->cmf->getCacheDriver()); + } + + public function testGetMetadataFor() + { + $metadata = $this->cmf->getMetadataFor('stdClass'); + + $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); + $this->assertTrue($this->cmf->hasMetadataFor('stdClass')); + } + + public function testGetParentMetadata() + { + $metadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + + $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\RootEntity')); + } + + public function testGetCachedMetadata() + { + $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $cache = new ArrayCache(); + $cache->save(__NAMESPACE__. '\ChildEntity$CLASSMETADATA', $metadata); + + $this->cmf->setCacheDriver($cache); + + $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + $this->assertSame($loadedMetadata, $metadata); + } + + public function testCacheGetMetadataFor() + { + $cache = new ArrayCache(); + $this->cmf->setCacheDriver($cache); + + $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + + $this->assertSame($loadedMetadata, $cache->fetch(__NAMESPACE__. '\ChildEntity$CLASSMETADATA')); + } + + public function testGetAliasedMetadata() + { + $loadedMetadata = $this->cmf->getMetadataFor('prefix:ChildEntity'); + + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); + $this->assertTrue($this->cmf->hasMetadataFor('prefix:ChildEntity')); + } +} + +class TestClassMetadataFactory extends AbstractClassMetadataFactory +{ + public $driver; + public $metadata; + + public function __construct($driver, $metadata) + { + $this->driver = $driver; + $this->metadata = $metadata; + } + + protected function doLoadMetadata($class, $parent, $rootEntityFound) + { + + } + + protected function getFqcnFromAlias($namespaceAlias, $simpleClassName) + { + return __NAMESPACE__ . '\\' . $simpleClassName; + } + + protected function initialize() + { + + } + + protected function newClassMetadataInstance($className) + { + return $this->metadata; + } + + protected function getDriver() + { + return $this->driver; + } + protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService) + { + } + + protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService) + { + } +} + +class RootEntity +{ + +} + +class ChildEntity extends RootEntity +{ + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php new file mode 100644 index 00000000..3c600c40 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php @@ -0,0 +1,90 @@ +assertEquals(array($path), $locator->getPaths()); + + $locator = new DefaultFileLocator($path); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testGetFileExtension() + { + $locator = new DefaultFileLocator(array(), ".yml"); + $this->assertEquals(".yml", $locator->getFileExtension()); + $locator->setFileExtension(".xml"); + $this->assertEquals(".xml", $locator->getFileExtension()); + } + + public function testUniquePaths() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path, $path)); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testFindMappingFile() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->assertEquals(__DIR__ . '/_files/stdClass.yml', $locator->findMappingFile('stdClass')); + } + + public function testFindMappingFileNotFound() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->setExpectedException( + 'Doctrine\Common\Persistence\Mapping\MappingException', + "No mapping file found named 'stdClass2.yml' for class 'stdClass2'" + ); + $locator->findMappingFile('stdClass2'); + } + + public function testGetAllClassNames() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + $classes = $locator->getAllClassNames(null); + sort($classes); + + $this->assertEquals(array('global', 'stdClass'), $classes); + $this->assertEquals(array('stdClass'), $locator->getAllClassNames("global")); + } + + public function testGetAllClassNamesNonMatchingFileExtension() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".xml"); + $this->assertEquals(array(), $locator->getAllClassNames("global")); + } + + public function testFileExists() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->assertTrue($locator->fileExists("stdClass")); + $this->assertFalse($locator->fileExists("stdClass2")); + $this->assertTrue($locator->fileExists("global")); + $this->assertFalse($locator->fileExists("global2")); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php new file mode 100644 index 00000000..020c2424 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php @@ -0,0 +1,142 @@ +assertNull($driver->getGlobalBasename()); + + $driver->setGlobalBasename("global"); + $this->assertEquals("global", $driver->getGlobalBasename()); + } + + public function testGetElementFromGlobalFile() + { + $driver = new TestFileDriver($this->newLocator()); + $driver->setGlobalBasename("global"); + + $element = $driver->getElement('stdGlobal'); + + $this->assertEquals('stdGlobal', $element); + } + + public function testGetElementFromFile() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('findMappingFile') + ->with($this->equalTo('stdClass')) + ->will($this->returnValue(__DIR__ . '/_files/stdClass.yml')); + + $driver = new TestFileDriver($locator); + + $this->assertEquals('stdClass', $driver->getElement('stdClass')); + } + + public function testGetAllClassNamesGlobalBasename() + { + $driver = new TestFileDriver($this->newLocator()); + $driver->setGlobalBasename("global"); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdGlobal', 'stdGlobal2'), $classNames); + } + + public function testGetAllClassNamesFromMappingFile() + { + $locator = $this->newLocator(); + $locator->expects($this->any()) + ->method('getAllClassNames') + ->with($this->equalTo(null)) + ->will($this->returnValue(array('stdClass'))); + $driver = new TestFileDriver($locator); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdClass'), $classNames); + } + + public function testGetAllClassNamesBothSources() + { + $locator = $this->newLocator(); + $locator->expects($this->any()) + ->method('getAllClassNames') + ->with($this->equalTo('global')) + ->will($this->returnValue(array('stdClass'))); + $driver = new TestFileDriver($locator); + $driver->setGlobalBasename("global"); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdGlobal', 'stdGlobal2', 'stdClass'), $classNames); + } + + public function testIsNotTransient() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('fileExists') + ->with($this->equalTo('stdClass')) + ->will($this->returnValue( true )); + + $driver = new TestFileDriver($locator); + $driver->setGlobalBasename("global"); + + $this->assertFalse($driver->isTransient('stdClass')); + $this->assertFalse($driver->isTransient('stdGlobal')); + $this->assertFalse($driver->isTransient('stdGlobal2')); + } + + public function testIsTransient() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('fileExists') + ->with($this->equalTo('stdClass2')) + ->will($this->returnValue( false )); + + $driver = new TestFileDriver($locator); + + $this->assertTrue($driver->isTransient('stdClass2')); + } + + public function testNonLocatorFallback() + { + $driver = new TestFileDriver(__DIR__ . '/_files', '.yml'); + $this->assertTrue($driver->isTransient('stdClass2')); + $this->assertFalse($driver->isTransient('stdClass')); + } + + private function newLocator() + { + $locator = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\FileLocator'); + $locator->expects($this->any())->method('getFileExtension')->will($this->returnValue('.yml')); + $locator->expects($this->any())->method('getPaths')->will($this->returnValue(array(__DIR__ . "/_files"))); + return $locator; + } +} + +class TestFileDriver extends FileDriver +{ + protected function loadMappingFile($file) + { + if (strpos($file, "global.yml") !== false) { + return array('stdGlobal' => 'stdGlobal', 'stdGlobal2' => 'stdGlobal2'); + } + return array('stdClass' => 'stdClass'); + } + + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php new file mode 100644 index 00000000..8fc4d807 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php @@ -0,0 +1,18 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $metadata->expects($this->once())->method('getFieldNames'); + + $driver = new PHPDriver(array(__DIR__ . "/_files")); + $driver->loadMetadataForClass('TestEntity', $metadata); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php new file mode 100644 index 00000000..5f06cad9 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Tests\Common\Persistence\Mapping; + +use Doctrine\Common\Persistence\Mapping\RuntimeReflectionService; + +/** + * @group DCOM-93 + */ +class RuntimeReflectionServiceTest extends \PHPUnit_Framework_TestCase +{ + private $reflectionService; + + public function setUp() + { + $this->reflectionService = new RuntimeReflectionService(); + } + + public function testShortname() + { + $this->assertEquals("RuntimeReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); + } + + public function testClassNamespaceName() + { + $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); + } + + public function testGetParentClasses() + { + $classes = $this->reflectionService->getParentClasses(__CLASS__); + $this->assertTrue(count($classes) >= 1, "The test class ".__CLASS__." should have at least one parent."); + } + + public function testGetReflectionClass() + { + $class = $this->reflectionService->getClass(__CLASS__); + $this->assertInstanceOf("ReflectionClass", $class); + } + + public function testGetMethods() + { + $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); + $this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); + } + + public function testGetAccessibleProperty() + { + $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); + $this->assertInstanceOf("ReflectionProperty", $reflProp); + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php new file mode 100644 index 00000000..9f1c5684 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php @@ -0,0 +1,35 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $metadata->expects($this->once())->method('getFieldNames'); + + $driver = new StaticPHPDriver(array(__DIR__)); + $driver->loadMetadataForClass(__NAMESPACE__ . '\\TestEntity', $metadata); + } + + public function testGetAllClassNames() + { + $driver = new StaticPHPDriver(array(__DIR__)); + $classNames = $driver->getAllClassNames(); + + $this->assertContains( + 'Doctrine\Tests\Common\Persistence\Mapping\TestEntity', $classNames); + } +} + +class TestEntity +{ + static public function loadMetadata($metadata) + { + $metadata->getFieldNames(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php new file mode 100644 index 00000000..ffce6d40 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Tests\Common\Persistence\Mapping; + +use Doctrine\Common\Persistence\Mapping\StaticReflectionService; + +/** + * @group DCOM-93 + */ +class StaticReflectionServiceTest extends \PHPUnit_Framework_TestCase +{ + private $reflectionService; + + public function setUp() + { + $this->reflectionService = new StaticReflectionService(); + } + + public function testShortname() + { + $this->assertEquals("StaticReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); + } + + public function testClassNamespaceName() + { + $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); + } + + public function testGetParentClasses() + { + $classes = $this->reflectionService->getParentClasses(__CLASS__); + $this->assertTrue(count($classes) == 0, "The test class ".__CLASS__." should have no parents according to static reflection."); + } + + public function testGetReflectionClass() + { + $class = $this->reflectionService->getClass(__CLASS__); + $this->assertNull($class); + } + + public function testGetMethods() + { + $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); + $this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); + } + + public function testGetAccessibleProperty() + { + $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); + $this->assertNull($reflProp); + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php new file mode 100644 index 00000000..b51162e6 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php @@ -0,0 +1,88 @@ + $prefix)); + $this->assertEquals(array($path), $locator->getPaths()); + + $locator = new SymfonyFileLocator(array($path => $prefix)); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testGetPrefixes() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix)); + $this->assertEquals(array($path => $prefix), $locator->getNamespacePrefixes()); + } + + public function testGetFileExtension() + { + $locator = new SymfonyFileLocator(array(), ".yml"); + $this->assertEquals(".yml", $locator->getFileExtension()); + $locator->setFileExtension(".xml"); + $this->assertEquals(".xml", $locator->getFileExtension()); + } + + public function testFileExists() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->assertTrue($locator->fileExists("Foo\stdClass")); + $this->assertTrue($locator->fileExists("Foo\global")); + $this->assertFalse($locator->fileExists("Foo\stdClass2")); + $this->assertFalse($locator->fileExists("Foo\global2")); + } + + public function testGetAllClassNames() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + $classes = $locator->getAllClassNames(null); + sort($classes); + + $this->assertEquals(array("Foo\\global", "Foo\\stdClass"), $classes); + $this->assertEquals(array("Foo\\stdClass"), $locator->getAllClassNames("global")); + } + + public function testFindMappingFile() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->assertEquals(__DIR__ . "/_files/stdClass.yml", $locator->findMappingFile("Foo\\stdClass")); + } + + public function testFindMappingFileNotFound() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->setExpectedException( + "Doctrine\Common\Persistence\Mapping\MappingException", + "No mapping file found named '".__DIR__."/_files/stdClass2.yml' for class 'Foo\stdClass2'." + ); + $locator->findMappingFile("Foo\\stdClass2"); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php new file mode 100644 index 00000000..d0e9976a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php @@ -0,0 +1,3 @@ +getFieldNames(); \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php new file mode 100644 index 00000000..a0f77b50 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php @@ -0,0 +1,247 @@ +cm = new TestObjectMetadata; + $this->om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); + $this->om->expects($this->any())->method('getClassMetadata') + ->will($this->returnValue($this->cm)); + $this->object = new TestObject; + PersistentObject::setObjectManager($this->om); + $this->object->injectObjectManager($this->om, $this->cm); + } + + public function testGetObjectManager() + { + $this->assertSame($this->om, PersistentObject::getObjectManager()); + } + + public function testNonMatchingObjectManager() + { + $this->setExpectedException('RuntimeException'); + $om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); + $this->object->injectObjectManager($om, $this->cm); + } + + public function testGetField() + { + $this->assertEquals('beberlei', $this->object->getName()); + } + + public function testSetField() + { + $this->object->setName("test"); + $this->assertEquals("test", $this->object->getName()); + } + + public function testGetIdentifier() + { + $this->assertEquals(1, $this->object->getId()); + } + + public function testSetIdentifier() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->setId(2); + } + + public function testSetUnknownField() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->setUnknown("test"); + } + + public function testGetUnknownField() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->getUnknown(); + } + + public function testGetToOneAssociation() + { + $this->assertNull($this->object->getParent()); + } + + public function testSetToOneAssociation() + { + $parent = new TestObject(); + $this->object->setParent($parent); + $this->assertSame($parent, $this->object->getParent($parent)); + } + + public function testSetInvalidToOneAssocation() + { + $parent = new \stdClass(); + + $this->setExpectedException('InvalidArgumentException'); + $this->object->setParent($parent); + } + + public function testSetToOneAssociationNull() + { + $parent = new TestObject(); + $this->object->setParent($parent); + $this->object->setParent(null); + $this->assertNull($this->object->getParent()); + } + + public function testAddToManyAssocation() + { + $child = new TestObject(); + $this->object->addChildren($child); + + $this->assertSame($this->object, $child->getParent()); + $this->assertEquals(1, count($this->object->getChildren())); + + $child = new TestObject(); + $this->object->addChildren($child); + + $this->assertEquals(2, count($this->object->getChildren())); + } + + public function testAddInvalidToManyAssocation() + { + $this->setExpectedException('InvalidArgumentException'); + $this->object->addChildren(new \stdClass()); + } + + public function testNoObjectManagerSet() + { + PersistentObject::setObjectManager(null); + $child = new TestObject(); + + $this->setExpectedException('RuntimeException'); + $child->setName("test"); + } + + public function testInvalidMethod() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->asdf(); + } + + public function testAddInvalidCollection() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->addAsdf(new \stdClass()); + } +} + +class TestObject extends PersistentObject +{ + protected $id = 1; + protected $name = 'beberlei'; + protected $parent; + protected $children; +} + +class TestObjectMetadata implements ClassMetadata +{ + + public function getAssociationMappedByTargetField($assocName) + { + $assoc = array('children' => 'parent'); + return $assoc[$assocName]; + } + + public function getAssociationNames() + { + return array('parent', 'children'); + } + + public function getAssociationTargetClass($assocName) + { + return __NAMESPACE__ . '\TestObject'; + } + + public function getFieldNames() + { + return array('id', 'name'); + } + + public function getIdentifier() + { + return array('id'); + } + + public function getName() + { + return __NAMESPACE__ . '\TestObject'; + } + + public function getReflectionClass() + { + return new \ReflectionClass($this->getName()); + } + + public function getTypeOfField($fieldName) + { + $types = array('id' => 'integer', 'name' => 'string'); + return $types[$fieldName]; + } + + public function hasAssociation($fieldName) + { + return in_array($fieldName, array('parent', 'children')); + } + + public function hasField($fieldName) + { + return in_array($fieldName, array('id', 'name')); + } + + public function isAssociationInverseSide($assocName) + { + return ($assocName === 'children'); + } + + public function isCollectionValuedAssociation($fieldName) + { + return ($fieldName === 'children'); + } + + public function isIdentifier($fieldName) + { + return $fieldName === 'id'; + } + + public function isSingleValuedAssociation($fieldName) + { + return $fieldName === 'parent'; + } + + public function getIdentifierValues($entity) + { + + } + + public function getIdentifierFieldNames() + { + + } + + public function initializeReflection(ReflectionService $reflService) + { + + } + + public function wakeupReflection(ReflectionService $reflService) + { + + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php new file mode 100644 index 00000000..a2814500 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php @@ -0,0 +1,100 @@ +assertEquals($expectedClassName, ClassUtils::getRealClass($className)); + } + + /** + * @dataProvider dataGetClass + */ + public function testGetClass( $className, $expectedClassName ) + { + $object = new $className(); + $this->assertEquals($expectedClassName, ClassUtils::getClass($object)); + } + + public function testGetParentClass() + { + $parentClass = ClassUtils::getParentClass( 'MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject' ); + $this->assertEquals('stdClass', $parentClass); + } + + public function testGenerateProxyClassName() + { + $this->assertEquals( 'Proxies\__CG__\stdClass', ClassUtils::generateProxyClassName( 'stdClass', 'Proxies' ) ); + } + + /** + * @dataProvider dataGetClass + */ + public function testNewReflectionClass( $className, $expectedClassName ) + { + $reflClass = ClassUtils::newReflectionClass( $className ); + $this->assertEquals( $expectedClassName, $reflClass->getName() ); + } + + /** + * @dataProvider dataGetClass + */ + public function testNewReflectionObject( $className, $expectedClassName ) + { + $object = new $className; + $reflClass = ClassUtils::newReflectionObject( $object ); + $this->assertEquals( $expectedClassName, $reflClass->getName() ); + } + } + + class ChildObject extends \stdClass + { + } +} + +namespace MyProject\Proxies\__CG__ +{ + class stdClass extends \stdClass + { + } +} + +namespace MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util +{ + class ChildObject extends \Doctrine\Tests\Common\Util\ChildObject + { + } +} + +namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__ +{ + class stdClass extends \MyProject\Proxies\__CG__\stdClass + { + } +} + +namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util +{ + class ChildObject extends \MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject + { + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php new file mode 100644 index 00000000..b4e9eed2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php @@ -0,0 +1,27 @@ +foo = "bar"; + $obj->bar = 1234; + + $var = Debug::export($obj, 2); + $this->assertEquals( "stdClass", $var->__CLASS__ ); + } + + public function testExportDateTime() + { + $obj = new \DateTime( "2010-10-10 10:10:10" ); + + $var = Debug::export( $obj, 2 ); + $this->assertEquals( "DateTime", $var->__CLASS__ ); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php b/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php new file mode 100644 index 00000000..e8323d29 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php @@ -0,0 +1,10 @@ + + */ +class NativePhpunitTask extends Task +{ + private $test; + private $testfile; + private $testdirectory; + private $configuration = null; + private $coverageClover = null; + private $junitlogfile = null; + private $haltonfailure = true; + private $haltonerror = true; + + public function setTestdirectory($directory) { + $this->testdirectory = $directory; + } + + public function setTest($test) { + $this->test = $test; + } + + public function setTestfile($testfile) { + $this->testfile = $testfile; + } + + public function setJunitlogfile($junitlogfile) { + if (strlen($junitlogfile) == 0) { + $junitlogfile = NULL; + } + + $this->junitlogfile = $junitlogfile; + } + + public function setConfiguration($configuration) { + if (strlen($configuration) == 0) { + $configuration = NULL; + } + + $this->configuration = $configuration; + } + + public function setCoverageClover($coverageClover) { + if (strlen($coverageClover) == 0) { + $coverageClover = NULL; + } + + $this->coverageClover = $coverageClover; + } + + public function setHaltonfailure($haltonfailures) { + $this->haltonfailure = $haltonfailures; + } + + public function setHaltonerror($haltonerrors) { + $this->haltonerror = $haltonerrors; + } + + public function init() + { + require_once "PHPUnit/Runner/Version.php"; + $version = PHPUnit_Runner_Version::id(); + + if (version_compare($version, '3.4.0') < 0) { + throw new BuildException("NativePHPUnitTask requires PHPUnit version >= 3.2.0", $this->getLocation()); + } + + require_once 'PHPUnit/Util/Filter.php'; + + // point PHPUnit_MAIN_METHOD define to non-existing method + if (!defined('PHPUnit_MAIN_METHOD')) { + define('PHPUnit_MAIN_METHOD', 'PHPUnitTask::undefined'); + } + } + + public function main() + { + if (!is_dir(realpath($this->testdirectory))) { + throw new BuildException("NativePHPUnitTask requires a Test Directory path given, '".$this->testdirectory."' given."); + } + set_include_path(realpath($this->testdirectory) . PATH_SEPARATOR . get_include_path()); + + $printer = new NativePhpunitPrinter(); + + $arguments = array( + 'configuration' => $this->configuration, + 'coverageClover' => $this->coverageClover, + 'junitLogfile' => $this->junitlogfile, + 'printer' => $printer, + ); + + $runner = new PHPUnit_TextUI_TestRunner(); + $suite = $runner->getTest($this->test, $this->testfile, true); + + try { + $result = $runner->doRun($suite, $arguments); + /* @var $result PHPUnit_Framework_TestResult */ + + if ( ($this->haltonfailure && $result->failureCount() > 0) || ($this->haltonerror && $result->errorCount() > 0) ) { + throw new BuildException("PHPUnit: ".$result->failureCount()." Failures and ".$result->errorCount()." Errors, ". + "last failure message: ".$printer->getMessages()); + } + + $this->log("PHPUnit Success: ".count($result->passed())." tests passed, no ". + "failures (".$result->skippedCount()." skipped, ".$result->notImplementedCount()." not implemented)"); + + // Hudson for example doesn't like the backslash in class names + if (file_exists($this->coverageClover)) { + $this->log("Generated Clover Coverage XML to: ".$this->coverageClover); + $content = file_get_contents($this->coverageClover); + $content = str_replace("\\", ".", $content); + file_put_contents($this->coverageClover, $content); + unset($content); + } + + } catch(\Exception $e) { + throw new BuildException("NativePhpunitTask failed: ".$e->getMessage()); + } + } +} + +class NativePhpunitPrinter extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener +{ + private $_messages = array(); + + public function write($buffer) + { + // do nothing + } + + public function getMessages() + { + return $this->_messages; + } + + /** + * An error occurred. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + */ + public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) + { + $this->_messages[] = "Test ERROR: ".$test->getName().": ".$e->getMessage(); + } + + /** + * A failure occurred. + * + * @param PHPUnit_Framework_Test $test + * @param PHPUnit_Framework_AssertionFailedError $e + * @param float $time + */ + public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) + { + $this->_messages[] = "Test FAILED: ".$test->getName().": ".$e->getMessage(); + } + + /** + * Incomplete test. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + */ + public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) + { + + } + + /** + * Skipped test. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + * @since Method available since Release 3.0.0 + */ + public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) + { + + } + + /** + * A test suite started. + * + * @param PHPUnit_Framework_TestSuite $suite + * @since Method available since Release 2.2.0 + */ + public function startTestSuite(PHPUnit_Framework_TestSuite $suite) + { + + } + + /** + * A test suite ended. + * + * @param PHPUnit_Framework_TestSuite $suite + * @since Method available since Release 2.2.0 + */ + public function endTestSuite(PHPUnit_Framework_TestSuite $suite) + { + + } + + /** + * A test started. + * + * @param PHPUnit_Framework_Test $test + */ + public function startTest(PHPUnit_Framework_Test $test) + { + + } + + /** + * A test ended. + * + * @param PHPUnit_Framework_Test $test + * @param float $time + */ + public function endTest(PHPUnit_Framework_Test $test, $time) + { + + } +} diff --git a/vendor/doctrine/common/tests/README.markdown b/vendor/doctrine/common/tests/README.markdown new file mode 100644 index 00000000..e6f1703d --- /dev/null +++ b/vendor/doctrine/common/tests/README.markdown @@ -0,0 +1,27 @@ +# Running the Doctrine 2 Testsuite + +## Running tests + +Execute PHPUnit in the root folder of your doctrine-common clone. + + phpunit + +## Testing Lock-Support + +The Lock support in Doctrine 2 is tested using Gearman, which allows to run concurrent tasks in parallel. +Install Gearman with PHP as follows: + +1. Go to http://www.gearman.org and download the latest Gearman Server +2. Compile it and then call ldconfig +3. Start it up "gearmand -vvvv" +4. Install pecl/gearman by calling "gearman-beta" + +You can then go into tests/ and start up two workers: + + php Doctrine/Tests/ORM/Functional/Locking/LockAgentWorker.php + +Then run the locking test-suite: + + phpunit --configuration Doctrine/Tests/ORM/Functional/Locking/GearmanLockTest.php + +This can run considerable time, because it is using sleep() to test for the timing ranges of locks. \ No newline at end of file From 9272d116cfc415b9dbc2d775d34316bb62a7ea69 Mon Sep 17 00:00:00 2001 From: "cheresharov@yahoo.com" <> Date: Thu, 28 Feb 2013 16:11:51 +0000 Subject: [PATCH 179/180] Added module StudentBg --- config/autoload/global.php | 1 - module/StudentBg/Module.php | 24 +++++++++++++ module/StudentBg/autoload_classmap.php | 2 ++ module/StudentBg/config/module.config.php | 34 +++++++++++++++++++ .../StudentBg/Controller/IndexController.php | 21 ++++++++++++ .../view/student-bg/index/index.phtml | 1 + 6 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 module/StudentBg/Module.php create mode 100644 module/StudentBg/autoload_classmap.php create mode 100644 module/StudentBg/config/module.config.php create mode 100644 module/StudentBg/src/StudentBg/Controller/IndexController.php create mode 100644 module/StudentBg/view/student-bg/index/index.phtml diff --git a/config/autoload/global.php b/config/autoload/global.php index ab8e0374..52419a69 100644 --- a/config/autoload/global.php +++ b/config/autoload/global.php @@ -1,6 +1,5 @@ array( + __DIR__ . '/autoload_classmap.php', + ), + 'Zend\Loader\StandardAutoloader' => array( + 'namespaces' => array( + __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, + ), + ), + ); + } + + public function getConfig() + { + return include __DIR__ . '/config/module.config.php'; + } +} \ No newline at end of file diff --git a/module/StudentBg/autoload_classmap.php b/module/StudentBg/autoload_classmap.php new file mode 100644 index 00000000..dad330e6 --- /dev/null +++ b/module/StudentBg/autoload_classmap.php @@ -0,0 +1,2 @@ + array( + 'invokables' => array( + 'StudentBg\Controller\Index' => 'StudentBg\Controller\IndexController', + ), + ), + + // The following section is new and should be added to your file + 'router' => array( + 'routes' => array( + 'student_bg' => array( + 'type' => 'segment', + 'options' => array( + 'route' => '/student-bg[/:action][/:id]', + 'constraints' => array( + 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', + 'id' => '[0-9]+', + ), + 'defaults' => array( + 'controller' => 'StudentBg\Controller\Index', + 'action' => 'index', + ), + ), + ), + ), + ), + + 'view_manager' => array( + 'template_path_stack' => array( + 'student_bg' => __DIR__ . '/../view', + ), + ), +); \ No newline at end of file diff --git a/module/StudentBg/src/StudentBg/Controller/IndexController.php b/module/StudentBg/src/StudentBg/Controller/IndexController.php new file mode 100644 index 00000000..a72cd8db --- /dev/null +++ b/module/StudentBg/src/StudentBg/Controller/IndexController.php @@ -0,0 +1,21 @@ +I am the index.phtml in StudentBg module \ No newline at end of file From 254dce22dbc3afad5d6c03e05b8253f760a6f4f7 Mon Sep 17 00:00:00 2001 From: "cheresharov@yahoo.com" <> Date: Thu, 28 Feb 2013 16:16:16 +0000 Subject: [PATCH 180/180] We told the App about our new module StudentBg --- config/application.config.php | 1 + 1 file changed, 1 insertion(+) diff --git a/config/application.config.php b/config/application.config.php index f8d29abd..06c051df 100644 --- a/config/application.config.php +++ b/config/application.config.php @@ -8,6 +8,7 @@ 'GyunerZeki', 'StoyanCheresharov', // <-- Add this line 'FmiStudent', // <-- Add this line + 'StudentBg', ), 'module_listener_options' => array( 'config_glob_paths' => array(

translate('Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2.'), '', '', \Zend\Version\Version::VERSION) ?>

translate('Congratulations! You have successfully installed the %sZF2 Skeleton Application%s. You are currently running Zend Framework version %s. This skeleton can serve as a simple starting point for you to begin building your application on ZF2.'), '', '', \Zend\Version\Version::VERSION) ?>