/*
 *  Copyright 2012 Christopher Pheby
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package org.jadira.usertype.dateandtime.joda.util;

import java.io.Serializable;

import org.joda.time.DateTimeZone;
import org.joda.time.ReadableInstant;

public class DateTimeZoneWithOffset implements Serializable {

	private static final long serialVersionUID = 7258300189932937173L;

	private final DateTimeZone standardDateTimeZone;
	private final DateTimeZone offsetDateTimeZone;

	public DateTimeZoneWithOffset(ReadableInstant instant) {
		this(instant.getZone(), DateTimeZone.forOffsetMillis(instant.getZone().getOffset(instant)));
	}

	public DateTimeZoneWithOffset(DateTimeZone zone) {
		this.standardDateTimeZone = zone;
		this.offsetDateTimeZone = null;
	}
	
	public DateTimeZoneWithOffset(String zoneWithOffset) {
		
		int separatorIndex = zoneWithOffset.indexOf('{');
		if (separatorIndex == -1) {
			this.standardDateTimeZone = DateTimeZone.forID(zoneWithOffset);
			this.offsetDateTimeZone = null;
		} else {
			this.standardDateTimeZone = DateTimeZone.forID(zoneWithOffset.substring(0, separatorIndex));
			this.offsetDateTimeZone = DateTimeZone.forID(zoneWithOffset.substring(separatorIndex + 1, zoneWithOffset.length() - 1));
		}
		
	}
	
	public DateTimeZoneWithOffset(DateTimeZone standardDateTimeZone, DateTimeZone offsetDateTimeZone) {
		this.standardDateTimeZone = standardDateTimeZone;
		this.offsetDateTimeZone = offsetDateTimeZone;
		if (offsetDateTimeZone != null && standardDateTimeZone.isFixed()) {
			throw new IllegalArgumentException("offsetDateTimeZone must be null when standardDateTimeZone is fixed");
		}
		if (offsetDateTimeZone == null && !standardDateTimeZone.isFixed()) {
			throw new IllegalArgumentException("offsetDateTimeZone must be not null when standardDateTimeZone is not fixed");
		}
	}

	public DateTimeZone getStandardDateTimeZone() {
		return standardDateTimeZone;
	}
	
	public DateTimeZone getOffsetDateTimeZone() {
		return offsetDateTimeZone;
	}
	
	/**
	 * {@inheritDoc}
	 */
	@Override
	public String toString() {
		if (offsetDateTimeZone == null) {
			return standardDateTimeZone.toString();
		} else {
			return standardDateTimeZone.toString() + "{" + offsetDateTimeZone.toString() + "}";
		}
	}
		
	/**
	 * {@inheritDoc}
	 */
	@Override
	public boolean equals(Object obj) {
        if (obj == null) {
        	return false;
        }
        if (!this.getClass().equals(obj.getClass())) {
        	return false;
        }
       
        final DateTimeZoneWithOffset obj2 = (DateTimeZoneWithOffset)obj;
        if (this.standardDateTimeZone.equals(obj2.standardDateTimeZone)
        	&& offsetDateTimeZone.equals(offsetDateTimeZone)) {
            return true;
        }
        
        return false;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public int hashCode() {
		return standardDateTimeZone.hashCode() * 3 + offsetDateTimeZone.hashCode() * 5;
	}
}

@@ -3272,16 +3272,21 @@
 .equals(
+obj2.
 offsetDa

Correct defective equals method