package spl; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.UnsupportedEncodingException; import javax.ws.rs.core.MediaType; import javax.xml.bind.JAXB; import org.sciplore.beans.Document; import org.sciplore.deserialize.creator.AuthorBeanCreator; import org.sciplore.deserialize.creator.AuthorsBeanCreator; import org.sciplore.deserialize.creator.DefaultStringCreator; import org.sciplore.deserialize.creator.DocumentBeanCreator; import org.sciplore.deserialize.creator.DocumentsBeanCreator; import org.sciplore.deserialize.creator.ObjectCreator; import org.sciplore.deserialize.creator.TitleBeanCreator; import org.sciplore.deserialize.creator.YearBeanCreator; import org.sciplore.deserialize.reader.ObjectCreatorMapper; import org.sciplore.deserialize.reader.XmlResourceReader; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.multipart.FormDataMultiPart; import com.sun.jersey.multipart.impl.MultiPartWriter; /** * Created by IntelliJ IDEA. * User: Christoph Arbeit * Date: 09.09.2010 * Time: 10:35:20 * To change this template use File | Settings | File Templates. */ public class SplWebClient { private static Client CLIENT; private static WebResource WEBRESOURCE; private static WebResource INTERNETRESOURCE; static{ final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(SplWebClient.class.getClassLoader()); ClientConfig cc = new DefaultClientConfig(); cc.getClasses().add(MultiPartWriter.class); CLIENT = Client.create(cc); CLIENT.setConnectTimeout(1000); CLIENT.setReadTimeout(70000); WEBRESOURCE = CLIENT.resource( "http://api.mr-dlib.org/" ); INTERNETRESOURCE = CLIENT.resource( "http://www.google.com" ); Thread.currentThread().setContextClassLoader(contextClassLoader); } //FIXME: DOCEAR: new address //private static WebResource WEBRESOURCE = CLIENT.resource( "http://localhost:8080/rest/" ); public static Document metadata; public static WebServiceStatus getMetaData(File file){ try{ if(isWebServiceAvailable() == false){ if(isInternetAvailable()){ return WebServiceStatus.WEBSERVICE_DOWN; } else{ return WebServiceStatus.NO_INTERNET; } } if(isWebServiceOutDated()){ return WebServiceStatus.OUTDATED; } if(isMetaDataServiceAvailable() == false){ return WebServiceStatus.UNAVAILABLE; } FileInputStream fin = new FileInputStream(file); byte[] data = new byte[(int)file.length()]; fin.read(data); FormDataMultiPart formDataMultiPart = new FormDataMultiPart(); formDataMultiPart.field("file", data, MediaType.APPLICATION_OCTET_STREAM_TYPE); formDataMultiPart.field("source", "jabref", MediaType.TEXT_PLAIN_TYPE); formDataMultiPart.field("filename", file.getName(), MediaType.TEXT_PLAIN_TYPE); ClientResponse response = WEBRESOURCE.path("documents").type(MediaType.MULTIPART_FORM_DATA_TYPE).post(ClientResponse.class, formDataMultiPart); //System.out.println(response.getEntity(String.class)); if(response.getClientResponseStatus() == ClientResponse.Status.OK && response.hasEntity()){ String entity = response.getEntity(String.class); byte[] bytes = new byte[0]; try { bytes = entity.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { return null; } InputStream is = new ByteArrayInputStream(bytes); if(is != null){ ObjectCreatorMapper resourceMapper = new ObjectCreatorMapper(); ObjectCreator stringCreator = new DefaultStringCreator(); // initialize Mapper resourceMapper.addCreator("documents", new DocumentsBeanCreator()); resourceMapper.addCreator("authors", new AuthorsBeanCreator()); resourceMapper.addCreator("document", new DocumentBeanCreator()); resourceMapper.addCreator("title", new TitleBeanCreator()); resourceMapper.addCreator("year", new YearBeanCreator()); resourceMapper.addCreator("author", new AuthorBeanCreator()); resourceMapper.addCreator("name_first", stringCreator); resourceMapper.addCreator("name_middle", stringCreator); resourceMapper.addCreator("name_last", stringCreator); resourceMapper.addCreator("name_last_prefix", stringCreator); resourceMapper.addCreator("name_last_suffix", stringCreator); // initialize xml reader XmlResourceReader<?> reader = new XmlResourceReader(resourceMapper); // parse given file -> create object tree Document docs = (Document)reader.parse(is); // XmlDocuments documents = JAXB.unmarshal(is, XmlDocuments.class); SplWebClient.metadata = docs; return WebServiceStatus.OK; } else{ return WebServiceStatus.NO_METADATA; } } if(response.getClientResponseStatus() == ClientResponse.Status.SERVICE_UNAVAILABLE){ return WebServiceStatus.UNAVAILABLE; } }catch(Exception e){ System.out.println(Tools.getStackTraceAsString(e)); //Todo logging } return WebServiceStatus.NO_METADATA; } public static boolean isWebServiceOutDated(){ try{ ClientResponse response = WEBRESOURCE.path("service/versioncheck/" + Tools.WEBSERVICE_APP_ID + "/current").get(ClientResponse.class); if(response.getClientResponseStatus() == ClientResponse.Status.OK && response.hasEntity()){ String entity = response.getEntity(String.class); byte[] bytes = entity.getBytes(); InputStream is = new ByteArrayInputStream(bytes); if(is != null){ /*XmlApplication app = JAXB.unmarshal(is, XmlApplication.class); if(app != null){ if(app.getVersion() != null && !app.getVersion().equalsIgnoreCase(Tools.WEBSERVICE_VERSION_SHORT)){ return true; } }*/ } } }catch(Exception e){ //Todo logging } return false; } public static boolean isMetaDataServiceAvailable(){ try{ ClientResponse response = WEBRESOURCE.path("service/metadata/available").get(ClientResponse.class); if(response.getClientResponseStatus() == ClientResponse.Status.OK && response.hasEntity()){ String entity = response.getEntity(String.class); if(entity != null && entity.equalsIgnoreCase("false")){ return false; } } }catch(Exception e){ //Todo logging } return true; } public static boolean isWebServiceAvailable(){ try{ ClientResponse response = WEBRESOURCE.path("service/metadata/available").get(ClientResponse.class); }catch(Exception e){ return false; } return true; } public static boolean isInternetAvailable(){ try{ ClientResponse response = INTERNETRESOURCE.get(ClientResponse.class); }catch(Exception e){ return false; } return true; } public enum WebServiceStatus { OK, NO_METADATA, UNAVAILABLE, OUTDATED, WEBSERVICE_DOWN, NO_INTERNET } }