Completed
Push — master ( e97dd4...1dc8c9 )
by Zaahid
05:49
created

HeaderFactory   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 121
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 47
c 2
b 0
f 0
dl 0
loc 121
ccs 17
cts 17
cp 1
rs 10
wmc 8

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A getNormalizedHeaderName() 0 3 1
A getClassFor() 0 11 4
A newHeaderContainer() 0 3 1
A newInstance() 0 4 1
1
<?php
2
/**
3
 * This file is part of the ZBateson\MailMimeParser project.
4
 *
5
 * @license http://opensource.org/licenses/bsd-license.php BSD
6
 */
7
namespace ZBateson\MailMimeParser\Header;
8
9
use ZBateson\MailMimeParser\Header\Consumer\ConsumerService;
10
11
/**
12
 * Constructs various AbstractHeader types depending on the type of header
13
 * passed.
14
 * 
15
 * If the passed header resolves to a specific defined header type, it is parsed
16
 * as such.  Otherwise, a GenericHeader is instantiated and returned.  Headers
17
 * are mapped as follows:
18
 * 
19
 * AddressHeader: From, To, Cc, Bcc, Sender, Reply-To, Resent-From, Resent-To,
20
 * Resent-Cc, Resent-Bcc, Resent-Reply-To, Delivered-To
21
 * DateHeader: Date, Resent-Date, Delivery-Date, Expires, Expiry-Date, Reply-By
22
 * ParameterHeader: Content-Type, Content-Disposition
23
 * IdHeader: Message-ID, Content-ID, In-Reply-To, References
24
 * ReceivedHeader: Received
25
 *
26
 * @author Zaahid Bateson
27
 */
28
class HeaderFactory
29
{
30
    /**
31
     * @var ConsumerService the passed ConsumerService providing
32
     * AbstractConsumer singletons.
33
     */
34
    protected $consumerService;
35
    
36
    /**
37
     * @var string[][] maps AbstractHeader types to headers. 
38
     */
39
    protected $types = [
40
        'ZBateson\MailMimeParser\Header\AddressHeader' => [
41
            'from',
42
            'to',
43
            'cc',
44
            'bcc',
45
            'sender',
46
            'replyto',
47
            'resentfrom',
48
            'resentto',
49
            'resentcc',
50
            'resentbcc',
51
            'resentreplyto',
52
            'deliveredto',
53
        ],
54
        'ZBateson\MailMimeParser\Header\DateHeader' => [
55
            'date',
56
            'resentdate',
57
            'deliverydate',
58
            'expires',
59
            'expirydate',
60
            'replyby',
61
        ],
62
        'ZBateson\MailMimeParser\Header\ParameterHeader' => [
63
            'contenttype',
64
            'contentdisposition',
65
        ],
66
        'ZBateson\MailMimeParser\Header\SubjectHeader' => [
67
            'subject',
68
        ],
69
        'ZBateson\MailMimeParser\Header\IdHeader' => [
70
            'messageid',
71
            'contentid',
72
            'inreplyto',
73
            'references'
74
        ],
75
        'ZBateson\MailMimeParser\Header\ReceivedHeader' => [
76
            'received'
77
        ]
78
    ];
79
    
80
    /**
81
     * @var string Defines the generic AbstractHeader type to use for headers
82
     * that aren't mapped in $types
83
     */
84
    protected $genericType = 'ZBateson\MailMimeParser\Header\GenericHeader';
85
    
86
    /**
87
     * Instantiates member variables with the passed objects.
88
     * 
89
     * @param ConsumerService $consumerService
90
     */
91 8
    public function __construct(ConsumerService $consumerService)
92
    {
93 8
        $this->consumerService = $consumerService;
94 8
    }
95
96
    /**
97
     * Returns the string in lower-case, and with non-alphanumeric characters
98
     * stripped out.
99
     *
100
     * @param string $header
101
     * @return string
102
     */
103 7
    public function getNormalizedHeaderName($header)
104
    {
105 7
        return preg_replace('/[^a-z0-9]/', '', strtolower($header));
106
    }
107
    
108
    /**
109
     * Returns the name of an AbstractHeader class for the passed header name.
110
     * 
111
     * @param string $name
112
     * @return string
113
     */
114 7
    private function getClassFor($name)
115
    {
116 7
        $test = $this->getNormalizedHeaderName($name);
117 7
        foreach ($this->types as $class => $matchers) {
118 7
            foreach ($matchers as $matcher) {
119 7
                if ($test === $matcher) {
120 7
                    return $class;
121
                }
122
            }
123
        }
124 4
        return $this->genericType;
125
    }
126
    
127
    /**
128
     * Creates an AbstractHeader instance for the passed header name and value,
129
     * and returns it.
130
     * 
131
     * @param string $name
132
     * @param string $value
133
     * @return \ZBateson\MailMimeParser\Header\AbstractHeader
134
     */
135 7
    public function newInstance($name, $value)
136
    {
137 7
        $class = $this->getClassFor($name);
138 7
        return new $class($this->consumerService, $name, $value);
139
    }
140
141
    /**
142
     * Creates and returns a HeaderContainer.
143
     *
144
     * @return HeaderContainer;
145
     */
146 1
    public function newHeaderContainer()
147
    {
148 1
        return new HeaderContainer($this);
149
    }
150
}
151