From 9a0d90a4b45054866a784300080d39ee929e7e8b Mon Sep 17 00:00:00 2001 From: Brian Rosenberger Date: Wed, 22 Aug 2018 08:44:57 +0000 Subject: [PATCH] Moving OA Soap Wrapper into current trunk version git-svn-id: https://brutex.net/svn/xservices/trunk@190 e7e49efb-446e-492e-b9ec-fcafc1997a86 --- .../ws/impl/OpenAirProxyServiceImpl.java | 494 ++++++++++++++++++ 1 file changed, 494 insertions(+) create mode 100644 src/java/net/brutex/xservices/ws/impl/OpenAirProxyServiceImpl.java diff --git a/src/java/net/brutex/xservices/ws/impl/OpenAirProxyServiceImpl.java b/src/java/net/brutex/xservices/ws/impl/OpenAirProxyServiceImpl.java new file mode 100644 index 0000000..3ea6a09 --- /dev/null +++ b/src/java/net/brutex/xservices/ws/impl/OpenAirProxyServiceImpl.java @@ -0,0 +1,494 @@ +/* + * Copyright 2017 Brian Rosenberger (Brutex Network) + * + * 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 net.brutex.xservices.ws.impl; + +import java.net.URL; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.GregorianCalendar; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.activation.DataHandler; +import javax.jws.WebParam; +import javax.jws.WebService; + +import org.apache.commons.configuration.ConfigurationException; +import org.apache.commons.configuration.PropertiesConfiguration; +import org.apache.commons.jcs.JCS; +import org.apache.commons.jcs.access.exception.CacheException; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import net.brutex.DocBuilder.DocBuilder; +import net.brutex.mgmt.api.generator.JITCompiler; +import net.brutex.mgmt.api.xml.AnyEntity; +import net.brutex.mgmt.api.xml.Customer; +import net.brutex.mgmt.api.xml.DateFilter; +import net.brutex.mgmt.api.xml.Project; +import net.brutex.mgmt.api.xml.Query; +import net.brutex.mgmt.api.xml.Query.BOOL; +import net.brutex.mgmt.api.xml.QueryEntity; +import net.brutex.mgmt.api.xml.StringEntity; +import net.brutex.mgmt.api.xml.TimesheetEntry; +import net.brutex.mgmt.api.xml.TimesheetFilter; +import net.brutex.mgmt.api.xml.User; +import net.brutex.mgmt.openair.OpenAirRestConnection; +import net.brutex.xservices.types.ant.AttachmentType; +import net.brutex.xservices.util.BrutexNamespaces; +import net.brutex.xservices.ws.OpenAirProxyService; +import net.brutex.xservices.ws.XServicesFault; + +/** + * @author Brian Rosenberger + * + */ +@WebService(targetNamespace = BrutexNamespaces.WS_XSERVICES, endpointInterface = "net.brutex.xservices.ws.OpenAirProxyService", serviceName = OpenAirProxyService.SERVICE_NAME) +public class OpenAirProxyServiceImpl implements OpenAirProxyService { + + /* + * Log4j2 Set Up + */ + private final Logger logger = LogManager.getLogger(OpenAirProxyServiceImpl.class); + + /* + * (non-Javadoc) + * + * @see + * net.brutex.xservices.ws.OpenAirProxyService#getTimeEntryList(java.lang. + * String) + */ + + @Override + public List getTimeEntryList(int oa_projectid, int oa_customerid, int oa_userid, + GregorianCalendar startdate, GregorianCalendar enddate, boolean includeNonBillable, List filter) throws XServicesFault { + return getTimeEntries(oa_projectid, oa_customerid, oa_userid, startdate, enddate, includeNonBillable, filter); + } + + + private List getTimeEntries(final int oa_projectid, final int oa_customerid, final int oa_userid, + final GregorianCalendar fromDate, final GregorianCalendar toDate, final boolean includeNonBillable, List filter) + throws XServicesFault { + + List resultlist = new ArrayList(); + + if( filter != null && filter.size()>0) { + for( TimesheetFilter.TimesheetFilterType f : filter) { + resultlist.addAll( + getTimeEntriesRAW(oa_projectid, oa_customerid, oa_userid, fromDate, toDate, includeNonBillable, f) + ); + } + } else { + resultlist = getTimeEntriesRAW(oa_projectid, oa_customerid, oa_userid, fromDate, toDate, includeNonBillable, null); + } + return resultlist; + } + + + + + private List getTimeEntriesRAW(final int oa_projectid, final int oa_customerid, final int oa_userid, + final GregorianCalendar fromDate, final GregorianCalendar toDate, final boolean includeNonBillable, TimesheetFilter.TimesheetFilterType filter) + throws XServicesFault { + + final OpenAirRestConnection con = getOpenAirConnection(); + if (con == null) { + throw new XServicesFault("Could not establish Open Air connection."); + } + + Query query = new Query(TimesheetEntry.class); + + if (oa_projectid > 0) { + query.addQuery(new QueryEntity("projectid", new StringEntity(String.valueOf(oa_projectid))), BOOL.AND); + } + + if (oa_customerid > 0) { + query.addQuery(new QueryEntity("customerid", new StringEntity(String.valueOf(oa_customerid))), BOOL.AND); + } + + if (oa_userid > 0) { + query.addQuery(new QueryEntity("userid", new StringEntity(String.valueOf(oa_userid))), BOOL.AND); + } + + if (fromDate != null) { + //adjust + fromDate.add(GregorianCalendar.DAY_OF_MONTH, -1); + DateFilter date = new DateFilter("date"); + date.setStartdate(fromDate); + if (toDate != null) { + toDate.add(GregorianCalendar.DAY_OF_MONTH, 1); + date.setEnddate(toDate); + } + query.addFilter(date); + } + + if (filter != null) { + query.addFilter(new TimesheetFilter(filter)); + } + + + List timesheets = (List) con.getEntitiesByQuery(query); + if (!includeNonBillable) + timesheets = filterBillableOnly(timesheets); + return timesheets; + + /* + * Query q = new Query(Project.class); + * + * //QueryEntity qe = new QueryEntity("Portfolio__c", new + * StringEntity("Serena")); QueryEntity qe = new QueryEntity("id", new + * StringEntity("19738")); //DWP Bank QueryEntity qe2 = new + * QueryEntity("id", new StringEntity("19737")); //PNW //QueryEntity qe2 + * = new QueryEntity("customer_name", new StringEntity( + * "Gerencia Informatica Seguridad Social (GISS)")); + * + * q.addQuery(qe, Query.BOOL.OR); q.addQuery(qe2, Query.BOOL.OR); + * + * List list = (List) con.getEntitiesByQuery(q, true); + * + * /*for (Project p : list) { + * Logger.getLogger("TestMain").debug(p.getName()); + * System.out.println(p.toString()); } + */ + // User user = con.getUserByLogin("brosenberger"); + + // System.out.println(user.toString()); + } + + @Override + public AttachmentType getExcelTimesheet(int oa_projectid, int oa_customerid, int oa_userid, + GregorianCalendar startdate, GregorianCalendar enddate, boolean includeNonBillable, List filter, AttachmentType template) + throws XServicesFault { + + List list = getTimeEntries(oa_projectid, oa_customerid, oa_userid, startdate, enddate, + includeNonBillable, filter); + AttachmentType t = getExcelTimesheet2(list, includeNonBillable, template); + + /* + * Try to set a time sheet name: + * SignOff - - .xlxs + * + */ + String filename = "SignOff"; + if(startdate!=null) { + filename += "_"; + filename += startdate.toZonedDateTime() + .format( DateTimeFormatter.ofPattern( "uuuu-MM-dd" ) ); + } + if(enddate!=null) { + filename += "-"; + filename += enddate.toZonedDateTime() + .format( DateTimeFormatter.ofPattern( "uuuu-MM-dd" ) ); + } + if(oa_projectid > 0) { + //Project spezifiziert + filename += "_"; + if(list.size()>0) { + TimesheetEntry anyentry = list.get(0); + filename += anyentry.getProject().getName(); + } else { + filename +="Emtpy"; + } + } else { + //Mehrere Projekte, gibt es vielleicht nur eins? + int i = 0; + Set namen = new HashSet(); + for (TimesheetEntry entry : list) { + namen.add( entry.getProject().getId() ); + } + if(namen.size()>1) { + filename += "_Multiple_Projects"; + } else { + if(list.size()>0) { + TimesheetEntry anyentry = list.get(0); + filename += anyentry.getProject().getName(); + } else { + filename +="_Emtpy"; + } + } + } + //Username + if(oa_userid>0) { + filename += "_"; + if(list.size()>0) { + TimesheetEntry anyentry = list.get(0); + filename += anyentry.getUser().getName(); + } + } + + filename = filename.replace(" ","_"); + filename = filename.replaceAll("[^A-Za-z0-9_\\-]", ""); + filename += ".xlsx"; + t.setFilename(filename); + + return t; + } + + @Override + public AttachmentType getExcelTimesheet2(List entries, boolean includeNonBillable, + AttachmentType templatefile) throws XServicesFault { + DocBuilder builder = new DocBuilder(); + DataHandler dh; + if (templatefile != null) { + dh = builder.createTimesheet(entries, templatefile.getContent()); + } else { + dh = builder.createTimesheet(entries, null); + } + AttachmentType t = new AttachmentType(); + t.setContent(dh); + + t.setFilename("timesheet.xlsx"); + return t; + } + + @Override + public List getProjectsByExternalId(String externalid) throws XServicesFault { + + final OpenAirRestConnection con = getOpenAirConnection(); + if (con == null) { + throw new XServicesFault("Could not establish Open Air connection."); + } + + Query query = new Query(Project.class); + + if (externalid.length() > 0) { + query.addQuery(new QueryEntity("externalid", new StringEntity(externalid)), BOOL.AND); + } + + List projects = (List) con.getEntitiesByQuery(query); + + return projects; + } + + /* + * (non-Javadoc) + * + * @see + * net.brutex.xservices.ws.OpenAirProxyService#getProjectsByOppId(java.lang. + * String) + */ + @Override + public List getProjectsByOppId(String oppid) throws XServicesFault { + final OpenAirRestConnection con = getOpenAirConnection(); + if (con == null) { + throw new XServicesFault("Could not establish Open Air connection."); + } + + Query query = new Query(Project.class); + + if (oppid.length() > 0) { + query.addQuery(new QueryEntity("opportunity_num__c", new StringEntity(oppid)), BOOL.OR); + query.addQuery(new QueryEntity("SAP_Oracle_Number__c", new StringEntity(oppid)), BOOL.OR); + } + + List projects = (List) con.getEntitiesByQuery(query); + + return projects; + } + + @Override + public Customer getCustomerById(int customerid) throws XServicesFault { + final OpenAirRestConnection con = getOpenAirConnection(); + if (con == null) { + throw new XServicesFault("Could not establish Open Air connection."); + } + + Query query = new Query(Customer.class); + + if (customerid > 0) { + query.addQuery(new QueryEntity("id", new StringEntity(String.valueOf(customerid))), BOOL.AND); + } + + List customer = (List) con.getEntitiesByQuery(query); + + if (customer.isEmpty()) { + return null; + } else { + return customer.get(0); + } + } + + + + /* (non-Javadoc) + * @see net.brutex.xservices.ws.OpenAirProxyService#getUpdatedCustomer(java.util.GregorianCalendar) + */ + @Override + public List getUpdatedCustomer(GregorianCalendar date, int offset) throws XServicesFault { + + final OpenAirRestConnection con = getOpenAirConnection(); + if (con == null) { + throw new XServicesFault("Could not establish Open Air connection."); + } + + Query query = new Query(Customer.class); + //query.addQuery("Address_Country", new StringEntity(search), BOOL.AND); + query.addQuery("active", new StringEntity("1"), BOOL.AND); + + DateFilter datefilter = new DateFilter("updated"); + date.add(GregorianCalendar.MINUTE, -1*offset); + datefilter.setStartdate(date); + query.addFilter(datefilter); + + List customer = (List) con.getEntitiesByQuery(query); + + if (customer.isEmpty()) { + return null; + } else { + return customer; + } + } + + + @Override + public List getUpdatedProjects(GregorianCalendar date, int offset) throws XServicesFault { + + final OpenAirRestConnection con = getOpenAirConnection(); + if (con == null) { + throw new XServicesFault("Could not establish Open Air connection."); + } + + Query query = new Query(Project.class); + //query.addQuery("Address_Country", new StringEntity(search), BOOL.AND); + query.addQuery("Stage", new StringEntity("3"), BOOL.AND); + + DateFilter datefilter = new DateFilter("updated"); + date.add(GregorianCalendar.MINUTE, -1*offset); + datefilter.setStartdate(date); + query.addFilter(datefilter); + + List project = (List) con.getEntitiesByQuery(query); + + if (project.isEmpty()) { + return null; + } else { + return project; + } + } + + @Override + public User getUserById(int userid) throws XServicesFault { + Query query = new Query(User.class); + if (userid > 0) { + query.addQuery(new QueryEntity("id", new StringEntity(String.valueOf(userid))), BOOL.AND); + } else { + return null; + } + return getUserByQuery(query); + } + + + @Override + public User getUserByUsername(String username) throws XServicesFault { + Query query = new Query(User.class); + query.addQuery(new QueryEntity("nickname", new StringEntity(username)), BOOL.AND); + return getUserByQuery(query); + } + + + @Override + public List getAnyObject(String objecttype, List queries) throws XServicesFault { + JITCompiler.load(); + final OpenAirRestConnection con = getOpenAirConnection(); + if (con == null) { + throw new XServicesFault("Could not establish Open Air connection."); + } + Class clazz; + try { + Class.forName("net.brutex.mgmt.api.xml.EntityType"); + Class.forName("net.brutex.mgmt.api.xml.AbstractEntity"); + clazz = Class.forName("net.brutex.mgmt.api.xml."+objecttype); + } catch (ClassNotFoundException ex ) { + throw new XServicesFault(ex); + } + Query query = new Query(clazz); + + for(QueryParameter p : queries) { + query.addQuery(new QueryEntity(p.field, new StringEntity(p.value)), BOOL.AND); + } + + List anyentity = (List) con.getEntitiesByQuery(query); + + if (anyentity.isEmpty()) { + return null; + } else { + return anyentity; + } + } + + private User getUserByQuery(Query query) throws XServicesFault { + final OpenAirRestConnection con = getOpenAirConnection(); + if (con == null) { + throw new XServicesFault("Could not establish Open Air connection."); + } + User user = (User) con.getSingleEntityByQuery(query); + return user; + } + + + + List filterBillableOnly(List timesheets) { + List list = new ArrayList(); + for (TimesheetEntry entry : timesheets) { + if (entry.getProjecttask().isBillable()) { + list.add(entry); + } + } + return list; + } + + private OpenAirRestConnection getOpenAirConnection() { + + /* + * get details from configuration file + */ + final PropertiesConfiguration props; + try { + final String config = "../openair.properties"; + logger.debug("Loading Open Air connection details from " + this.getClass().getClassLoader().getResource("/") + + config); + + final URL configloc = this.getClass().getClassLoader().getResource(config); + + props = new PropertiesConfiguration(configloc); + final String user = props.getString("user"); + final String password = props.getString("password"); + final String company = props.getString("company"); + final String apikey = props.getString("apikey", "_PUT_HERE_"); + final String namespace = props.getString("namespace"); + + final OpenAirRestConnection con; + + con = new OpenAirRestConnection(JCS.getInstance("OACache"), company, user, password); + return con; + } catch (CacheException e) { + logger.error(e); + e.printStackTrace(); + } catch (ConfigurationException e) { + logger.error(e); + e.printStackTrace(); + } finally { + + } + return null; + } + + + + + +}