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 java.io.File; import org.apache.samoa.moa.core.ObjectRepository; import org.apache.samoa.moa.tasks.Task; import org.apache.samoa.moa.tasks.TaskMonitor; import com.github.javacliparser.AbstractOption; import com.github.javacliparser.SerializeUtils; /** * Abstract class option. * * @author Richard Kirkby (rkirkby@cs.waikato.ac.nz) * @version $Revision$ */ public abstract class AbstractClassOption extends AbstractOption { private static final long serialVersionUID = 1L; /** The prefix text to use to indicate file. */ public static final String FILE_PREFIX_STRING = "file:"; /** The prefix text to use to indicate inmem. */ public static final String INMEM_PREFIX_STRING = "inmem:"; /** The current object */ protected Object currentValue; /** The class type */ protected Class<?> requiredType; /** The default command line interface text. */ protected String defaultCLIString; /** The null text. */ protected String nullString; /** * Creates a new instance of an abstract option given its class name, command line interface text, its purpose, its * class type and its default command line interface text. * * @param name * the name of this option * @param cliChar * the command line interface text * @param purpose * the text describing the purpose of this option * @param requiredType * the class type * @param defaultCLIString * the default command line interface text */ public AbstractClassOption(String name, char cliChar, String purpose, Class<?> requiredType, String defaultCLIString) { this(name, cliChar, purpose, requiredType, defaultCLIString, null); } /** * Creates a new instance of an abstract option given its class name, command line interface text, its purpose, its * class type, default command line interface text, and its null text. * * @param name * the name of this option * @param cliChar * the command line interface text * @param purpose * the text describing the purpose of this option * @param requiredType * the class type * @param defaultCLIString * the default command line interface text * @param nullString * the null text */ public AbstractClassOption(String name, char cliChar, String purpose, Class<?> requiredType, String defaultCLIString, String nullString) { super(name, cliChar, purpose); this.requiredType = requiredType; this.defaultCLIString = defaultCLIString; this.nullString = nullString; resetToDefault(); } /** * Sets current object. * * @param obj * the object to set as current. */ public void setCurrentObject(Object obj) { if (((obj == null) && (this.nullString != null)) || this.requiredType.isInstance(obj) || (obj instanceof String) || (obj instanceof File) || ((obj instanceof Task) && this.requiredType.isAssignableFrom(((Task) obj).getTaskResultType()))) { this.currentValue = obj; } else { throw new IllegalArgumentException("Object not of required type."); } } /** * Returns the current object. * * @return the current object */ public Object getPreMaterializedObject() { return this.currentValue; } /** * Gets the class type of this option. * * @return the class type of this option */ public Class<?> getRequiredType() { return this.requiredType; } /** * Gets the null string of this option. * * @return the null string of this option */ public String getNullString() { return this.nullString; } /** * Gets a materialized object of this option. * * @param monitor * the task monitor to use * @param repository * the object repository to use * @return the materialized object */ public Object materializeObject(TaskMonitor monitor, ObjectRepository repository) { if ((this.currentValue == null) || this.requiredType.isInstance(this.currentValue)) { return this.currentValue; } else if (this.currentValue instanceof String) { if (repository != null) { Object inmemObj = repository.getObjectNamed((String) this.currentValue); if (inmemObj == null) { throw new RuntimeException("No object named " + this.currentValue + " found in repository."); } return inmemObj; } throw new RuntimeException("No object repository available."); } else if (this.currentValue instanceof Task) { Task task = (Task) this.currentValue; Object result = task.doTask(monitor, repository); return result; } else if (this.currentValue instanceof File) { File inputFile = (File) this.currentValue; Object result = null; try { result = SerializeUtils.readFromFile(inputFile); } catch (Exception ex) { throw new RuntimeException("Problem loading " + this.requiredType.getName() + " object from file '" + inputFile.getName() + "':\n" + ex.getMessage(), ex); } return result; } else { throw new RuntimeException( "Could not materialize object of required type " + this.requiredType.getName() + ", found " + this.currentValue.getClass().getName() + " instead."); } } @Override public String getDefaultCLIString() { return this.defaultCLIString; } /** * Gets the command line interface text of the class. * * @param aClass * the class * @param requiredType * the class type * @return the command line interface text of the class */ public static String classToCLIString(Class<?> aClass, Class<?> requiredType) { String className = aClass.getName(); String packageName = requiredType.getPackage().getName(); if (className.startsWith(packageName)) { // cut off package name className = className.substring(packageName.length() + 1, className.length()); } else if (Task.class.isAssignableFrom(aClass)) { packageName = Task.class.getPackage().getName(); if (className.startsWith(packageName)) { // cut off task package name className = className.substring(packageName.length() + 1, className.length()); } } return className; } @Override public abstract String getValueAsCLIString(); @Override public abstract void setValueViaCLIString(String s); // @Override // public abstract JComponent getEditComponent(); /** * Gets the class name without its package name prefix. * * @param className * the name of the class * @param expectedType * the type of the class * @return the class name without its package name prefix */ public static String stripPackagePrefix(String className, Class<?> expectedType) { if (className.startsWith(expectedType.getPackage().getName())) { return className.substring(expectedType.getPackage().getName().length() + 1); } return className; } }