blob: f9f6227963413daad4917025962b01ed96b14dd5 [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.oodt.cas.filemgr.structs.type;
//JDK imports
import java.util.LinkedList;
//OODT imports
import org.apache.oodt.cas.filemgr.structs.BooleanQueryCriteria;
import org.apache.oodt.cas.filemgr.structs.Query;
import org.apache.oodt.cas.filemgr.structs.QueryCriteria;
import org.apache.oodt.cas.filemgr.structs.RangeQueryCriteria;
import org.apache.oodt.cas.filemgr.structs.TermQueryCriteria;
import org.apache.oodt.cas.filemgr.structs.exceptions.QueryFormulationException;
import org.apache.oodt.cas.metadata.Metadata;
/**
* A Metadata modification class that intercepts all Metadata flowing in and out
* of the Catalog. Allows the Catalog to contain additional Metadata or modified
* Metadata while keeping it invisible to the user. The purpose it to create
* String queriable Metadata so that the Catalog can be queries accurately and
* without extra knowledge required on the user end.
*
* @author bfoster
* @version $Revision$
*
*/
public abstract class TypeHandler {
protected String elementName;
/**
* Sets the Element name that this TypeHandler is responsible for handling
* @param elementName The Element name for this TypeHandler
*/
public void setElementName(String elementName) {
this.elementName = elementName;
}
/**
* Get the Element name that this TypeHandler is responsible for handling
* @return The Element name for this TypeHandler
*/
public String getElementName() {
return this.elementName;
}
/**
* Converts this TypeHandler's element in the given Query into a Query
* with the necessary elements and values so the Catalog can be queried.
*
* NOTE: Original Query is modified . . . the argument query becomes
* equal to the returned query (return of query is a convenience).
*
* @param query Query for which the Catalog Query will be returned
* @return A Query with Catalog element values
* @throws QueryFormulationException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public Query preQueryHandle(Query query) throws QueryFormulationException {
LinkedList<QueryCriteria> qcList = new LinkedList<QueryCriteria>();
for (QueryCriteria qc : query.getCriteria())
qcList.add(this.handleQueryCriteria(qc));
query.setCriteria(qcList);
return query;
}
private QueryCriteria handleQueryCriteria(QueryCriteria qc) throws QueryFormulationException {
if (qc instanceof BooleanQueryCriteria) {
LinkedList<QueryCriteria> qcList = new LinkedList<QueryCriteria>();
for (QueryCriteria criteria : ((BooleanQueryCriteria) qc).getTerms())
qcList.add(this.handleQueryCriteria(criteria));
BooleanQueryCriteria bqc = new BooleanQueryCriteria();
bqc.setOperator(((BooleanQueryCriteria) qc).getOperator());
bqc.setElementName(qc.getElementName());
for (QueryCriteria criteria : qcList)
bqc.addTerm(criteria);
return bqc;
}else if (qc.getElementName().equals(elementName) && qc instanceof TermQueryCriteria) {
return this.handleTermQueryCriteria((TermQueryCriteria) qc);
}else if (qc.getElementName().equals(elementName) && qc instanceof RangeQueryCriteria) {
return this.handleRangeQueryCriteria((RangeQueryCriteria) qc);
}else {
return qc;
}
}
/**
* Handles converting any Catalog metadata element values to their original values.
* Metadata elements can be added, modified, or replaced.
*
* @param metadata The Catalog Metadata
*/
public abstract void postGetMetadataHandle(Metadata metadata);
/**
* Handles converting any metadata element to Catalog element values.
* Metadata elements can be added, modified, or replaced.
*
* @param metadata The Original Metadata
*/
public abstract void preAddMetadataHandle(Metadata metadata);
/**
* Converts the given RangeQueryCriteria into a QueryCriteria with the necessary
* Catalog elements and values to perform the query
*
*
* @param qc
* @return
*/
protected abstract QueryCriteria handleRangeQueryCriteria(RangeQueryCriteria qc);
/**
* Converts the given TermQueryCriteria into a QueryCriteria with the necessary
* Catalog elements and values to perform the query
*
* @param qc
* @return
*/
protected abstract QueryCriteria handleTermQueryCriteria(TermQueryCriteria qc);
}