blob: 6acad436a6901fc002a1d8bd9ca55003c59310d1 [file] [log] [blame]
package org.apache.samoa.moa.options;
/*
* #%L
* SAMOA
* %%
* Copyright (C) 2014 - 2015 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.
* #L%
*/
import org.apache.samoa.moa.AbstractMOAObject;
import org.apache.samoa.moa.core.ObjectRepository;
import org.apache.samoa.moa.tasks.NullMonitor;
import org.apache.samoa.moa.tasks.TaskMonitor;
import com.github.javacliparser.Options;
/**
* Abstract Option Handler. All classes that have options in MOA extend this class.
*
* @author Richard Kirkby (rkirkby@cs.waikato.ac.nz)
* @version $Revision: 7 $
*/
public abstract class AbstractOptionHandler extends AbstractMOAObject implements
OptionHandler {
private static final long serialVersionUID = 1L;
/** Options to handle */
// protected Options options;
/** Dictionary with option texts and objects */
// protected Map<String, Object> classOptionNamesToPreparedObjects;
@Override
public String getPurposeString() {
return "Anonymous object: purpose undocumented.";
}
@Override
public Options getOptions() {
/*
* if (this.options == null) { this.options = new Options(); if
* (this.config== null) { this.config = new OptionsHandler(this, "");
* this.config.prepareForUse(); } Option[] myOptions =
* this.config.discoverOptionsViaReflection(); for (Option option :
* myOptions) { this.options.addOption(option); } } return this.options;
*/
if (this.config == null) {
this.config = new OptionsHandler(this, "");
// this.config.prepareForUse(monitor, repository);
}
return this.config.getOptions();
}
@Override
public void prepareForUse() {
prepareForUse(new NullMonitor(), null);
}
protected OptionsHandler config;
@Override
public void prepareForUse(TaskMonitor monitor, ObjectRepository repository) {
// prepareClassOptions(monitor, repository);
if (this.config == null) {
this.config = new OptionsHandler(this, "");
this.config.prepareForUse(monitor, repository);
}
prepareForUseImpl(monitor, repository);
}
/**
* This method describes the implementation of how to prepare this object for use. All classes that extends this class
* have to implement <code>prepareForUseImpl</code> and not <code>prepareForUse</code> since
* <code>prepareForUse</code> calls <code>prepareForUseImpl</code>.
*
* @param monitor
* the TaskMonitor to use
* @param repository
* the ObjectRepository to use
*/
protected abstract void prepareForUseImpl(TaskMonitor monitor,
ObjectRepository repository);
@Override
public String getCLICreationString(Class<?> expectedType) {
return ClassOption.stripPackagePrefix(this.getClass().getName(),
expectedType)
+ " " + getOptions().getAsCLIString();
}
@Override
public OptionHandler copy() {
return (OptionHandler) super.copy();
}
/**
* Gets the options of this class via reflection.
*
* @return an array of options
*/
/*
* protected Option[] discoverOptionsViaReflection() { Class<? extends
* AbstractOptionHandler> c = this.getClass(); Field[] fields = c.getFields();
* List<Option> optList = new LinkedList<Option>(); for (Field field : fields)
* { String fName = field.getName(); Class<?> fType = field.getType(); if
* (fType.getName().endsWith("Option")) { if
* (Option.class.isAssignableFrom(fType)) { Option oVal = null; try {
* field.setAccessible(true); oVal = (Option) field.get(this); } catch
* (IllegalAccessException ignored) { // cannot access this field } if (oVal
* != null) { optList.add(oVal); } } } } return optList.toArray(new
* Option[optList.size()]); }
*/
/**
* Prepares the options of this class.
*
* @param monitor
* the TaskMonitor to use
* @param repository
* the ObjectRepository to use
*/
protected void prepareClassOptions(TaskMonitor monitor,
ObjectRepository repository) {
this.config.prepareClassOptions(monitor, repository);
}/*
* this.classOptionNamesToPreparedObjects = null; Option[] optionArray =
* getOptions().getOptionArray(); for (Option option : optionArray) { if
* (option instanceof ClassOption) { ClassOption classOption = (ClassOption)
* option; monitor.setCurrentActivity("Materializing option " +
* classOption.getName() + "...", -1.0); Object optionObj =
* classOption.materializeObject(monitor, repository); if
* (monitor.taskShouldAbort()) { return; } if (optionObj instanceof
* OptionHandler) { monitor.setCurrentActivity("Preparing option " +
* classOption.getName() + "...", -1.0); ((OptionHandler)
* optionObj).prepareForUse(monitor, repository); if
* (monitor.taskShouldAbort()) { return; } } if
* (this.classOptionNamesToPreparedObjects == null) {
* this.classOptionNamesToPreparedObjects = new HashMap<String, Object>(); }
* this.classOptionNamesToPreparedObjects.put(option.getName(), optionObj); }
* } }
*/
/**
* Gets a prepared option of this class.
*
* @param opt
* the class option to get
* @return an option stored in the dictionary
*/
protected Object getPreparedClassOption(ClassOption opt) {
return this.config.getPreparedClassOption(opt);
}
}