001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.kernel.increment;
016    
017    /**
018     * @author Zsolt Berentey
019     */
020    public class NumberIncrement implements Increment<Number> {
021    
022            public NumberIncrement(Number value) {
023                    _value = value;
024            }
025    
026            public void decrease(Number delta) {
027                    _value = subtract(delta);
028            }
029    
030            public Increment<Number> decreaseForNew(Number delta) {
031                    return new NumberIncrement(subtract(delta));
032            }
033    
034            public Number getValue() {
035                    return _value;
036            }
037    
038            public void increase(Number delta) {
039                    _value = add(delta);
040            }
041    
042            public Increment<Number> increaseForNew(Number delta) {
043                    return new NumberIncrement(add(delta));
044            }
045    
046            public void setValue(Number value) {
047                    _value = value;
048            }
049    
050            protected Number add(Number delta) {
051                    if (delta instanceof Double) {
052                            return addAsDouble(delta);
053                    }
054                    else if (delta instanceof Integer) {
055                            return addAsInteger(delta);
056                    }
057                    else if (delta instanceof Long) {
058                            return addAsLong(delta);
059                    }
060    
061                    return _value;
062            }
063    
064            protected Number addAsDouble(Number delta) {
065                    if (delta == null) {
066                            return _value;
067                    }
068    
069                    return _value.doubleValue() + delta.doubleValue();
070            }
071    
072            protected Number addAsInteger(Number delta) {
073                    if (delta == null) {
074                            return _value;
075                    }
076    
077                    return _value.intValue() + delta.intValue();
078            }
079    
080            protected Number addAsLong(Number delta) {
081                    if (delta == null) {
082                            return _value;
083                    }
084    
085                    return _value.longValue() + delta.longValue();
086            }
087    
088            protected Number subtract(Number delta) {
089                    if (delta instanceof Double) {
090                            return subtractAsDouble(delta);
091                    }
092                    else if (delta instanceof Integer) {
093                            return subtractAsInteger(delta);
094                    }
095                    else if (delta instanceof Long) {
096                            return subtractAsLong(delta);
097                    }
098    
099                    return _value;
100            }
101    
102            protected Number subtractAsDouble(Number delta) {
103                    if (delta == null) {
104                            return _value;
105                    }
106    
107                    return _value.doubleValue() - delta.doubleValue();
108            }
109    
110            protected Number subtractAsInteger(Number delta) {
111                    if (delta == null) {
112                            return _value;
113                    }
114    
115                    return _value.intValue() - delta.intValue();
116            }
117    
118            protected Number subtractAsLong(Number delta) {
119                    if (delta == null) {
120                            return _value;
121                    }
122    
123                    return _value.longValue() - delta.longValue();
124            }
125    
126            private Number _value = 0;
127    
128    }