001 /**
002 * ================================================
003 * LibLoader : a free Java resource loading library
004 * ================================================
005 *
006 * Project Info: http://reporting.pentaho.org/libloader/
007 *
008 * (C) Copyright 2006, by Pentaho Corporation and Contributors.
009 *
010 * This library is free software; you can redistribute it and/or modify it under the terms
011 * of the GNU Lesser General Public License as published by the Free Software Foundation;
012 * either version 2.1 of the License, or (at your option) any later version.
013 *
014 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
015 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
016 * See the GNU Lesser General Public License for more details.
017 *
018 * You should have received a copy of the GNU Lesser General Public License along with this
019 * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
020 * Boston, MA 02111-1307, USA.
021 *
022 * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
023 * in the United States and other countries.]
024 *
025 *
026 * ------------
027 * $Id: ResourceKey.java 3520 2007-10-16 10:34:47Z tmorgner $
028 * ------------
029 * (C) Copyright 2006, by Pentaho Corporation.
030 */
031 package org.jfree.resourceloader;
032
033 import java.io.Serializable;
034 import java.util.Collections;
035 import java.util.HashMap;
036 import java.util.Map;
037 import java.util.Arrays;
038
039 /**
040 * The key is an unique identifier for the resource. Most of the time,
041 * this may be an URL, but other (especially database based) schemas are
042 * possible.
043 *
044 * A resource key must provide an 'equals' implementation. ResourceKeys should
045 * be implemented as immutable classes, so that they can be safely stored in
046 * collections or on external storages (like caches).
047 *
048 * @author Thomas Morgner
049 */
050 public final class ResourceKey implements Serializable
051 {
052 private static final Map EMPTY_MAP =
053 Collections.unmodifiableMap(new HashMap());
054
055 private Map factoryParameters;
056 private Integer hashCode;
057 private Object schema;
058 private Object identifier;
059 private ResourceKey parent;
060
061 public ResourceKey(final Object schema,
062 final Object identifier,
063 final Map factoryParameters)
064 {
065 if (schema == null)
066 {
067 throw new NullPointerException();
068 }
069 if (identifier == null)
070 {
071 throw new NullPointerException();
072 }
073
074 this.schema = schema;
075 this.identifier = identifier;
076 if (factoryParameters != null)
077 {
078 this.factoryParameters =
079 Collections.unmodifiableMap(new HashMap(factoryParameters));
080 }
081 else
082 {
083 this.factoryParameters = EMPTY_MAP;
084 }
085 }
086
087 public ResourceKey(final ResourceKey parent,
088 final Object schema,
089 final Object identifier,
090 final Map factoryParameters)
091 {
092 this(schema, identifier, factoryParameters);
093 this.parent = parent;
094 }
095
096 public ResourceKey getParent()
097 {
098 return parent;
099 }
100
101 public Map getFactoryParameters ()
102 {
103 return factoryParameters;
104 }
105
106 public boolean equals(final Object o)
107 {
108 if (this == o)
109 {
110 return true;
111 }
112 if (o == null || getClass() != o.getClass())
113 {
114 return false;
115 }
116
117 final ResourceKey that = (ResourceKey) o;
118
119 if (!schema.equals(that.schema))
120 {
121 return false;
122 }
123 if (!factoryParameters.equals(that.factoryParameters))
124 {
125 return false;
126 }
127 if (!identifier.equals(that.identifier))
128 {
129 if (identifier instanceof byte[] && that.identifier instanceof byte[])
130 {
131 final byte[] me = (byte[]) identifier;
132 final byte[] he = (byte[]) that.identifier;
133 Arrays.equals(me, he);
134 }
135 return false;
136 }
137
138 return true;
139 }
140
141 public int hashCode()
142 {
143 if (hashCode == null)
144 {
145 int result = factoryParameters.hashCode();
146 result = 29 * result + schema.hashCode();
147 result = 29 * result + identifier.hashCode();
148 hashCode = new Integer(result);
149 }
150 return hashCode.intValue();
151 }
152
153 public Object getIdentifier()
154 {
155 return identifier;
156 }
157
158 /**
159 * Returns the schema of this resource key. The schema is an internal
160 * identifier to locate the resource-loader implementation that was
161 * responsible for creating the key in the first place.
162 *
163 * The schema has no meaning outside the resource loading framework.
164 *
165 * @return
166 */
167 public Object getSchema ()
168 {
169 return schema;
170 }
171
172
173 public String toString()
174 {
175 return "ResourceKey{" +
176 "schema=" + schema +
177 ", identifier=" + identifier +
178 ", factoryParameters=" + factoryParameters +
179 ", parent=" + parent +
180 '}';
181 }
182 }
183