blob: 2a5f014a64b7205e1c41c94fd2bb2d6a7f2684dd [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.jackrabbit.oak.plugins.document;
import java.util.HashMap;
import java.util.Map;
import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants;
import org.apache.jackrabbit.oak.spi.version.VersionConstants;
import org.apache.jackrabbit.oak.spi.state.ConflictType;
/**
* TODO document
*/
public final class StringCache {
private static final Map<String, String> CONSTANTS = createStringMap(
JcrConstants.JCR_AUTOCREATED,
JcrConstants.JCR_BASEVERSION,
JcrConstants.JCR_CHILD,
JcrConstants.JCR_CHILDNODEDEFINITION,
JcrConstants.JCR_CONTENT,
JcrConstants.JCR_CREATED,
JcrConstants.JCR_DATA,
JcrConstants.JCR_DEFAULTPRIMARYTYPE,
JcrConstants.JCR_DEFAULTVALUES,
JcrConstants.JCR_ENCODING,
JcrConstants.JCR_FROZENMIXINTYPES,
JcrConstants.JCR_FROZENNODE,
JcrConstants.JCR_FROZENPRIMARYTYPE,
JcrConstants.JCR_FROZENUUID,
JcrConstants.JCR_HASORDERABLECHILDNODES,
JcrConstants.JCR_ISCHECKEDOUT,
JcrConstants.JCR_ISMIXIN,
JcrConstants.JCR_LANGUAGE,
JcrConstants.JCR_LASTMODIFIED,
JcrConstants.JCR_LOCKISDEEP,
JcrConstants.JCR_LOCKOWNER,
JcrConstants.JCR_MANDATORY,
JcrConstants.JCR_MERGEFAILED,
JcrConstants.JCR_MIMETYPE,
JcrConstants.JCR_MIXINTYPES,
JcrConstants.JCR_MULTIPLE,
JcrConstants.JCR_NAME,
JcrConstants.JCR_NODETYPENAME,
JcrConstants.JCR_ONPARENTVERSION,
JcrConstants.JCR_PREDECESSORS,
JcrConstants.JCR_PRIMARYITEMNAME,
JcrConstants.JCR_PRIMARYTYPE,
JcrConstants.JCR_PROPERTYDEFINITION,
JcrConstants.JCR_PROTECTED,
JcrConstants.JCR_REQUIREDPRIMARYTYPES,
JcrConstants.JCR_REQUIREDTYPE,
JcrConstants.JCR_ROOTVERSION,
JcrConstants.JCR_SAMENAMESIBLINGS,
JcrConstants.JCR_STATEMENT,
JcrConstants.JCR_SUCCESSORS,
JcrConstants.JCR_SUPERTYPES,
JcrConstants.JCR_SYSTEM,
JcrConstants.JCR_UUID,
JcrConstants.JCR_VALUECONSTRAINTS,
JcrConstants.JCR_VERSIONHISTORY,
JcrConstants.JCR_VERSIONLABELS,
JcrConstants.JCR_VERSIONSTORAGE,
JcrConstants.JCR_VERSIONABLEUUID,
JcrConstants.JCR_PATH,
JcrConstants.JCR_SCORE,
JcrConstants.MIX_LOCKABLE,
JcrConstants.MIX_REFERENCEABLE,
JcrConstants.MIX_VERSIONABLE,
JcrConstants.MIX_SHAREABLE,
JcrConstants.NT_BASE,
JcrConstants.NT_CHILDNODEDEFINITION,
JcrConstants.NT_FILE,
JcrConstants.NT_FOLDER,
JcrConstants.NT_FROZENNODE,
JcrConstants.NT_HIERARCHYNODE,
JcrConstants.NT_LINKEDFILE,
JcrConstants.NT_NODETYPE,
JcrConstants.NT_PROPERTYDEFINITION,
JcrConstants.NT_QUERY,
JcrConstants.NT_RESOURCE,
JcrConstants.NT_UNSTRUCTURED,
JcrConstants.NT_VERSION,
JcrConstants.NT_VERSIONHISTORY,
JcrConstants.NT_VERSIONLABELS,
JcrConstants.NT_VERSIONEDCHILD,
NodeTypeConstants.JCR_NODE_TYPES,
NodeTypeConstants.JCR_IS_ABSTRACT,
NodeTypeConstants.JCR_IS_QUERYABLE,
NodeTypeConstants.JCR_IS_FULLTEXT_SEARCHABLE,
NodeTypeConstants.JCR_IS_QUERY_ORDERABLE,
NodeTypeConstants.JCR_AVAILABLE_QUERY_OPERATORS,
NodeTypeConstants.NT_REP_ROOT,
NodeTypeConstants.NT_REP_SYSTEM,
NodeTypeConstants.JCR_CREATEDBY,
NodeTypeConstants.JCR_LASTMODIFIEDBY,
NodeTypeConstants.MIX_CREATED,
NodeTypeConstants.MIX_LASTMODIFIED,
NodeTypeConstants.MIX_REP_MERGE_CONFLICT,
NodeTypeConstants.REP_OURS,
ConflictType.DELETE_CHANGED_PROPERTY.getName(),
ConflictType.DELETE_CHANGED_NODE.getName(),
ConflictType.ADD_EXISTING_PROPERTY.getName(),
ConflictType.CHANGE_DELETED_PROPERTY.getName(),
ConflictType.CHANGE_CHANGED_PROPERTY.getName(),
ConflictType.DELETE_DELETED_PROPERTY.getName(),
ConflictType.ADD_EXISTING_NODE.getName(),
ConflictType.CHANGE_DELETED_NODE.getName(),
ConflictType.DELETE_DELETED_NODE.getName(),
VersionConstants.JCR_ACTIVITY,
VersionConstants.JCR_ACTIVITIES,
VersionConstants.JCR_ACTIVITY_TITLE,
VersionConstants.NT_ACTIVITY,
VersionConstants.REP_ACTIVITIES,
VersionConstants.JCR_CONFIGURATION,
VersionConstants.JCR_CONFIGURATIONS,
VersionConstants.JCR_ROOT,
VersionConstants.NT_CONFIGURATION,
VersionConstants.REP_CONFIGURATIONS);
private StringCache() {
}
private static Map<String, String> createStringMap(String... strings) {
Map<String, String> map = new HashMap<>();
for (String string : strings) {
map.put(string, string);
}
return map;
}
// must be a power of 2
private static final int STRING_CACHE_SIZE = 1024;
private static final String[] STRING_CACHE = new String[STRING_CACHE_SIZE];
public static String get(String s) {
String constant = CONSTANTS.get(s);
if (constant != null) {
return constant;
}
int index = s.hashCode() & (STRING_CACHE_SIZE - 1);
String cached = STRING_CACHE[index];
if (!s.equals(cached)) {
cached = new String(s); // avoid referring to
STRING_CACHE[index] = cached;
}
return cached;
}
}