diff --git a/config/alfresco/messages/content-model.properties b/config/alfresco/messages/content-model.properties
index 0bdec8371d..8001708c43 100644
--- a/config/alfresco/messages/content-model.properties
+++ b/config/alfresco/messages/content-model.properties
@@ -327,3 +327,9 @@ cm_contentmodel.property.exif_yResolution.description=Vertical resolution in pix
cm_contentmodel.property.exif_resolutionUnit.title=Resolution Unit
cm_contentmodel.property.exif_resolutionUnit.description=Unit used for horizontal and vertical resolution
+cm_contentmodel.aspect.cm_indexControl.title=Index Control
+cm_contentmodel.aspect.cm_indexControl.description=Control Index Behaviour
+cm_contentmodel.property.cm_isIndexed.title=Is Indexed
+cm_contentmodel.property.cm_isIndexed.description=Is the node indexed and can be found via search.
+cm_contentmodel.property.cm_isContentIndexed.title=Is Content Indexed
+cm_contentmodel.property.cm_isContentIndexed.description=Are the node's d:content properties indexed?
diff --git a/config/alfresco/model/contentModel.xml b/config/alfresco/model/contentModel.xml
index 0c0993dc88..90a5e4545d 100644
--- a/config/alfresco/model/contentModel.xml
+++ b/config/alfresco/model/contentModel.xml
@@ -1419,10 +1419,12 @@
Is indexed
d:boolean
+ true
Is content indexed
d:boolean
+ true
diff --git a/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerImpl.java b/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerImpl.java
index 17b85e55b9..7cd3ad2627 100644
--- a/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerImpl.java
+++ b/source/java/org/alfresco/repo/search/impl/lucene/AVMLuceneIndexerImpl.java
@@ -476,16 +476,44 @@ public class AVMLuceneIndexerImpl extends AbstractLuceneIndexerImpl impl
boolean isAtomic = true;
Map properties = getIndexableProperties(desc, nodeRef, endVersion, stringNodeRef);
+
+ if(properties.containsKey(ContentModel.PROP_IS_INDEXED))
+ {
+ Serializable sValue = properties.get(ContentModel.PROP_IS_INDEXED);
+ if(sValue != null)
+ {
+ Boolean isIndexed = DefaultTypeConverter.INSTANCE.convert(Boolean.class, sValue);
+ if((isIndexed != null) && (isIndexed.booleanValue() == false))
+ {
+ return docs;
+ }
+ }
+ }
+
+ boolean isContentIndexedForNode = true;
+ if(properties.containsKey(ContentModel.PROP_IS_CONTENT_INDEXED))
+ {
+ Serializable sValue = properties.get(ContentModel.PROP_IS_CONTENT_INDEXED);
+ if(sValue != null)
+ {
+ Boolean isIndexed = DefaultTypeConverter.INSTANCE.convert(Boolean.class, sValue);
+ if((isIndexed != null) && (isIndexed.booleanValue() == false))
+ {
+ isContentIndexedForNode = false;
+ }
+ }
+ }
+
for (QName propertyName : properties.keySet())
{
Serializable value = properties.get(propertyName);
if (indexAllProperties)
{
- indexProperty(nodeRef, propertyName, value, xdoc, false, properties);
+ indexProperty(nodeRef, propertyName, value, xdoc, false, properties, isContentIndexedForNode);
}
else
{
- isAtomic &= indexProperty(nodeRef, propertyName, value, xdoc, true, properties);
+ isAtomic &= indexProperty(nodeRef, propertyName, value, xdoc, true, properties,isContentIndexedForNode);
}
}
@@ -722,7 +750,7 @@ public class AVMLuceneIndexerImpl extends AbstractLuceneIndexerImpl impl
}
}
- protected boolean indexProperty(NodeRef banana, QName propertyName, Serializable value, Document doc, boolean indexAtomicPropertiesOnly, Map properties)
+ protected boolean indexProperty(NodeRef banana, QName propertyName, Serializable value, Document doc, boolean indexAtomicPropertiesOnly, Map properties, boolean isContentIndexedForNode)
{
String attributeName = "@" + QName.createQName(propertyName.getNamespaceURI(), ISO9075.encode(propertyName.getLocalName()));
@@ -811,119 +839,127 @@ public class AVMLuceneIndexerImpl extends AbstractLuceneIndexerImpl impl
}
doc.add(new Field(attributeName + ".locale", locale.toString().toLowerCase(), Field.Store.NO, Field.Index.UN_TOKENIZED, Field.TermVector.NO));
- ContentReader reader = null;
- try
- {
- reader = contentService.getRawReader(contentData.getContentUrl());
- reader.setEncoding(contentData.getEncoding());
- reader.setLocale(contentData.getLocale());
- reader.setMimetype(contentData.getMimetype());
- }
- catch (Exception e)
- {
- reader = null;
- }
- // ContentReader reader = contentService.getReader(banana, propertyName);
- if (reader != null && reader.exists())
- {
- boolean readerReady = true;
- // transform if necessary (it is not a UTF-8 text document)
- if (!EqualsHelper.nullSafeEquals(reader.getMimetype(), MimetypeMap.MIMETYPE_TEXT_PLAIN) || !EqualsHelper.nullSafeEquals(reader.getEncoding(), "UTF-8"))
- {
- // get the transformer
- ContentTransformer transformer = contentService.getTransformer(reader.getMimetype(), MimetypeMap.MIMETYPE_TEXT_PLAIN);
- // is this transformer good enough?
- if (transformer == null)
- {
- // log it
- if (s_logger.isDebugEnabled())
- {
- s_logger.debug("Not indexed: No transformation: \n" + " source: " + reader + "\n" + " target: " + MimetypeMap.MIMETYPE_TEXT_PLAIN);
- }
- // don't index from the reader
- readerReady = false;
- // not indexed: no transformation
- // doc.add(new Field("TEXT", NOT_INDEXED_NO_TRANSFORMATION, Field.Store.NO,
- // Field.Index.TOKENIZED, Field.TermVector.NO));
- doc.add(new Field(attributeName, NOT_INDEXED_NO_TRANSFORMATION, Field.Store.NO, Field.Index.TOKENIZED, Field.TermVector.NO));
- }
- // else if (indexAtomicPropertiesOnly
- // && transformer.getTransformationTime() > maxAtomicTransformationTime)
- // {
- // only indexing atomic properties
- // indexing will take too long, so push it to the background
- // wereAllAtomic = false;
- // }
- else
- {
- // We have a transformer that is fast enough
- ContentWriter writer = contentService.getTempWriter();
- writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN);
- // this is what the analyzers expect on the stream
- writer.setEncoding("UTF-8");
- try
- {
- transformer.transform(reader, writer);
- // point the reader to the new-written content
- reader = writer.getReader();
- // Check that the reader is a view onto something concrete
- if (!reader.exists())
- {
- throw new ContentIOException("The transformation did not write any content, yet: \n"
- + " transformer: " + transformer + "\n" + " temp writer: " + writer);
- }
- }
- catch (ContentIOException e)
+ if(isContentIndexedForNode)
+ {
+ ContentReader reader = null;
+ try
+ {
+ reader = contentService.getRawReader(contentData.getContentUrl());
+ reader.setEncoding(contentData.getEncoding());
+ reader.setLocale(contentData.getLocale());
+ reader.setMimetype(contentData.getMimetype());
+ }
+ catch (Exception e)
+ {
+ reader = null;
+ }
+ // ContentReader reader = contentService.getReader(banana, propertyName);
+ if (reader != null && reader.exists())
+ {
+ boolean readerReady = true;
+ // transform if necessary (it is not a UTF-8 text document)
+ if (!EqualsHelper.nullSafeEquals(reader.getMimetype(), MimetypeMap.MIMETYPE_TEXT_PLAIN) || !EqualsHelper.nullSafeEquals(reader.getEncoding(), "UTF-8"))
+ {
+ // get the transformer
+ ContentTransformer transformer = contentService.getTransformer(reader.getMimetype(), MimetypeMap.MIMETYPE_TEXT_PLAIN);
+ // is this transformer good enough?
+ if (transformer == null)
{
// log it
if (s_logger.isDebugEnabled())
{
- s_logger.debug("Not indexed: Transformation failed", e);
+ s_logger.debug("Not indexed: No transformation: \n" + " source: " + reader + "\n" + " target: " + MimetypeMap.MIMETYPE_TEXT_PLAIN);
}
// don't index from the reader
readerReady = false;
- // not indexed: transformation
- // failed
- // doc.add(new Field("TEXT", NOT_INDEXED_TRANSFORMATION_FAILED, Field.Store.NO,
+ // not indexed: no transformation
+ // doc.add(new Field("TEXT", NOT_INDEXED_NO_TRANSFORMATION, Field.Store.NO,
// Field.Index.TOKENIZED, Field.TermVector.NO));
- doc.add(new Field(attributeName, NOT_INDEXED_TRANSFORMATION_FAILED, Field.Store.NO, Field.Index.TOKENIZED, Field.TermVector.NO));
+ doc.add(new Field(attributeName, NOT_INDEXED_NO_TRANSFORMATION, Field.Store.NO, Field.Index.TOKENIZED, Field.TermVector.NO));
+ }
+ // else if (indexAtomicPropertiesOnly
+ // && transformer.getTransformationTime() > maxAtomicTransformationTime)
+ // {
+ // only indexing atomic properties
+ // indexing will take too long, so push it to the background
+ // wereAllAtomic = false;
+ // }
+ else
+ {
+ // We have a transformer that is fast enough
+ ContentWriter writer = contentService.getTempWriter();
+ writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN);
+ // this is what the analyzers expect on the stream
+ writer.setEncoding("UTF-8");
+ try
+ {
+
+ transformer.transform(reader, writer);
+ // point the reader to the new-written content
+ reader = writer.getReader();
+ // Check that the reader is a view onto something concrete
+ if (!reader.exists())
+ {
+ throw new ContentIOException("The transformation did not write any content, yet: \n"
+ + " transformer: " + transformer + "\n" + " temp writer: " + writer);
+ }
+ }
+ catch (ContentIOException e)
+ {
+ // log it
+ if (s_logger.isDebugEnabled())
+ {
+ s_logger.debug("Not indexed: Transformation failed", e);
+ }
+ // don't index from the reader
+ readerReady = false;
+ // not indexed: transformation
+ // failed
+ // doc.add(new Field("TEXT", NOT_INDEXED_TRANSFORMATION_FAILED, Field.Store.NO,
+ // Field.Index.TOKENIZED, Field.TermVector.NO));
+ doc.add(new Field(attributeName, NOT_INDEXED_TRANSFORMATION_FAILED, Field.Store.NO, Field.Index.TOKENIZED, Field.TermVector.NO));
+ }
}
}
+ // add the text field using the stream from the
+ // reader, but only if the reader is valid
+ if (readerReady)
+ {
+ InputStreamReader isr = null;
+ InputStream ris = reader.getReader().getContentInputStream();
+ try
+ {
+ isr = new InputStreamReader(ris, "UTF-8");
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ isr = new InputStreamReader(ris);
+ }
+ StringBuilder builder = new StringBuilder();
+ builder.append("\u0000").append(locale.toString()).append("\u0000");
+ StringReader prefix = new StringReader(builder.toString());
+ Reader multiReader = new MultiReader(prefix, isr);
+ doc.add(new Field(attributeName, multiReader, Field.TermVector.NO));
+ }
}
- // add the text field using the stream from the
- // reader, but only if the reader is valid
- if (readerReady)
+ else
+ // URL not present (null reader) or no content at the URL (file missing)
{
- InputStreamReader isr = null;
- InputStream ris = reader.getReader().getContentInputStream();
- try
+ // log it
+ if (s_logger.isDebugEnabled())
{
- isr = new InputStreamReader(ris, "UTF-8");
+ s_logger.debug("Not indexed: Content Missing \n"
+ + " node: " + banana + "\n" + " reader: " + reader + "\n" + " content exists: "
+ + (reader == null ? " --- " : Boolean.toString(reader.exists())));
}
- catch (UnsupportedEncodingException e)
- {
- isr = new InputStreamReader(ris);
- }
- StringBuilder builder = new StringBuilder();
- builder.append("\u0000").append(locale.toString()).append("\u0000");
- StringReader prefix = new StringReader(builder.toString());
- Reader multiReader = new MultiReader(prefix, isr);
- doc.add(new Field(attributeName, multiReader, Field.TermVector.NO));
+ // not indexed: content missing
+ doc.add(new Field(attributeName, NOT_INDEXED_CONTENT_MISSING, Field.Store.NO, Field.Index.TOKENIZED, Field.TermVector.NO));
}
}
else
- // URL not present (null reader) or no content at the URL (file missing)
{
- // log it
- if (s_logger.isDebugEnabled())
- {
- s_logger.debug("Not indexed: Content Missing \n"
- + " node: " + banana + "\n" + " reader: " + reader + "\n" + " content exists: "
- + (reader == null ? " --- " : Boolean.toString(reader.exists())));
- }
- // not indexed: content missing
- doc.add(new Field(attributeName, NOT_INDEXED_CONTENT_MISSING, Field.Store.NO, Field.Index.TOKENIZED, Field.TermVector.NO));
+ return true;
}
}
else
@@ -1871,7 +1907,7 @@ public class AVMLuceneIndexerImpl extends AbstractLuceneIndexerImpl impl
{
indexedDocCount++;
}
-
+
public int getLastIndexedSnapshot(String store)
{
int last = getLastAsynchronousSnapshot(store);
@@ -1886,7 +1922,7 @@ public class AVMLuceneIndexerImpl extends AbstractLuceneIndexerImpl impl
}
return hasIndexBeenCreated(store) ? 0 : -1;
}
-
+
private int getLastSynchronousSnapshot(String store)
{
int answer = getLastSynchronousSnapshot(store, IndexChannel.DELTA);
@@ -2110,7 +2146,7 @@ public class AVMLuceneIndexerImpl extends AbstractLuceneIndexerImpl impl
*/
public void deleteIndex(StoreRef storeRef)
{
- deleteIndex();
-
+ deleteIndex();
+
}
}