/*
* RapidMiner
*
* Copyright (C) 2001-2011 by Rapid-I and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapid-i.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package com.rapidminer.operator.io;
import java.util.List;
import java.util.logging.Level;
import com.rapidminer.operator.Annotations;
import com.rapidminer.operator.IOObject;
import com.rapidminer.operator.OperatorDescription;
import com.rapidminer.operator.OperatorException;
import com.rapidminer.operator.SimpleProcessSetupError;
import com.rapidminer.operator.UserError;
import com.rapidminer.operator.ProcessSetupError.Severity;
import com.rapidminer.operator.ports.metadata.AttributeMetaData;
import com.rapidminer.operator.ports.metadata.ExampleSetMetaData;
import com.rapidminer.operator.ports.metadata.MetaData;
import com.rapidminer.parameter.ParameterType;
import com.rapidminer.parameter.ParameterTypeRepositoryLocation;
import com.rapidminer.parameter.UndefinedParameterError;
import com.rapidminer.repository.Entry;
import com.rapidminer.repository.IOObjectEntry;
import com.rapidminer.repository.RepositoryException;
import com.rapidminer.repository.RepositoryLocation;
/**
*
* @author Sebastian Land
*/
public class RepositorySource extends AbstractReader<IOObject> {
public static final String PARAMETER_REPOSITORY_ENTRY = "repository_entry";
public RepositorySource(OperatorDescription description) {
super(description, IOObject.class);
}
@Override
public MetaData getGeneratedMetaData() throws OperatorException {
IOObjectEntry entry;
try {
entry = getRepositoryEntry();
} catch (RepositoryException e) {
addError(new SimpleProcessSetupError(Severity.WARNING, getPortOwner(), "repository_access_error", getParameterAsRepositoryLocation(PARAMETER_REPOSITORY_ENTRY), e.getMessage()));
return super.getGeneratedMetaData();
} catch (UndefinedParameterError e) {
return super.getGeneratedMetaData();
}
if (entry != null) {
try {
MetaData metaData = entry.retrieveMetaData().clone();
// We reduce the number of nominal values to a limit here to keep meta data transformations fast.
if (metaData instanceof ExampleSetMetaData) {
for (AttributeMetaData amd : ((ExampleSetMetaData) metaData).getAllAttributes()) {
if (amd.isNominal()) {
amd.shrinkValueSet();
}
}
}
return metaData;
} catch (RepositoryException e) {
getLogger().log(Level.INFO, "Error retrieving meta data from "+entry.getLocation() + ": "+e, e);
return super.getGeneratedMetaData();
}
} else {
addError(new SimpleProcessSetupError(Severity.WARNING, getPortOwner(), "repository_location_does_not_exist", getParameterAsRepositoryLocation(PARAMETER_REPOSITORY_ENTRY)));
return super.getGeneratedMetaData();
}
}
private IOObjectEntry getRepositoryEntry() throws RepositoryException, UserError {
RepositoryLocation location = getParameterAsRepositoryLocation(PARAMETER_REPOSITORY_ENTRY);
Entry entry = location.locateEntry();
if (entry == null) {
throw new RepositoryException("Entry '"+location+"' does not exist.");
} else if (entry instanceof IOObjectEntry) {
return (IOObjectEntry)entry;
} else {
throw new RepositoryException("Entry '"+location+"' is not a data entry, but "+entry.getType());
}
}
@Override
public IOObject read() throws OperatorException {
try {
final IOObject data = getRepositoryEntry().retrieveData(null);
data.getAnnotations().setAnnotation(Annotations.KEY_SOURCE, getRepositoryEntry().getLocation().toString());
return data;
} catch (RepositoryException e) {
throw new UserError(this, e, 312, getParameterAsString(PARAMETER_REPOSITORY_ENTRY), e.getMessage());
}
}
@Override
public List<ParameterType> getParameterTypes() {
List<ParameterType> types = super.getParameterTypes();
ParameterTypeRepositoryLocation type = new ParameterTypeRepositoryLocation(PARAMETER_REPOSITORY_ENTRY, "Repository entry.", false);
type.setExpert(false);
types.add(type);
return types;
}
}