/**
* Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org>
*
* 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.
*/
package org.onebusaway.api.impl;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.util.Arrays;
import java.util.List;
import org.apache.struts2.rest.handler.ContentTypeHandler;
import org.onebusaway.api.model.ResponseBean;
import org.onebusaway.api.model.transit.EntryWithReferencesBean;
import org.onebusaway.api.model.transit.ListWithReferencesBean;
import org.onebusaway.csv_entities.CsvEntityWriterFactory;
import org.onebusaway.csv_entities.EntityHandler;
public class CustomCsvHandler implements ContentTypeHandler {
@Override
public void toObject(Reader in, Object target) throws IOException {
throw new UnsupportedOperationException();
}
@Override
public String fromObject(Object obj, String resultCode, Writer stream)
throws IOException {
CsvEntityWriterFactory factory = new CsvEntityWriterFactory();
Class<?> entityType = getEntityType(obj);
EntityHandler csvHandler = factory.createWriter(entityType, stream);
List<?> values = getEntityValues(obj);
for (Object value : values)
csvHandler.handleEntity(value);
return null;
}
@Override
public String getContentType() {
return "text/plain";
}
@Override
public String getExtension() {
return "csv";
}
/****
*
****/
private Class<?> getEntityType(Object obj) {
if (obj instanceof ResponseBean) {
ResponseBean response = (ResponseBean) obj;
if (response.getData() == null)
return response.getClass();
return getEntityType(response.getData());
} else if (obj instanceof EntryWithReferencesBean) {
EntryWithReferencesBean<?> entry = (EntryWithReferencesBean<?>) obj;
return entry.getEntry().getClass();
} else if (obj instanceof ListWithReferencesBean) {
ListWithReferencesBean<?> list = (ListWithReferencesBean<?>) obj;
List<?> values = list.getList();
if (values.isEmpty())
return Object.class;
return values.get(0).getClass();
}
return obj.getClass();
}
@SuppressWarnings("unchecked")
private List<?> getEntityValues(Object obj) {
if (obj instanceof ResponseBean) {
ResponseBean response = (ResponseBean) obj;
if (response.getData() == null)
return Arrays.asList(response);
return getEntityValues(response.getData());
} else if (obj instanceof EntryWithReferencesBean) {
EntryWithReferencesBean<?> entry = (EntryWithReferencesBean<?>) obj;
return Arrays.asList(entry.getEntry());
} else if (obj instanceof ListWithReferencesBean) {
ListWithReferencesBean<?> list = (ListWithReferencesBean<?>) obj;
return list.getList();
}
return Arrays.asList(obj);
}
}