<?xml version="1.0" encoding="UTF-8"?>
<!-- 
	/*
	* Copyright 2001-2004 The Apache Software Foundation.
	* 
	* 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.
	*/
-->

<faqs title="Frequently Asked Questions">

	<part id="configuration">
		<title>Configuration</title>

		<faq id="required-jars">
			<question>What jars are required by JCS?</question>
			<answer>
                <p>
                    As of version 3.0, the core of JCS (the LRU
                    memory cache, the indexed disk cache, the TCP
                    lateral, and the RMI remote server) have no
                    mandatory dependencies.
                </p>
				<p>
					All of the other dependencies listed on the project
					info page are for optional plugins.
				</p>
			</answer>
		</faq>

		<faq id="configuration-file">
			<question>How do I configure JCS?</question>
			<answer>
				<p>
					By default JCS looks for a cache.ccf file in the
					classpath. The 
                    <a href="LocalCacheConfig.html">documentation</a>
					 describes how to configure the cache.
				</p>
			</answer>
		</faq>

		<faq id="manual-configuration">
			<question>
				How can I configure JCS with my own properties?
			</question>

			<answer>
				<p>
					You don't have to put the cache.ccf file in the
					classpath; instead you can do the following:
				</p>
				<code>
					Properties props = new Properties();

					props.load(/* load properties from some location
					defined by your app */);

					JCS.setConfigProperties(props);
				</code>
			</answer>
		</faq>

		<faq id="configuration-system-properties">
			<question>
				Can JCS use system properties during configuration?
			</question>
			<answer>
				<p>
					Yes. JCS will look for a system property for any
					name inside the delimiters ${}. Also, JCS will check
					to see if any property key in the cache.ccf is
					defined in the system properties. If so, the system
					value will be used.
				</p>
			</answer>
		</faq>

        <faq id="shutdown">
            <question>
                How do I shut down JCS properly?
            </question>
            <answer>
                <p>
                    As of version 3.0, you can simply call
                </p>
                <code>
                    JCS.shutdown();
                </code>
            </answer>
        </faq>
	</part>

	<part id="general-questions">
		<title>General Questions</title>

		<faq id="jcs-vs-ehcache">
			<question>Is JCS faster than EHCache?</question>
			<answer>
				<p>
					Yes. JCS is almost twice as fast as EHCache. JCS
					1.2.7.0, using the default LRU Memory Cache, has
					proven to be nearly twice as fast as EHCache
					1.2-beta4 at gets and puts. The EHCache benchmark
					data is unsubstantiated and very old. As such the
					EHCache site benchmark data is completely
					inaccurate.
					<a href="JCSvsEHCache.html">Read More</a>
				</p>
			</answer>
		</faq>

		<faq id="admin-jsp">
			<question>Where can I get the admin jsp?</question>
			<answer>
				<p>
					You can download the admin jsp
					<a
						href="https://raw.githubusercontent.com/apache/commons-jcs/master/commons-jcs-core/src/main/java/org/apache/commons/jcs3/admin/JCSAdmin.jsp">
						here
					</a>
					.
				</p>
			</answer>
		</faq>

		<faq id="source-code">
			<question>Where can I get the source?</question>
			<answer>
				<p>
					See the information about the 
					<a href="scm.html">Source Repository</a>
				</p>
			</answer>
		</faq>
		<faq id="compiling-source">
			<question>How do I compile the source?</question>
			<answer>
				<p>
					You first need to install
					<a href="http://maven.apache.org/">Maven</a>
					After installing run
					"mvn test" which compiles and tests the entire package.
					To build a jar run "mvn package".
				</p>
			</answer>
		</faq>
	</part>

	<part id="elements">
		<title>Elements</title>

		<faq id="element-attributes">
			<question>How do I set the element attributes?</question>
			<answer>
				<p>
					Every element put into the cache has its own set of
					attributes. By default elements are given a copy of
					the default element attributes associated with a
					region. You can also specify the attributes to use
					for an element when you put it in the cache. See
					<a href="ElementAttributes.html">
						Element Attributes
					</a>
					for more information on the attributes that are
					available.
				</p>
			</answer>
		</faq>

		<faq id="element-events">
			<question>How do I register an element event?</question>
			<answer>
				<p>
					Element event handlers must be added to the element
					attributes. See
					<a href="ElementEventHandling.html">
						Element Event Handling
					</a>
					for more information on how to handle element
					events.
				</p>
			</answer>
		</faq>

		<faq id="hierarchical-removal">
			<question>
				Can I remove all items beginning with part of a key?
			</question>
			<answer>
				<p>
					Yes, but it is somewhat expensive, since some of the
					auxiliaries will have to iterate over their keysets.
					Although all the auxiliaries honor this, it is not
					part of the auxiliary API. There is no method along
					the lines of "removeStartingWith", but all the remove
					methods can do it.
				</p>
				<p>
					By default, the hierarchical key delimiter used in
					JCS is a colon. You cannot add a String key that
					ends with a colon. If you call remove with a String
					key that ends in a colon, everything that has a key
					that starts with the argument will be removed.
				</p>
				<p>If your keys are in this format</p>
				<p>TYPE:SOURCE:OBJECT</p>
				<p>
					And you put n objects int he cache with keys like
					this
				</p>
				<p>"ABC:123:0" to "ABC:123:n"</p>
				<p>then you could remove all the obejcts by calling</p>
				<p>jcs.remove( "ABC:123:" );</p>
			</answer>
		</faq>
	</part>

	<part id="indexed-disk-cache">
		<title>Indexed Disk Cache</title>

		<faq id="thread-pool">
			<question>
				How do I limit the number of threads used by the disk
				cache?
			</question>
			<answer>
				<p>
					The indexed disk cache uses an event queue for each
					region. By default these queues are worked by their
					own dedicated threads. Hence, you will have one
					thread per disk cache region. Although the queues
					kill off idle threads, you may want to limit the
					overall number of threads used by the queues. You
					can do this by telling the disk cache to use a
					thread pool. The configuration is described
					<a href="IndexedDiskAuxCache.html">
						on the disk cache configuration page
					</a>
					.
				</p>
			</answer>
		</faq>
	</part>

	<part id="remote-cache-server">
		<title>Remote Cache Server</title>

		<faq id="classes">
			<question>
				Do I need to put my jars in the classpath of the remote
				server?
			</question>
			<answer>
				<p>
					No. The remote server never deserializes your
					classes.
				</p>
			</answer>
		</faq>
	</part>

</faqs>