Changeset 797

Show
Ignore:
Timestamp:
01/23/09 15:17:10 (4 years ago)
Author:
anthony
Message:

improvements to some of the way bulk upload handles missing samples/subsamples
return back the column number and column data to the client (the display needs work)

Location:
trunk
Files:
11 modified

Legend:

Unmodified
Added
Removed
  • trunk/mpdb-client/src/edu/rpi/metpetdb/client/ui/bulk/upload/BulkUploadPanel.java

    r794 r797  
    3030 
    3131import edu.rpi.metpetdb.client.error.LoginRequiredException; 
    32 import edu.rpi.metpetdb.client.error.MpDbException; 
    3332import edu.rpi.metpetdb.client.locale.LocaleEntity; 
    3433import edu.rpi.metpetdb.client.locale.LocaleHandler; 
     
    445444                final Iterator<BulkUploadError> itr = exceptions.iterator(); 
    446445                while(itr.hasNext()) { 
    447                         text += "<span>" + itr.next().getException().format() + "</span> "; 
     446                        final BulkUploadError err = itr.next(); 
     447                        text += "<span>Column:" + err.getColumn() + "</span>"; 
     448                        text += "<span>Cell Data:" + err.getCellData() + "</span>"; 
     449                        text += "<span>Error Message:" + err.getException().format() + "</span>"; 
    448450                } 
    449451                return text; 
  • trunk/mpdb-common/src/edu/rpi/metpetdb/client/model/bulk/upload/BulkUploadError.java

    r741 r797  
    1010        private int row; 
    1111        private int column; 
     12        private String cellData; 
    1213 
    1314        public BulkUploadError() { 
     
    1516        } 
    1617         
    17         public BulkUploadError(final int row, final int column, final MpDbException e) { 
     18        public BulkUploadError(final int row, final int column, final MpDbException e, final String cellData) { 
    1819                this.row = row; 
    1920                this.column = column; 
    2021                this.exception = e; 
     22                this.cellData = cellData; 
    2123        } 
    2224 
     
    4547        } 
    4648 
     49        public String getCellData() { 
     50                return cellData; 
     51        } 
     52 
     53        public void setCellData(String cellData) { 
     54                this.cellData = cellData; 
     55        } 
    4756} 
  • trunk/mpdb-common/src/edu/rpi/metpetdb/client/model/bulk/upload/BulkUploadResult.java

    r742 r797  
    11package edu.rpi.metpetdb.client.model.bulk.upload; 
    22 
     3import java.sql.Date; 
    34import java.util.ArrayList; 
    45import java.util.HashMap; 
     
    1213public class BulkUploadResult implements IsSerializable { 
    1314 
     15        private Date timeTaken; 
    1416        private Map<Integer, BulkUploadHeader> headers; 
    1517        //maps row numbers to a list of exceptions 
     
    2628         
    2729        public void addError(final int rowNumber, final MpDbException e) { 
    28                 addError(rowNumber, -1, e); 
     30                addError(rowNumber, -1, "", e); 
    2931        } 
    3032         
    31         public void addError(final int rowNumber, final int colNumber, final MpDbException e) { 
     33        public void addError(final int rowNumber, final int colNumber, final String cellData, final MpDbException e) { 
    3234                final BulkUploadError buError = new BulkUploadError(); 
    3335                buError.setRow(rowNumber); 
    3436                buError.setColumn(colNumber); 
    3537                buError.setException(e); 
     38                buError.setCellData(cellData); 
    3639                if (!errors.containsKey(rowNumber)) 
    3740                        errors.put(rowNumber, new ArrayList<BulkUploadError>()); 
     
    4043 
    4144        public Map<Integer,BulkUploadHeader> getHeaders() { 
     45                if (headers  == null) 
     46                        headers = new HashMap<Integer, BulkUploadHeader>(); 
    4247                return headers; 
    4348        } 
     
    6065        } 
    6166 
     67        public Date getTimeTaken() { 
     68                return timeTaken; 
     69        } 
     70 
     71        public void setTimeTaken(Date timeTaken) { 
     72                this.timeTaken = timeTaken; 
     73        } 
     74 
    6275         
    6376} 
  • trunk/mpdb-common/src/edu/rpi/metpetdb/client/service/bulk/upload/BulkUploadService.java

    r741 r797  
    33import com.google.gwt.user.client.rpc.RemoteService; 
    44 
     5import edu.rpi.metpetdb.client.error.DAOException; 
    56import edu.rpi.metpetdb.client.error.InvalidFormatException; 
    67import edu.rpi.metpetdb.client.error.LoginRequiredException; 
     
    1011public interface BulkUploadService extends RemoteService { 
    1112        BulkUploadResult parser(final String fileOnServer, boolean save) 
    12                         throws InvalidFormatException, LoginRequiredException; 
     13                        throws InvalidFormatException, LoginRequiredException, DAOException; 
    1314} 
  • trunk/mpdb-server/src/edu/rpi/metpetdb/server/MpDbServlet.java

    r796 r797  
    5252import edu.rpi.metpetdb.server.dao.impl.MineralDAO; 
    5353import edu.rpi.metpetdb.server.dao.impl.OxideDAO; 
     54import edu.rpi.metpetdb.server.dao.impl.UserDAO; 
    5455import edu.rpi.metpetdb.server.impl.ImageServiceImpl; 
    5556import edu.rpi.metpetdb.server.security.Action; 
     
    140141                DataStore.initFactory(); 
    141142                doc = DataStore.getInstance().getDatabaseObjectConstraints(); 
     143                if (doc == null) { 
     144                        throw new RuntimeException("Unable to get constraints, check the tomct logs"); 
     145                } 
    142146                oc = DataStore.getInstance().getObjectConstraints(); 
    143147 
     
    241245         *             invalid. 
    242246         */ 
    243         protected int currentUser() throws LoginRequiredException { 
     247        protected int currentUserId() throws LoginRequiredException { 
    244248                if (autoLoginId != -1) { 
    245249                        System.out.println("using autologin id of " + autoLoginId); 
     
    269273        } 
    270274 
     275        protected User currentUser() throws LoginRequiredException, DAOException { 
     276                if (currentReq() != null) 
     277                        return currentReq().currentUser(currentUserId()); 
     278                else 
     279                        throw new LoginRequiredException(); 
     280        } 
     281 
    271282        /** 
    272283         * Obtain a session for the current thread. 
     
    400411        } 
    401412 
    402         public SearchSample getLastSearchedSearchSample(){ 
    403                 return (SearchSample) this.getThreadLocalRequest().getSession().getAttribute("lastSearchSamp"); 
    404         } 
    405  
    406         public void setLastSearchedSearchSample(final SearchSample searchSamp){ 
    407                 this.getThreadLocalRequest().getSession().setAttribute("lastSearchSamp", searchSamp); 
    408         } 
    409          
    410         public PaginationParameters getLastSearchPagination(){ 
    411                 return (PaginationParameters) this.getThreadLocalRequest().getSession().getAttribute("lastSearchPagination"); 
    412         } 
    413  
    414         public void setLastSearchPagination(final PaginationParameters p){ 
    415                 this.getThreadLocalRequest().getSession().setAttribute("lastSearchPagination", p); 
    416         } 
    417          
     413        public SearchSample getLastSearchedSearchSample() { 
     414                return (SearchSample) this.getThreadLocalRequest().getSession() 
     415                                .getAttribute("lastSearchSamp"); 
     416        } 
     417 
     418        public void setLastSearchedSearchSample(final SearchSample searchSamp) { 
     419                this.getThreadLocalRequest().getSession().setAttribute( 
     420                                "lastSearchSamp", searchSamp); 
     421        } 
     422 
     423        public PaginationParameters getLastSearchPagination() { 
     424                return (PaginationParameters) this.getThreadLocalRequest().getSession() 
     425                                .getAttribute("lastSearchPagination"); 
     426        } 
     427 
     428        public void setLastSearchPagination(final PaginationParameters p) { 
     429                this.getThreadLocalRequest().getSession().setAttribute( 
     430                                "lastSearchPagination", p); 
     431        } 
     432 
    418433        public static final class Req { 
    419434                Session session; 
    420435                Integer userId; 
     436                User user; 
    421437                public Action action; 
    422438                public Collection<Principal> principals; 
     439 
     440                User currentUser(int userId) throws DAOException { 
     441                        if (user == null) { 
     442                                user = new User(); 
     443                                user.setId(userId); 
     444                                user = new UserDAO(currentSession()).fill(user); 
     445                        } 
     446                        return user; 
     447                } 
    423448 
    424449                Session currentSession() { 
  • trunk/mpdb-server/src/edu/rpi/metpetdb/server/bulk/upload/NewParser.java

    r787 r797  
    216216                NewParser.oxides = oxides; 
    217217        } 
    218          
     218 
    219219        public static void setImageTypes(final Collection<ImageType> imageTypes) { 
    220220                NewParser.imageTypes = imageTypes; 
     
    297297                                                                                parseDate(objectWithDate, data); 
    298298                                                                        } catch (final ValidationException ve) { 
    299                                                                                 errors 
    300                                                                                                 .put(rowindex, 
    301                                                                                                                 new BulkUploadError( 
    302                                                                                                                                 rowindex + 1, 
    303                                                                                                                                 i + 1, ve)); 
     299                                                                                errors.put(rowindex, 
     300                                                                                                new BulkUploadError( 
     301                                                                                                                rowindex + 1, i + 1, 
     302                                                                                                                ve, data)); 
    304303                                                                        } 
    305304                                                                } 
     
    335334                        } catch (MpDbException e) { 
    336335                                errors.put(rowindex + 1, new BulkUploadError(rowindex + 1, 
    337                                                 i + 1, e)); 
     336                                                i + 1, e, cell.toString())); 
    338337                        } catch (NumberFormatException e) { 
    339338                                // TODO maybe handle specially? 
    340339                                errors.put(rowindex + 1, new BulkUploadError(rowindex + 1, 
    341                                                 i + 1, new GenericDAOException(e.getMessage()))); 
     340                                                i + 1, new GenericDAOException(e.getMessage()), cell 
     341                                                                .toString())); 
    342342                        } catch (Exception e) { 
    343343                                errors.put(rowindex + 1, new BulkUploadError(rowindex + 1, 
    344                                                 i + 1, new GenericDAOException(e.getMessage()))); 
     344                                                i + 1, new GenericDAOException(e.getMessage()), cell 
     345                                                                .toString())); 
    345346                        } 
    346347                } 
  • trunk/mpdb-server/src/edu/rpi/metpetdb/server/impl/UserServiceImpl.java

    r796 r797  
    100100                try { 
    101101                        User u = new User(); 
    102                         u.setId(currentUser()); 
     102                        u.setId(currentUserId()); 
    103103                        u = (new UserDAO(this.currentSession())).fill(u); 
    104104                        r.user = (User) clone(u); 
     
    114114                        LoginRequiredException { 
    115115                User u = new User(); 
    116                 u.setId(currentUser()); 
     116                u.setId(currentUserId()); 
    117117                u = (new UserDAO(this.currentSession())).fill(u); 
    118118                return (u); 
     
    168168                final UserDAO uDAO = new UserDAO(this.currentSession()); 
    169169                final User User = uwp.getUser(); 
    170                 if (User.getId() != currentUser()) 
     170                if (User.getId() != currentUserId()) 
    171171                        throw new GenericDAOException("Administrators are not supported!"); 
    172172 
     
    202202                        LoginRequiredException { 
    203203                User u = new User(); 
    204                 u.setId(currentUser()); 
     204                u.setId(currentUserId()); 
    205205                final UserDAO ud = new UserDAO(this.currentSession()); 
    206206                u = (ud).fill(u); 
  • trunk/mpdb-server/src/edu/rpi/metpetdb/server/impl/bulk/upload/BulkUploadChemicalAnalysesServiceImpl.java

    r775 r797  
    22 
    33import java.io.FileInputStream; 
    4 import java.io.IOException; 
     4import java.io.FileNotFoundException; 
    55import java.util.Collection; 
    6 import java.util.HashMap; 
    7 import java.util.HashSet; 
    86import java.util.Iterator; 
    97import java.util.Map; 
    10 import java.util.Set; 
    118 
    12 import org.hibernate.HibernateException; 
    13 import org.hibernate.exception.GenericJDBCException; 
    14  
    15 import edu.rpi.metpetdb.client.error.DAOException; 
    16 import edu.rpi.metpetdb.client.error.InvalidFormatException; 
    179import edu.rpi.metpetdb.client.error.LoginRequiredException; 
    1810import edu.rpi.metpetdb.client.error.MpDbException; 
    19 import edu.rpi.metpetdb.client.error.ValidationException; 
    20 import edu.rpi.metpetdb.client.error.dao.GenericDAOException; 
    2111import edu.rpi.metpetdb.client.error.validation.PropertyRequiredException; 
    2212import edu.rpi.metpetdb.client.model.ChemicalAnalysis; 
    2313import edu.rpi.metpetdb.client.model.Sample; 
    2414import edu.rpi.metpetdb.client.model.Subsample; 
    25 import edu.rpi.metpetdb.client.model.User; 
    26 import edu.rpi.metpetdb.client.model.bulk.upload.BulkUploadError; 
    2715import edu.rpi.metpetdb.client.model.bulk.upload.BulkUploadResult; 
    2816import edu.rpi.metpetdb.client.model.bulk.upload.BulkUploadResultCount; 
    2917import edu.rpi.metpetdb.client.service.bulk.upload.BulkUploadChemicalAnalysesService; 
    3018import edu.rpi.metpetdb.server.MpDbServlet; 
    31 import edu.rpi.metpetdb.server.bulk.upload.AnalysisParser; 
    3219import edu.rpi.metpetdb.server.bulk.upload.NewAnalysisParser; 
    3320import edu.rpi.metpetdb.server.dao.impl.ChemicalAnalysisDAO; 
    3421import edu.rpi.metpetdb.server.dao.impl.SampleDAO; 
    3522import edu.rpi.metpetdb.server.dao.impl.SubsampleDAO; 
    36 import edu.rpi.metpetdb.server.dao.impl.UserDAO; 
    3723 
    3824public class BulkUploadChemicalAnalysesServiceImpl extends BulkUploadService 
     
    4127        public static final long serialVersionUID = 1L; 
    4228 
    43         public BulkUploadResult parser(String fileOnServer, boolean save) 
    44                         throws InvalidFormatException, LoginRequiredException { 
    45                 final BulkUploadResult results = new BulkUploadResult(); 
    46                 try { 
    47                         if (save) { 
    48                                 updateFile(fileOnServer); 
     29        @Override 
     30        public void parserImpl(String fileOnServer, boolean save, 
     31                        BulkUploadResult results, SampleDAO sampleDao, SubsampleDAO ssDao, 
     32                        final Map<String, Collection<String>> subsampleNames, 
     33                        final Map<String, Sample> samples, 
     34                        final Map<String, Subsample> subsamples) 
     35                        throws FileNotFoundException, MpDbException, LoginRequiredException { 
     36                final NewAnalysisParser ap = new NewAnalysisParser(new FileInputStream( 
     37                                MpDbServlet.getFileUploadPath() + fileOnServer)); 
     38                ap.parse(); 
     39                final Map<Integer, ChemicalAnalysis> analyses = ap 
     40                                .getChemicalAnalyses(); 
     41                // Handle any existing errors found 
     42                addErrors(ap, results); 
     43                final BulkUploadResultCount caResultCount = new BulkUploadResultCount(); 
     44                final BulkUploadResultCount ssResultCount = new BulkUploadResultCount(); 
     45                final Iterator<Integer> rows = analyses.keySet().iterator(); 
     46                final ChemicalAnalysisDAO caDao = new ChemicalAnalysisDAO( 
     47                                currentSession()); 
     48                while (rows.hasNext()) { 
     49                        int row = rows.next(); 
     50                        final ChemicalAnalysis ca = analyses.get(row); 
     51                        initObject(ca); 
     52                        try { 
     53                                // see if our subsample exists 
     54                                if (ca.getSubsample() == null) { 
     55                                        results.addError(row, new PropertyRequiredException( 
     56                                                        "Subsample")); 
     57                                        continue; 
     58                                } 
     59                                // see if our sample exists 
     60                                if (ca.getSubsample().getSample() == null) { 
     61                                        results.addError(row, new PropertyRequiredException( 
     62                                                        "Sample")); 
     63                                        continue; 
     64                                } 
     65                                Sample s = ca.getSubsample().getSample(); 
     66                                checkForSample(s, samples, sampleDao, results, subsampleNames, 
     67                                                row); 
     68                                Subsample ss = (ca.getSubsample()); 
     69                                ss.setSample(s); 
     70                                if (ss != null && s != null) { 
     71                                        // if we don't have the name stored already we need 
     72                                        // to load the subsample 
     73                                        ca.setSubsample(checkForSubsample(s, ss, samples, ssDao, 
     74                                                        results, subsampleNames, row, subsamples, 
     75                                                        ssResultCount, save)); 
     76                                } else { 
     77                                        // Every Image needs a subsample so add an error 
     78                                        results.addError(row, new PropertyRequiredException( 
     79                                                        "Subsample")); 
     80                                } 
     81                                doc.validate(ca); 
     82                                if (caDao.isNew(ca)) 
     83                                        caResultCount.incrementFresh(); 
     84                                else 
     85                                        caResultCount.incrementOld(); 
     86                                if (save) 
     87                                        caDao.save(ca); 
     88                        } catch (Exception e) { 
     89                                results.addError(row, getNiceException(e)); 
     90                                caResultCount.incrementInvalid(); 
    4991                        } 
    50                         final NewAnalysisParser ap = new NewAnalysisParser( 
    51                                         new FileInputStream(MpDbServlet.getFileUploadPath() 
    52                                                         + fileOnServer)); 
    53                         ap.parse(); 
    54                         final Map<Integer, ChemicalAnalysis> analyses = ap 
    55                                         .getChemicalAnalyses(); 
    56                         // Handle any existing errors found 
    57                         final Map<Integer, BulkUploadError> existingErrors = ap.getErrors(); 
    58                         final Set<Integer> keys = existingErrors.keySet(); 
    59                         final Iterator<Integer> itr = keys.iterator(); 
    60                         while (itr.hasNext()) { 
    61                                 final Integer i = itr.next(); 
    62                                 results.addError(i.intValue(), existingErrors.get(i) 
    63                                                 .getException()); 
    64                         } 
    65  
    66                         // Keeps track of existing/new subsample names for each sample 
    67                         final Map<String, Collection<String>> subsampleNames = new HashMap<String, Collection<String>>(); 
    68                         // maps a sample alias to an actual sample 
    69                         final Map<String, Sample> samples = new HashMap<String, Sample>(); 
    70                         // maps a sample alias + subsample name to an actual subsample 
    71                         final Map<String, Subsample> subsamples = new HashMap<String, Subsample>(); 
    72                         final BulkUploadResultCount caResultCount = new BulkUploadResultCount(); 
    73                         final BulkUploadResultCount ssResultCount = new BulkUploadResultCount(); 
    74                         final ChemicalAnalysisDAO dao = new ChemicalAnalysisDAO(this 
    75                                         .currentSession()); 
    76                         final SubsampleDAO ssDAO = new SubsampleDAO(this.currentSession()); 
    77                         final SampleDAO sDAO = new SampleDAO(this.currentSession()); 
    78                         User user = new User(); 
    79                         user.setId(currentUser()); 
    80                         user = new UserDAO(currentSession()).fill(user); 
    81                         final Iterator<Integer> rows = analyses.keySet().iterator(); 
    82                         while (rows.hasNext()) { 
    83                                 int row = rows.next(); 
    84                                 final ChemicalAnalysis ca = analyses.get(row); 
    85                                 try { 
    86                                         // see if our subsample exists 
    87                                         if (ca.getSubsample() == null) { 
    88                                                 results.addError(row, new PropertyRequiredException( 
    89                                                                 "Subsample")); 
    90                                                 continue; 
    91                                         } 
    92                                         // see if our sample exists 
    93                                         if (ca.getSubsample().getSample() == null) { 
    94                                                 results.addError(row, new PropertyRequiredException( 
    95                                                                 "Sample")); 
    96                                                 continue; 
    97                                         } 
    98                                         Sample s = ca.getSubsample().getSample(); 
    99                                         s.setOwner(user); 
    100                                         ca.getSubsample().setOwner(user); 
    101                                         ca.setOwner(user); 
    102                                         ca.setPublicData(false); 
    103                                         ca.getSubsample().setPublicData(false); 
    104                                         try { 
    105                                                 // if we don't have this sample already loaded check 
    106                                                 // for it in the database 
    107                                                 if (!samples.containsKey(s.getAlias())) { 
    108                                                         s = sDAO.fill(s); 
    109                                                         samples.put(s.getAlias(), s); 
    110                                                         subsampleNames.put(s.getAlias(), 
    111                                                                         new HashSet<String>()); 
    112                                                 } else { 
    113                                                         s = samples.get(s.getAlias()); 
    114                                                 } 
    115                                         } catch (DAOException e) { 
    116                                                 // There is no sample we have to add an error 
    117                                                 // Every Image needs a sample so add an error 
    118                                                 results.addError(row, new PropertyRequiredException( 
    119                                                                 "Sample")); 
    120                                                 results.addError(row, e); 
    121                                                 continue; 
    122                                         } 
    123                                         Subsample ss = (ca.getSubsample()); 
    124                                         ss.setSample(s); 
    125                                         if (ss != null && s != null) { 
    126                                                 // if we don't have the name stored already we need 
    127                                                 // to load the subsample 
    128                                                 if (!subsampleNames.get(s.getAlias()).contains( 
    129                                                                 ss.getName())) { 
    130                                                         try { 
    131                                                                 doc.validate(ss); 
    132                                                                 ss = ssDAO.fill(ss); 
    133                                                                 subsamples.put(s.getAlias() + ss.getName(), ss); 
    134                                                                 ca.setSubsample(ss); 
    135                                                                 ssResultCount.incrementOld(); 
    136                                                         } catch (DAOException e) { 
    137                                                                 // Means it is new because we could not find 
    138                                                                 // it 
    139                                                                 ssResultCount.incrementFresh(); 
    140                                                                 if (save) { 
    141                                                                         try { 
    142                                                                                 ss = ssDAO.save(ss); 
    143                                                                         } catch (DAOException e1) { 
    144                                                                                 results.addError(row, e1); 
    145                                                                         } 
    146                                                                         subsamples.put(s.getAlias() + ss.getName(), 
    147                                                                                         ss); 
    148                                                                         ca.setSubsample(ss); 
    149                                                                 } 
    150                                                         } 
    151                                                         subsampleNames.get(s.getAlias()).add( 
    152                                                                         ca.getSubsample().getName()); 
    153                                                 } else { 
    154                                                         ca.setSubsample(subsamples.get(s.getAlias() 
    155                                                                         + ss.getName())); 
    156                                                 } 
    157                                         } else { 
    158                                                 // Every Image needs a subsample so add an error 
    159                                                 results.addError(row, new PropertyRequiredException( 
    160                                                                 "Subsample")); 
    161                                         } 
    162                                         doc.validate(ca); 
    163                                         if (dao.isNew(ca)) 
    164                                                 caResultCount.incrementFresh(); 
    165                                         else 
    166                                                 caResultCount.incrementOld(); 
    167                                         if (save) { 
    168                                                 try { 
    169                                                         dao.save(ca); 
    170                                                 } catch (MpDbException e) { 
    171                                                         results.addError(row, e); 
    172                                                 } catch (HibernateException e) { 
    173                                                         results.addError(row, handleHibernateException(e)); 
    174                                                 } 
    175                                         } 
    176                                 } catch (ValidationException e) { 
    177                                         results.addError(row, e); 
    178                                         caResultCount.incrementInvalid(); 
    179                                 } catch (HibernateException e) { 
    180                                         if (e instanceof GenericJDBCException) { 
    181                                                 if (((GenericJDBCException)e).getSQLException().getSQLState().equals("25P02")) { 
    182                                                         results.addError(row, new GenericDAOException("Bulk Upload stopped due to fatal error")); 
    183                                                 } 
    184                                         } else { 
    185                                                 results.addError(row, handleHibernateException(e)); 
    186                                         } 
    187                                 }        
    188                                 ++row; 
    189                         } 
    190                         results.addResultCount("Chemical Analysis", caResultCount); 
    191                         results.addResultCount("Subsamples", ssResultCount); 
    192                         results.setHeaders(ap.getHeaders()); 
    193                         if (save && results.getErrors().isEmpty()) { 
    194                                 try { 
    195                                         commit(); 
    196                                 } catch (DAOException e) { 
    197                                         results.addError(0, e); 
    198                                 } 
    199                         } 
    200                 } catch (MpDbException e) { 
    201                         results.addError(-1, e); 
    202                 } catch (final Exception e) { 
    203                         results.addError(-1, new GenericDAOException(e.getMessage())); 
     92                        ++row; 
    20493                } 
    205                 return results; 
     94                results.addResultCount("Chemical Analysis", caResultCount); 
     95                results.addResultCount("Subsamples", ssResultCount); 
     96                results.setHeaders(ap.getHeaders()); 
    20697        } 
    20798} 
  • trunk/mpdb-server/src/edu/rpi/metpetdb/server/impl/bulk/upload/BulkUploadImagesServiceImpl.java

    r787 r797  
    44import java.io.File; 
    55import java.io.FileInputStream; 
     6import java.io.FileNotFoundException; 
    67import java.io.IOException; 
    78import java.io.InputStream; 
    89import java.util.ArrayList; 
    910import java.util.Collection; 
    10 import java.util.HashMap; 
    11 import java.util.HashSet; 
    1211import java.util.Iterator; 
    1312import java.util.Map; 
    14 import java.util.Set; 
    1513import java.util.zip.ZipEntry; 
    1614import java.util.zip.ZipFile; 
     
    2018 
    2119import edu.rpi.metpetdb.client.error.DAOException; 
    22 import edu.rpi.metpetdb.client.error.InvalidFormatException; 
    2320import edu.rpi.metpetdb.client.error.LoginRequiredException; 
    2421import edu.rpi.metpetdb.client.error.MpDbException; 
     
    3229import edu.rpi.metpetdb.client.model.Sample; 
    3330import edu.rpi.metpetdb.client.model.Subsample; 
    34 import edu.rpi.metpetdb.client.model.User; 
    3531import edu.rpi.metpetdb.client.model.XrayImage; 
    36 import edu.rpi.metpetdb.client.model.bulk.upload.BulkUploadError; 
    3732import edu.rpi.metpetdb.client.model.bulk.upload.BulkUploadResult; 
    3833import edu.rpi.metpetdb.client.model.bulk.upload.BulkUploadResultCount; 
     
    107102        } 
    108103 
    109         public BulkUploadResult parser(String fileOnServer, boolean save) 
    110                         throws InvalidFormatException, LoginRequiredException { 
    111                 final BulkUploadResult results = new BulkUploadResult(); 
     104        @Override 
     105        public void parserImpl(String fileOnServer, boolean save, 
     106                        BulkUploadResult results, SampleDAO sampleDao, SubsampleDAO ssDao, 
     107                        Map<String, Collection<String>> subsampleNames, 
     108                        Map<String, Sample> samples, Map<String, Subsample> subsamples) 
     109                        throws FileNotFoundException, MpDbException, LoginRequiredException { 
    112110                final BulkUploadResultCount ssResultCount = new BulkUploadResultCount(); 
    113111                final BulkUploadResultCount imgResultCount = new BulkUploadResultCount(); 
     112                // Find the Excel Spreadsheet 
     113                FileInputStream is = new FileInputStream(MpDbServlet 
     114                                .getFileUploadPath() 
     115                                + fileOnServer); 
     116                ZipEntry spreadsheet; 
    114117                try { 
    115                         if (save) { 
    116                                 updateFile(fileOnServer); 
    117                         } 
    118                         // Find the Excel Spreadsheet 
    119                         FileInputStream is = new FileInputStream(MpDbServlet 
    120                                         .getFileUploadPath() 
    121                                         + fileOnServer); 
    122                         ZipEntry spreadsheet = getSpreadsheetName(is); 
    123                         if (spreadsheet == null) 
    124                                 throw new IllegalStateException("No Excel Spreasheet found"); 
    125                         String spreadsheetPrefix = (new File(spreadsheet.getName())) 
    126                                         .getParent(); 
    127                         if (spreadsheetPrefix == null) 
    128                                 spreadsheetPrefix = ""; 
    129                         else 
    130                                 spreadsheetPrefix += File.separator; 
    131  
    132                         ZipFile zp = new ZipFile(MpDbServlet.getFileUploadPath() 
    133                                         + fileOnServer); 
    134                         final NewImageParser ip = new NewImageParser(zp 
    135                                         .getInputStream(spreadsheet)); 
    136                         ip.parse(); 
    137                         results.setHeaders(ip.getHeaders()); 
    138                         final Map<Integer, BulkUploadImage> images = ip 
    139                                         .getBulkUploadImages(); 
    140                         User u = new User(); 
    141                         u.setId(currentUser()); 
    142                         // Keeps track of existing/new subsample names for each sample 
    143                         final Map<String, Collection<String>> subsampleNames = new HashMap<String, Collection<String>>(); 
    144                         // maps a sample alias to an actual sample 
    145                         final Map<String, Sample> samples = new HashMap<String, Sample>(); 
    146                         // maps a sample alias + subsample name to an actual subsample 
    147                         final Map<String, Subsample> subsamples = new HashMap<String, Subsample>(); 
    148                         final SubsampleDAO ssDAO = new SubsampleDAO(this.currentSession()); 
    149                         final SampleDAO sDAO = new SampleDAO(this.currentSession()); 
    150                         final ImageDAO dao = new ImageDAO(this.currentSession()); 
    151                         final Iterator<Integer> imgRows = images.keySet().iterator(); 
    152                         // Handle any existing errors found 
    153                         final Map<Integer, BulkUploadError> existingErrors = ip.getErrors(); 
    154                         final Set<Integer> keys = existingErrors.keySet(); 
    155                         final Iterator<Integer> itr = keys.iterator(); 
    156                         while (itr.hasNext()) { 
    157                                 final Integer i = itr.next(); 
    158                                 results.addError(i.intValue(), existingErrors.get(i) 
    159                                                 .getException()); 
    160                         } 
    161  
    162                         while (imgRows.hasNext()) { 
    163                                 final int row = imgRows.next(); 
    164                                 final Image img = images.get(row).getImage(); 
    165                                 // Confirm the filename is in the zip 
    166                                 if (zp.getEntry(spreadsheetPrefix + img.getFilename()) == null) { 
    167                                         results.addError(row, new InvalidImageException( 
    168                                                         spreadsheetPrefix + img.getFilename())); 
    169                                 } else { 
    170                                         try { 
    171                                                 // see if our sample exists 
    172                                                 if (img.getSample() == null 
    173                                                                 && img.getSubsample() == null) { 
    174                                                         // Image needs a sample or a subsample to continue 
     118                        spreadsheet = getSpreadsheetName(is); 
     119                } catch (IOException ioe) { 
     120                        throw new GenericDAOException(ioe.getMessage()); 
     121                } 
     122                if (spreadsheet == null) 
     123                        throw new IllegalStateException("No Excel Spreasheet found"); 
     124                String spreadsheetPrefix = (new File(spreadsheet.getName())) 
     125                                .getParent(); 
     126                if (spreadsheetPrefix == null) 
     127                        spreadsheetPrefix = ""; 
     128                else 
     129                        spreadsheetPrefix += File.separator; 
     130 
     131                ZipFile zp; 
     132                NewImageParser ip; 
     133                try { 
     134                        zp = new ZipFile(MpDbServlet.getFileUploadPath() + fileOnServer); 
     135                        ip = new NewImageParser(zp.getInputStream(spreadsheet)); 
     136                } catch (IOException ioe) { 
     137                        throw new GenericDAOException(ioe.getMessage()); 
     138                } 
     139 
     140                ip.parse(); 
     141                results.setHeaders(ip.getHeaders()); 
     142                final Map<Integer, BulkUploadImage> images = ip.getBulkUploadImages(); 
     143                final Iterator<Integer> imgRows = images.keySet().iterator(); 
     144                // Handle any existing errors found 
     145                addErrors(ip, results); 
     146                final ImageDAO imgDao = new ImageDAO(currentSession()); 
     147                final XrayImageDAO xrayDao = new XrayImageDAO(currentSession()); 
     148                while (imgRows.hasNext()) { 
     149                        final int row = imgRows.next(); 
     150                        final Image img = images.get(row).getImage(); 
     151                        initObject(img); 
     152                        // Confirm the filename is in the zip 
     153                        if (zp.getEntry(spreadsheetPrefix + img.getFilename()) == null) { 
     154                                results.addError(row, new InvalidImageException( 
     155                                                spreadsheetPrefix + img.getFilename())); 
     156                        } else { 
     157                                try { 
     158                                        // see if our sample exists 
     159                                        if (img.getSample() == null && img.getSubsample() == null) { 
     160                                                // Image needs a sample or a subsample to continue 
     161                                                results.addError(row, new PropertyRequiredException( 
     162                                                                "Sample or Subsample")); 
     163                                                continue; 
     164                                        } 
     165                                        Sample s = img.getSample(); 
     166                                        if (!checkForSample(s, samples, sampleDao, results, 
     167                                                        subsampleNames, row)) 
     168                                                continue; 
     169                                        if (img.getSample() != null && img.getSubsample() == null) { 
     170                                                // we are adding a sample image 
     171                                        } else { 
     172                                                // we are adding an image to a subsample 
     173                                                Subsample ss = (img.getSubsample()); 
     174                                                ss.setSample(s); 
     175                                                img.setSample(null); 
     176                                                if (ss != null) { 
     177                                                        // if we don't have the name stored already we 
     178                                                        // need 
     179                                                        // to load the subsample 
     180                                                        img.setSubsample(checkForSubsample(s, ss, samples, 
     181                                                                        ssDao, results, subsampleNames, row, 
     182                                                                        subsamples, ssResultCount, save)); 
     183                                                } else { 
     184                                                        // Every Image needs a subsample so add an error 
    175185                                                        results.addError(row, 
    176                                                                         new PropertyRequiredException( 
    177                                                                                         "Sample or Subsample")); 
    178                                                         continue; 
     186                                                                        new PropertyRequiredException("Subsample")); 
    179187                                                } 
    180                                                 Sample s = img.getSample(); 
    181                                                 s.setOwner(u); 
    182                                                 try { 
    183                                                         // if we don't have this sample already loaded 
    184                                                         // check 
    185                                                         // for it in the database 
    186                                                         if (!samples.containsKey(s.getAlias())) { 
    187                                                                 s = sDAO.fill(s); 
    188                                                                 samples.put(s.getAlias(), s); 
    189                                                                 subsampleNames.put(s.getAlias(), 
    190                                                                                 new HashSet<String>()); 
    191                                                         } else { 
    192                                                                 s = samples.get(s.getAlias()); 
    193                                                         } 
    194                                                 } catch (DAOException e) { 
    195                                                         // There is no sample we have to add an error 
    196                                                         // Every Image needs a sample so add an error 
    197                                                         results.addError(row, 
    198                                                                         new PropertyRequiredException("Sample")); 
    199                                                         continue; 
     188                                        } 
     189                                        doc.validate(img); 
     190                                        if (imgDao.isNew(img)) 
     191                                                imgResultCount.incrementFresh(); 
     192                                        else 
     193                                                imgResultCount.incrementOld(); 
     194                                        if (save) { 
     195                                                setRealImage(zp, img, spreadsheetPrefix); 
     196                                                if (img instanceof XrayImage) { 
     197                                                        xrayDao.save((XrayImage) img); 
     198                                                } else { 
     199                                                        imgDao.save(img); 
    200200                                                } 
    201                                                 if (img.getSample() != null 
    202                                                                 && img.getSubsample() == null) { 
    203                                                         // we are adding a sample image 
    204                                                         img.setSubsample(null); // ignore the subsample if 
    205                                                         // they specified one 
    206                                                 } else { 
    207                                                         // we are adding an image to a subsample 
    208                                                         img.getSubsample().setSample(img.getSample()); 
    209                                                         img.setSample(null); 
    210                                                         img.getSubsample().setOwner(u); 
    211                                                         img.getSubsample().setPublicData(false); 
    212                                                         Subsample ss = (img.getSubsample()); 
    213                                                         if (ss != null) { 
    214                                                                 // if we don't have the name stored already we 
    215                                                                 // need 
    216                                                                 // to load the subsample 
    217                                                                 if (!subsampleNames.get( 
    218                                                                                 ss.getSample().getAlias()).contains( 
    219                                                                                 ss.getName())) { 
    220                                                                         try { 
    221                                                                                 doc.validate(ss); 
    222                                                                                 ss = ssDAO.fill(ss); 
    223                                                                                 subsamples.put(ss.getSample() 
    224                                                                                                 .getAlias() 
    225                                                                                                 + ss.getName(), ss); 
    226                                                                                 img.setSubsample(ss); 
    227                                                                                 ssResultCount.incrementOld(); 
    228                                                                         } catch (DAOException e) { 
    229                                                                                 // Means it is new because we could not 
    230                                                                                 // find 
    231                                                                                 // it 
    232                                                                                 ssResultCount.incrementFresh(); 
    233                                                                                 if (save) { 
    234                                                                                         try { 
    235                                                                                                 ss = ssDAO.save(ss); 
    236                                                                                         } catch (DAOException e1) { 
    237                                                                                                 results.addError(row, e1); 
    238                                                                                         } 
    239                                                                                         subsamples.put(ss.getSample() 
    240                                                                                                         .getAlias() 
    241                                                                                                         + ss.getName(), ss); 
    242                                                                                         img.setSubsample(ss); 
    243                                                                                 } 
    244                                                                         } 
    245                                                                         subsampleNames.get( 
    246                                                                                         ss.getSample().getAlias()).add( 
    247                                                                                         ss.getName()); 
    248                                                                 } else { 
    249                                                                         img.setSubsample(subsamples.get(ss 
    250                                                                                         .getSample().getAlias() 
    251                                                                                         + ss.getName())); 
    252                                                                 } 
    253                                                         } else { 
    254                                                                 // Every Image needs a subsample so add an error 
    255                                                                 results.addError(row, 
    256                                                                                 new PropertyRequiredException( 
    257                                                                                                 "Subsample")); 
    258                                                         } 
    259                                                 } 
    260  
    261                                                 doc.validate(img); 
    262                                                 if (dao.isNew(img)) 
    263                                                         imgResultCount.incrementFresh(); 
    264                                                 else 
    265                                                         imgResultCount.incrementOld(); 
    266                                                 if (save) { 
    267                                                         setRealImage(zp, img, spreadsheetPrefix); 
    268                                                         try { 
    269                                                                 if (img instanceof XrayImage) { 
    270                                                                         (new XrayImageDAO(this.currentSession())) 
    271                                                                                         .save((XrayImage) img); 
    272                                                                 } else { 
    273                                                                         (new ImageDAO(this.currentSession())) 
    274                                                                                         .save(img); 
    275                                                                 } 
    276                                                         } catch (DAOException e1) { 
    277                                                                 results.addError(row, e1); 
    278                                                         } 
    279                                                 } 
    280                                         } catch (ValidationException e) { 
    281                                                 results.addError(row, e); 
    282                                                 imgResultCount.incrementInvalid(); 
    283201                                        } 
     202                                } catch (Exception e) { 
     203                                        results.addError(row, getNiceException(e)); 
     204                                        imgResultCount.incrementInvalid(); 
    284205                                } 
    285206                        } 
    286  
    287                         final Iterator<Integer> iogRows = images.keySet().iterator(); 
    288                         while (iogRows.hasNext()) { 
    289                                 final int row = iogRows.next(); 
    290                                 final ImageOnGrid iog = images.get(row).getImageOnGrid(); 
    291                                 Image img = iog.getImage(); 
    292                                 // Confirm the filename is in the zip 
    293                                 if (zp.getEntry(spreadsheetPrefix + img.getFilename()) == null) { 
    294                                         results.addError(row, new InvalidImageException( 
    295                                                         spreadsheetPrefix + img.getFilename())); 
     207                } 
     208 
     209                final Iterator<Integer> iogRows = images.keySet().iterator(); 
     210                while (iogRows.hasNext()) { 
     211                        final int row = iogRows.next(); 
     212                        final ImageOnGrid iog = images.get(row).getImageOnGrid(); 
     213                        Image img = iog.getImage(); 
     214                        // Confirm the filename is in the zip 
     215                        if (zp.getEntry(spreadsheetPrefix + img.getFilename()) == null) { 
     216                                results.addError(row, new InvalidImageException( 
     217                                                spreadsheetPrefix + img.getFilename())); 
     218                        } 
     219                        try { 
     220                                doc.validate(img); 
     221                                if (save) { 
     222                                        setRealImage(zp, iog.getImage(), spreadsheetPrefix); 
     223 
     224                                        // Set image information for the Grid Copy 
     225                                        iog.setGchecksum(iog.getImage().getChecksum()); 
     226                                        iog.setGchecksum64x64(iog.getImage().getChecksum64x64()); 
     227                                        iog.setGchecksumHalf(iog.getImage().getChecksumHalf()); 
     228                                        iog.setGheight(iog.getImage().getHeight()); 
     229                                        iog.setGwidth(iog.getImage().getWidth()); 
     230                                        saveIncompleteImageOnGrid(iog); 
    296231                                } 
    297                                 try { 
    298                                         doc.validate(img); 
    299                                         if (save) { 
    300                                                 setRealImage(zp, iog.getImage(), spreadsheetPrefix); 
    301  
    302                                                 // Set image information for the Grid Copy 
    303                                                 iog.setGchecksum(iog.getImage().getChecksum()); 
    304                                                 iog 
    305                                                                 .setGchecksum64x64(iog.getImage() 
    306                                                                                 .getChecksum64x64()); 
    307                                                 iog.setGchecksumHalf(iog.getImage().getChecksumHalf()); 
    308                                                 iog.setGheight(iog.getImage().getHeight()); 
    309                                                 iog.setGwidth(iog.getImage().getWidth()); 
    310                                                 try { 
    311                                                         saveIncompleteImageOnGrid(iog); 
    312                                                 } catch (MpDbException e) { 
    313                                                         results.addError(0, e); 
    314                                                 } 
    315  
    316                                         } 
    317                                 } catch (ValidationException e) { 
    318                                         results.addError(row, e); 
    319                                 } 
    320                         } 
    321  
    322                         if (save && results.getErrors().isEmpty()) { 
    323                                 try { 
    324                                         commit(); 
    325                                 } catch (DAOException e1) { 
    326                                         results.addError(0, e1); 
    327                                 } 
    328                         } 
    329                 } catch (MpDbException e) { 
    330                         results.addError(-1, e); 
    331                 } catch (Exception e) { 
    332                         results.addError(-1, new GenericDAOException(e.getMessage())); 
    333                         e.printStackTrace(); 
     232                        } catch (Exception e) { 
     233                                results.addError(row, getNiceException(e)); 
     234                        } 
    334235                } 
    335236                results.addResultCount("Subsamples", ssResultCount); 
    336237                results.addResultCount("Images", imgResultCount); 
    337                 return results; 
    338         } 
     238        } 
     239 
    339240        protected ImageOnGrid saveIncompleteImageOnGrid(ImageOnGrid iog) 
    340241                        throws ValidationException, LoginRequiredException, DAOException { 
  • trunk/mpdb-server/src/edu/rpi/metpetdb/server/impl/bulk/upload/BulkUploadSampleServiceImpl.java

    r780 r797  
    22 
    33import java.io.FileInputStream; 
    4 import java.io.IOException; 
     4import java.io.FileNotFoundException; 
     5import java.util.Collection; 
    56import java.util.Iterator; 
    67import java.util.Map; 
    7 import java.util.Set; 
    88 
    9 import org.hibernate.HibernateException; 
    10  
    11 import edu.rpi.metpetdb.client.error.DAOException; 
    12 import edu.rpi.metpetdb.client.error.InvalidFormatException; 
    139import edu.rpi.metpetdb.client.error.LoginRequiredException; 
    1410import edu.rpi.metpetdb.client.error.MpDbException; 
    15 import edu.rpi.metpetdb.client.error.dao.GenericDAOException; 
    1611import edu.rpi.metpetdb.client.model.Sample; 
    17 import edu.rpi.metpetdb.client.model.User; 
    18 import edu.rpi.metpetdb.client.model.bulk.upload.BulkUploadError; 
     12import edu.rpi.metpetdb.client.model.Subsample; 
    1913import edu.rpi.metpetdb.client.model.bulk.upload.BulkUploadResult; 
    2014import edu.rpi.metpetdb.client.model.bulk.upload.BulkUploadResultCount; 
     
    2317import edu.rpi.metpetdb.server.bulk.upload.NewSampleParser; 
    2418import edu.rpi.metpetdb.server.dao.impl.SampleDAO; 
    25 import edu.rpi.metpetdb.server.dao.impl.UserDAO; 
     19import edu.rpi.metpetdb.server.dao.impl.SubsampleDAO; 
    2620 
    2721public class BulkUploadSampleServiceImpl extends BulkUploadService implements 
     
    2923        private static final long serialVersionUID = 1L; 
    3024 
    31         public BulkUploadResult parser(String fileOnServer, boolean save) 
    32                         throws InvalidFormatException, LoginRequiredException { 
    33                 final BulkUploadResult results = new BulkUploadResult(); 
    34                 try { 
    35                         if (save) { 
    36                                 updateFile(fileOnServer); 
     25        @Override 
     26        public void parserImpl(String fileOnServer, boolean save, 
     27                        BulkUploadResult results, SampleDAO sampleDao, SubsampleDAO ssDao, 
     28                        final Map<String, Collection<String>> subsampleNames, 
     29                        final Map<String, Sample> cachedSamples, 
     30                        final Map<String, Subsample> subsamples) 
     31                        throws FileNotFoundException, MpDbException, LoginRequiredException { 
     32                final NewSampleParser sp = new NewSampleParser(new FileInputStream( 
     33                                MpDbServlet.getFileUploadPath() + fileOnServer)); 
     34                sp.parse(); 
     35                results.setHeaders(sp.getHeaders()); 
     36                final Map<Integer, Sample> samples = sp.getSamples(); 
     37                addErrors(sp, results); 
     38                final BulkUploadResultCount resultCount = new BulkUploadResultCount(); 
     39                final Iterator<Integer> rows = samples.keySet().iterator(); 
     40                while (rows.hasNext()) { 
     41                        final int row = rows.next(); 
     42                        final Sample s = samples.get(row); 
     43                        initObject(s); 
     44                        try { 
     45                                if (sampleDao.isNew(s)) 
     46                                        resultCount.incrementFresh(); 
     47                                else 
     48                                        resultCount.incrementOld(); 
     49                                if (save) 
     50                                        sampleDao.save(s); 
     51                        } catch (Exception e) { 
     52                                resultCount.incrementInvalid(); 
     53                                results.addError(row, getNiceException(e, s)); 
    3754                        } 
    38                         final NewSampleParser sp = new NewSampleParser(new FileInputStream( 
    39                                         MpDbServlet.getFileUploadPath() + fileOnServer)); 
    40                         sp.parse(); 
    41                         final Map<Integer, Sample> samples = sp.getSamples(); 
    42                         final SampleDAO dao = new SampleDAO(this.currentSession()); 
    43                         final Map<Integer, BulkUploadError> existingErrors = sp 
    44                                         .getErrors(); 
    45                         final Set<Integer> keys = existingErrors.keySet(); 
    46                         final Iterator<Integer> itr = keys.iterator(); 
    47                         while (itr.hasNext()) { 
    48                                 final Integer i = itr.next(); 
    49                                 results.addError(i.intValue(), existingErrors.get(i).getException()); 
    50                         } 
    51                         User user = new User(); 
    52                         user.setId(currentUser()); 
    53                         user = new UserDAO(currentSession()).fill(user); 
    54                         final BulkUploadResultCount resultCount = new BulkUploadResultCount(); 
    55                         final Iterator<Integer> rows = samples.keySet().iterator(); 
    56                         while(rows.hasNext()) { 
    57                                 final int row = rows.next(); 
    58                                 final Sample s = samples.get(row); 
    59                                 s.setOwner(user); 
    60                                 s.setPublicData(false); 
    61                                 try { 
    62                                         if (dao.isNew(s)) 
    63                                                 resultCount.incrementFresh(); 
    64                                         else 
    65                                                 resultCount.incrementOld(); 
    66                                 } catch (HibernateException e) { 
    67                                         resultCount.incrementInvalid(); 
    68                                         results.addError(row, handleHibernateException(e, s)); 
    69                                 } 
    70                                 if (save) { 
    71                                         try { 
    72                                                 dao.save(s); 
    73                                         } catch (HibernateException he) { 
    74                                                 results.addError(row, handleHibernateException(he, s)); 
    75                                         } catch (DAOException e) { 
    76                                                 results.addError(row, e); 
    77                                         } 
    78                                 } 
    79                         }  
    80                         results.addResultCount("Sample", resultCount); 
    81                         results.setHeaders(sp.getHeaders()); 
    82                         if (save && results.getErrors().isEmpty()) { 
    83                                 try { 
    84                                         commit(); 
    85                                 } catch (DAOException e) { 
    86                                         results.addError(0, e); 
    87                                 } 
    88                         } 
    89                 } catch (MpDbException e) { 
    90                         results.addError(-1, e); 
    91                 } catch (final Exception e) { 
    92                         results.addError(-1, new GenericDAOException(e.getMessage())); 
    9355                } 
    94                 return results; 
     56                results.addResultCount("Sample", resultCount); 
    9557        } 
    96          
    97          
    9858} 
  • trunk/mpdb-server/src/edu/rpi/metpetdb/server/impl/bulk/upload/BulkUploadService.java

    r741 r797  
    11package edu.rpi.metpetdb.server.impl.bulk.upload; 
    22 
     3import java.io.FileNotFoundException; 
     4import java.util.Collection; 
     5import java.util.HashMap; 
     6import java.util.HashSet; 
    37import java.util.Iterator; 
    48import java.util.Map; 
     9import java.util.Set; 
    510 
    611import org.hibernate.HibernateException; 
     12import org.hibernate.exception.GenericJDBCException; 
    713 
    814import edu.rpi.metpetdb.client.error.DAOException; 
    915import edu.rpi.metpetdb.client.error.LoginRequiredException; 
    1016import edu.rpi.metpetdb.client.error.MpDbException; 
     17import edu.rpi.metpetdb.client.error.ValidationException; 
     18import edu.rpi.metpetdb.client.error.dao.GenericDAOException; 
     19import edu.rpi.metpetdb.client.error.validation.PropertyRequiredException; 
     20import edu.rpi.metpetdb.client.model.Sample; 
     21import edu.rpi.metpetdb.client.model.Subsample; 
    1122import edu.rpi.metpetdb.client.model.User; 
     23import edu.rpi.metpetdb.client.model.bulk.upload.BulkUploadError; 
    1224import edu.rpi.metpetdb.client.model.bulk.upload.BulkUploadResult; 
    1325import edu.rpi.metpetdb.client.model.bulk.upload.BulkUploadResultCount; 
    1426import edu.rpi.metpetdb.client.model.interfaces.HasOwner; 
     27import edu.rpi.metpetdb.client.model.interfaces.HasSample; 
     28import edu.rpi.metpetdb.client.model.interfaces.HasSubsample; 
    1529import edu.rpi.metpetdb.client.model.interfaces.MObject; 
    1630import edu.rpi.metpetdb.client.model.interfaces.PublicData; 
    1731import edu.rpi.metpetdb.server.MpDbServlet; 
     32import edu.rpi.metpetdb.server.bulk.upload.NewParser; 
    1833import edu.rpi.metpetdb.server.dao.MpDbDAO; 
     34import edu.rpi.metpetdb.server.dao.impl.SampleDAO; 
     35import edu.rpi.metpetdb.server.dao.impl.SubsampleDAO; 
    1936 
    2037/** 
     
    2744 
    2845        private static final long serialVersionUID = 1L; 
     46 
     47        public BulkUploadResult parser(String fileOnServer, boolean save) 
     48                        throws LoginRequiredException, DAOException { 
     49                final BulkUploadResult results = new BulkUploadResult(); 
     50                try { 
     51                        if (save) { 
     52                                updateFile(fileOnServer); 
     53                        } 
     54                        final SampleDAO sampleDao = new SampleDAO(this.currentSession()); 
     55                        final SubsampleDAO ssDAO = new SubsampleDAO(this.currentSession()); 
     56 
     57                        // Keeps track of existing/new subsample names for each sample 
     58                        final Map<String, Collection<String>> subsampleNames = new HashMap<String, Collection<String>>(); 
     59                        // maps a sample alias to an actual sample 
     60                        final Map<String, Sample> samples = new HashMap<String, Sample>(); 
     61                        // maps a sample alias + subsample name to an actual subsample 
     62                        final Map<String, Subsample> subsamples = new HashMap<String, Subsample>(); 
     63 
     64                        parserImpl(fileOnServer, save, results, sampleDao, ssDAO, 
     65                                        subsampleNames, samples, subsamples); 
     66 
     67                        if (save && results.getErrors().isEmpty()) { 
     68                                try { 
     69                                        commit(); 
     70                                } catch (Exception e) { 
     71                                        results.addError(0, getNiceException(e)); 
     72                                } 
     73                        } 
     74                } catch (LoginRequiredException e) { 
     75                        throw e; // so that it does not get caught below 
     76                } catch (final Exception e) { 
     77                        results.addError(-1, getNiceException(e)); 
     78                } 
     79                return results; 
     80        } 
     81 
     82        public abstract void parserImpl(String fileOnServer, boolean save, 
     83                        BulkUploadResult results, SampleDAO sampleDao, SubsampleDAO ssDao, 
     84                        final Map<String, Collection<String>> subsampleNames, 
     85                        final Map<String, Sample> samples, 
     86                        final Map<String, Subsample> subsamples) 
     87                        throws FileNotFoundException, MpDbException, LoginRequiredException; 
    2988 
    3089        /** 
     
    41100                                .createSQLQuery( 
    42101                                                "UPDATE uploaded_files SET user_id = :user_id WHERE hash = :hash") 
    43                                 .setParameter("user_id", currentUser()).setParameter("hash", 
     102                                .setParameter("user_id", currentUserId()).setParameter("hash", 
    44103                                                fileOnServer).executeUpdate(); 
    45104        } 
    46105 
     106        protected void addErrors(final NewParser<?> parser, 
     107                        final BulkUploadResult results) { 
     108                final Map<Integer, BulkUploadError> existingErrors = parser.getErrors(); 
     109                final Set<Integer> keys = existingErrors.keySet(); 
     110                final Iterator<Integer> itr = keys.iterator(); 
     111                while (itr.hasNext()) { 
     112                        final Integer i = itr.next(); 
     113                        results.addError(i.intValue(), existingErrors.get(i).getColumn(), 
     114                                        existingErrors.get(i).getCellData(), 
     115                                        getNiceException(existingErrors.get(i).getException())); 
     116                } 
     117        } 
     118 
     119        protected MpDbException getNiceException(final Exception e) { 
     120                return getNiceException(e, null); 
     121        } 
     122 
     123        protected MpDbException getNiceException(final Exception e, 
     124                        final MObject obj) { 
     125                e.printStackTrace(); 
     126                if (e instanceof MpDbException) { 
     127                        return (MpDbException) e; 
     128                } else if (e instanceof GenericJDBCException) { 
     129                        if (((GenericJDBCException) e).getSQLException().getSQLState() 
     130                                        .equals("25P02")) { 
     131                                return new GenericDAOException( 
     132                                                "Bulk Upload stopped due to fatal error"); 
     133                        } else { 
     134                                return new GenericDAOException(e.getMessage()); 
     135                        } 
     136                } else if (e instanceof HibernateException) { 
     137                        return handleHibernateException((HibernateException) e, obj); 
     138                } else { 
     139                        return null; 
     140                } 
     141 
     142        } 
     143        protected <T extends MObject> void initObject(T obj) 
     144                        throws LoginRequiredException, DAOException { 
     145                if (obj instanceof HasOwner) 
     146                        ((HasOwner) obj).setOwner(currentUser()); 
     147                if (obj instanceof PublicData) 
     148                        ((PublicData) obj).setPublicData(false); 
     149                if (obj instanceof HasSubsample) { 
     150                        ((HasSubsample) obj).getSubsample().setOwner(currentUser()); 
     151                        ((HasSubsample) obj).getSubsample().setPublicData(false); 
     152                } 
     153                if (obj instanceof HasSample) { 
     154                        ((HasSample)obj).getSample().setOwner(currentUser()); 
     155                } 
     156        } 
     157 
     158        protected boolean checkForSample(Sample s, 
     159                        final Map<String, Sample> samples, final SampleDAO sampleDao, 
     160                        final BulkUploadResult results, 
     161                        final Map<String, Collection<String>> subsampleNames, int row) { 
     162                try { 
     163                        // if we don't have this sample already loaded check 
     164                        // for it in the database 
     165                        if (!samples.containsKey(s.getAlias())) { 
     166                                s = sampleDao.fill(s); 
     167                                samples.put(s.getAlias(), s); 
     168                                subsampleNames.put(s.getAlias(), new HashSet<String>()); 
     169                        } else { 
     170                                s = samples.get(s.getAlias()); 
     171                        } 
     172                        return true; 
     173                } catch (DAOException e) { 
     174                        // There is no sample we have to add an error 
     175                        // Every Image needs a sample so add an error 
     176                        results.addError(row, new PropertyRequiredException("Sample")); 
     177                        results.addError(row, e); 
     178                        return false; 
     179                } 
     180        } 
     181 
     182        protected Subsample checkForSubsample(Sample s, Subsample ss, 
     183                        final Map<String, Sample> samples, final SubsampleDAO ssDao, 
     184                        final BulkUploadResult results, 
     185                        final Map<String, Collection<String>> subsampleNames, int row, 
     186                        final Map<String, Subsample> subsamples, 
     187                        BulkUploadResultCount ssResultCount, boolean save) 
     188                        throws ValidationException { 
     189                if (subsampleNames.get(s.getAlias()) != null 
     190                                && !subsampleNames.get(s.getAlias()).contains(ss.getName())) { 
     191                        try { 
     192                                doc.validate(ss); 
     193                                ss = ssDao.fill(ss); 
     194                                subsamples.put(s.getAlias() + ss.getName(), ss); 
     195                                ssResultCount.incrementOld(); 
     196                                return ss; 
     197                        } catch (DAOException e) { 
     198                                // Means it is new because we could not find 
     199                                // it 
     200                                ssResultCount.incrementFresh(); 
     201                                if (save) { 
     202                                        try { 
     203                                                ss = ssDao.save(ss); 
     204                                        } catch (DAOException e1) { 
     205                                                results.addError(row, e1); 
     206                                        } 
     207                                        subsamples.put(s.getAlias() + ss.getName(), ss); 
     208                                        return ss; 
     209                                } 
     210                        } 
     211                        subsampleNames.get(s.getAlias()).add(ss.getName()); 
     212                        return ss; 
     213                } else { 
     214                        return subsamples.get(s.getAlias() + ss.getName()); 
     215                } 
     216        } 
    47217        protected <T extends MObject> void analyzeResults( 
    48218                        final Map<Integer, T> results, 
     
    51221                        final MpDbDAO<T> dao) throws LoginRequiredException { 
    52222                final User user = new User(); 
    53                 user.setId(currentUser()); 
     223                user.setId(currentUserId()); 
    54224                final Iterator<Integer> rows = results.keySet().iterator(); 
    55225                while (rows.hasNext()) { 
    56226                        final int row = rows.next(); 
    57227                        final T result = results.get(row); 
    58                         if (result instanceof HasOwner) 
    59                                 ((HasOwner) result).setOwner(user); 
    60                         if (result instanceof PublicData) 
    61                                 ((PublicData) result).setPublicData(false); 
     228 
    62229                        try { 
    63                                 //validate(result); 
     230                                // validate(result); 
    64231                                if (dao.isNew(result)) 
    65232                                        resultCount.incrementFresh();