From e79a49944682ed7a4659b45fe5488f0e87ec2943 Mon Sep 17 00:00:00 2001 From: zhgzhg Date: Fri, 8 Feb 2013 21:01:12 +0200 Subject: [PATCH] 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