Author: ssanbern
Date: 2006-12-20 13:15:54 +0100 (Wed, 20 Dec 2006)
New Revision: 4210

Modified:
   
branches/2.6.1/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/PrisjaktSearchCommand.java
Log:
added encoding

Modified: 
branches/2.6.1/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/PrisjaktSearchCommand.java
===================================================================
--- 
branches/2.6.1/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/PrisjaktSearchCommand.java
  2006-12-20 09:57:34 UTC (rev 4209)
+++ 
branches/2.6.1/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/PrisjaktSearchCommand.java
  2006-12-20 12:15:54 UTC (rev 4210)
@@ -1,6 +1,5 @@
 package no.schibstedsok.searchportal.mode.command;
 
-
 import no.schibstedsok.searchportal.query.token.TokenEvaluationEngine;
 import no.schibstedsok.searchportal.query.token.TokenPredicate;
 import no.schibstedsok.searchportal.result.SearchResult;
@@ -12,7 +11,10 @@
 import java.text.DecimalFormatSymbols;
 import java.util.Map;
 
+import java.io.UnsupportedEncodingException;
 import java.net.MalformedURLException;
+
+import java.net.URLEncoder;
 import java.rmi.RemoteException;
 import nu.prisjakt.www.wsdl.Butik;
 import nu.prisjakt.www.wsdl.Kategori;
@@ -29,265 +31,241 @@
  */
 public class PrisjaktSearchCommand extends AbstractWebServiceSearchCommand {
 
-    
-       
-       
-       
-       
-       private static final String SOAP_ENDPOINT = 
"http://www.prisjakt.nu/sesam/soap.php";;
-    private static final Logger LOG = 
Logger.getLogger(OverturePPCSearchCommand.class);
-    
-    /**
-     * Format för siffror utan decimaler med tusenavskiljare. 
-     */
-    private static DecimalFormat NUMMER_AVSK_FORMAT;
-    static
-    {
-       DecimalFormatSymbols symbols = new DecimalFormatSymbols();
-       symbols.setGroupingSeparator(' ');
-       NUMMER_AVSK_FORMAT = new DecimalFormat("#,##0", symbols);
-       NUMMER_AVSK_FORMAT.setGroupingSize(3);
-    }
+       private static final Logger LOG = Logger
+                       .getLogger(PrisjaktSearchCommand.class);
 
+       private static final String ERR_FAILED_PRISJAKT_SEARCH = "Failed 
Prisjakt search command";
+       private static final String ERR_FAILED_ENCODE_PRISJAKT = "Failed to 
encode Prisjakt search query";
+       /**
+        * Format för siffror utan decimaler med tusenavskiljare.
+        */
+       private static DecimalFormat NUMMER_AVSK_FORMAT;
+       static {
+               DecimalFormatSymbols symbols = new DecimalFormatSymbols();
+               symbols.setGroupingSeparator(' ');
+               NUMMER_AVSK_FORMAT = new DecimalFormat("#,##0", symbols);
+               NUMMER_AVSK_FORMAT.setGroupingSize(3);
+       }
 
-    /**
-     * Creates a new instance of this class.
-     *
-     * @param cxt The context to execute in.
-     * @param parameters The search parameters.
-     */
-    public PrisjaktSearchCommand(final Context cxt, final Map<String, Object> 
parameters) {
-        super(cxt, parameters);
-    }
+       /**
+        * Creates a new instance of this class.
+        *
+        * @param cxt The context to execute in.
+        * @param parameters The search parameters.
+        */
+       public PrisjaktSearchCommand(final Context cxt,
+                       final Map<String, Object> parameters) {
+               super(cxt, parameters);
+       }
 
-    /** [EMAIL PROTECTED] */
-    public SearchResult execute() {
-        
-       
-       final TokenEvaluationEngine engine = context.getTokenEvaluationEngine();
-       /*Butiker?*/
-       final boolean isChain = engine.evaluateQuery(TokenPredicate.CHAIN, 
context.getQuery());
-       final boolean isService = 
engine.evaluateQuery(TokenPredicate.FINN_SERVICE, context.getQuery());
-       final boolean isElectronics = 
engine.evaluateQuery(TokenPredicate.PRODUCT_ELECTRONIC, context.getQuery());
-       final boolean isHousehold = 
engine.evaluateQuery(TokenPredicate.PRODUCT_HOUSEHOLD, context.getQuery());
-       final boolean isMusic = 
engine.evaluateQuery(TokenPredicate.PRODUCT_MUSIC, context.getQuery());
-       
-       final SearchResult result = new BasicSearchResult(this);
-       
-       if(isChain||isService||isElectronics||isHousehold||isMusic)
-       {
-               
-               final PrisjaktLocator service = new PrisjaktLocator();
-       
-       
-               LOG.debug("Executing prisjact command");
-       
-               try 
-               {
-       
-                   final PrisjaktPortType port = service.getPrisjaktPort(new 
java.net.URL(SOAP_ENDPOINT));
-                   final Resultat prisjaktResult= 
port.getData(getTransformedQuery());
-                   
-                   String query = getTransformedQuery();
-                   result.addField("searchquery", query);
-                   
-                   Produkt[] products = prisjaktResult.getProdukter();
-                   Butik[] butiker = prisjaktResult.getButiker();
-                   Kategori[] kategorier = prisjaktResult.getKategorier();
-                   
-                   
-                  
-                   
-                   
-                   if(isElectronics||isHousehold||isMusic)
-                   {
-                       if(products!=null)
-                       {
-                               result.addField("searchtype", "productsearch");
-                               result.setHitCount(products.length);
-                       }
-                       else
-                       {
-                               result.setHitCount(0);
-                               return result;
-                       }
-                   }
-                   else if(isService)
-                   {
-                       if(kategorier!=null)
-                       {
-                               result.addField("searchtype", "categorysearch");
-                               result.setHitCount(kategorier.length);
-                       }
-                       else
-                       {
-                               result.setHitCount(0);
-                               return result;
-                       }
-                   }
-                   else
-                   {
-                       if(butiker!=null)
-                       {
-                               result.addField("searchtype", "storesearch");
-                               result.setHitCount(butiker.length);
-                       }
-                       else
-                       {
-                               result.setHitCount(0);
-                               return result;
-                       }
-                   }
-                   
-                   LOG.debug("Number of results " + result.getHitCount());
-                   
-                   
-                   
-                   if((products!=null) && 
(result.getField("searchtype")=="productsearch"))
-                   {
-                       productConverter(result, products);
-                   }
-                   if(kategorier!=null && 
(result.getField("searchtype")=="categorysearch"))
-                   {
-                       catagorieConverter(result, kategorier);
-                   }
-                   if(butiker!=null && 
(result.getField("searchtype")=="storesearch"))
-                   {
-                       storeConverter(result, butiker);
-                   }
-                   
-                   return result;
-               }
-               catch (ServiceException e) 
-               {
-                   throw new InfrastructureException(e);
-               } 
-               catch (MalformedURLException e) 
-               {
-                   throw new InfrastructureException(e);
-               } 
-               catch (RemoteException e) 
-               {
-                   throw new InfrastructureException(e);
-               }
-       }
-       result.setHitCount(0);
-       return result;
-    }
+       /** [EMAIL PROTECTED] */
+       public SearchResult execute() {
 
-    
-    private void productConverter(SearchResult result, Produkt [] products)
-    {
-       for (final Produkt product : products) 
-       {
-            final SearchResultItem item = new BasicSearchResultItem();
-            item.addField("productName", product.getProduktnamn());
-            int lPris = product.getLagstaPris();
-            String cf = nummerAvskFormat(lPris);
-            item.addField("lowestPrice", cf);
-            item.addField("numberofStores", 
Integer.toString(product.getAntalButiker()));
-            /* &st=4 tillägget gör att vi får en liten bild ifrån 
prisjakt*/
-            item.addField("pruductPicture", product.getBild()+"&st=4");
-            item.addField("categorieURL", product.getKategoriurl());
-            item.addField("pruductURL", product.getUrl());
-            item.addField("categorieName", product.getKategorinamn());
-            result.addResult(item);
-        }
-    }
-    
-    private void catagorieConverter(SearchResult result, Kategori [] 
kategorier)
-    {
-       for (final Kategori katag : kategorier) 
-       {
-            final SearchResultItem item = new BasicSearchResultItem();
-            item.addField("numberofProducts", 
Integer.toString(katag.getAntalProdukter()));
-            item.addField("categorieURL", katag.getUrl());
-            item.addField("categorieName", katag.getKategorinamn());
-            result.addResult(item);
-        }
-    }
-    
-    private void storeConverter(SearchResult result, Butik [] stores)
-    {
-       for (final Butik store : stores) 
-       {
-            final SearchResultItem item = new BasicSearchResultItem();
-            item.addField("numberofProducts", 
Integer.toString(store.getAntalProdukter()));
-            item.addField("storeURL", store.getUrl());
-            item.addField("storeName", store.getButiksnamn());
-            result.addResult(item);
-        }
-    }
-    
-    /**
-     * Formatera nummer med tusenavskiljare utan decimaler.
-     */
-    private static String nummerAvskFormat(Number nummer)
-    {
-       if (nummer == null)
-       {
-          return "";
-       }
-       return NUMMER_AVSK_FORMAT.format(nummer.doubleValue());
-    }
-    
-    /**
-     * Formatera med tusenavskiljare och lägger till decimaldel med 
komma-tecken
-     * om decimaldel förekommer. Tar bort alla inledande och avslutande 
blanksteg
-     * samt ev inledande '+'-tecken Ex: +5555510.35->5 555 510,35 
+5555510,35->5
-     * 555 510,35 +10002000 ->10 002 000
-     * 
-     * @param numStr <code>String</code> Strängen som ska formateras
-     * @return En sträng som har formaterats enligt ovan.
-     */
-    private static String nummerAvskFormat(String numStr)
-    {
-       if (numStr == null || numStr.equals(""))
-       {
-          return "";
-       }
-       // Bort med alla inledande och avslutande blanksteg samt
-       // ev inledande '+'-tecken
-       numStr = numStr.trim();
-       numStr = removeBlanks(numStr);
-       numStr = numStr.indexOf("+") > 0 ? numStr.substring(1) : numStr;
-       // Spara undan ev. decimaldelen och se till att den alltid består av 
ett
-       // komma-tecken om den förekommer.
-       String decPart = numStr.indexOf(',') > 0 ? numStr.substring(numStr
-          .indexOf(',')) : numStr.indexOf('.') > 0 ? numStr.substring(
-          numStr.indexOf('.')).replaceFirst(".", ",") : "";
-       // Substringa ut heltalsdelen
-       double d;
-       try
-       {
-          d = Double.valueOf(
-             numStr.substring(0, numStr.length() - decPart.length()))
-             .doubleValue();
-       }
-       catch (NumberFormatException e)
-       {
-          e.printStackTrace();
-          return "";
-       }
+               final TokenEvaluationEngine engine = 
context.getTokenEvaluationEngine();
+               /*Butiker*/
+               final boolean isChain = 
engine.evaluateQuery(TokenPredicate.CHAIN,
+                               context.getQuery());
+               /*Kategorier*/
+               final boolean isService = 
engine.evaluateQuery(TokenPredicate.SHOP_CATEGORY, context.getQuery());
 
-       return NUMMER_AVSK_FORMAT.format(d).concat(decPart);
-    }
-    /**
-     * Tar bort blanktecken ur strängen
-     */
-    private static String removeBlanks(String str)
-    {
-       if (isEmpty(str))
-       {
-          return str;
-       }
-       return StringUtils.deleteSpaces(str);
-    }
-    /**
-     * Kontrollerar om strängargumentet är null eller tom sträng.
-     */
-    private static boolean isEmpty(String s)
-    {
-       return StringUtils.isEmpty(s);
-    }
+
+               /*Produkter*/
+               final boolean isElectronics = engine.evaluateQuery(
+                               TokenPredicate.PRODUCT_ELECTRONIC, 
context.getQuery());
+               final boolean isHousehold = engine.evaluateQuery(
+                               TokenPredicate.PRODUCT_HOUSEHOLD, 
context.getQuery());
+               final boolean isMusic = engine.evaluateQuery(
+                               TokenPredicate.PRODUCT_MUSIC, 
context.getQuery());
+
+               final SearchResult result = new BasicSearchResult(this);
+
+               if (isChain || isService || isElectronics || isHousehold || 
isMusic) {
+                       final PrisjaktLocator service = new PrisjaktLocator();
+
+                       try {
+                               final PrisjaktPortType port = service
+                                               .getPrisjaktPort(new 
java.net.URL(service
+                                                               
.getPrisjaktPortAddress()));
+                               final Resultat prisjaktResult = port
+                                               .getData(getTransformedQuery());
+
+                               String query = getTransformedQuery();
+                               LOG.debug("Executing prisjact command with 
searchquery: "
+                                               + query);
+
+                               /**
+                                * Prisjakt kräver i nuläget en special 
hantering av url encodingen.
+                                * Vi måste ersätta + vi får vid encodingen med 
%20 som prisjakt kräver.
+                                */
+                               String urlencQuery = URLEncoder.encode(query, 
"iso-8859-1");
+                               int index = urlencQuery.indexOf('+');
+                               if (index != -1) {
+                                       StringBuffer strb = new 
StringBuffer(urlencQuery);
+                                       strb.insert(index + 1, "%20");
+                                       strb.deleteCharAt(index);
+                                       
result.addField("urlEncodedsearchquery", strb.toString());
+                               } else {
+                                       
result.addField("urlEncodedsearchquery", urlencQuery);
+                               }
+
+                               result.addField("searchquery", query);
+
+                               Produkt[] products = 
prisjaktResult.getProdukter();
+                               Butik[] butiker = prisjaktResult.getButiker();
+                               Kategori[] kategorier = 
prisjaktResult.getKategorier();
+
+                               if (isElectronics || isHousehold || isMusic) {
+                                       if (products != null) {
+                                               result.addField("searchtype", 
"productsearch");
+                                               
result.setHitCount(products.length);
+                                               productConverter(result, 
products);
+                                       } else {
+                                               result.setHitCount(0);
+                                       }
+                               } else if (isService) {
+                                       if (kategorier != null) {
+                                               result.addField("searchtype", 
"categorysearch");
+                                               
result.setHitCount(kategorier.length);
+                                               catagorieConverter(result, 
kategorier);
+                                       } else {
+                                               result.setHitCount(0);
+                                       }
+                               } else {
+                                       if (butiker != null) {
+                                               result.addField("searchtype", 
"storesearch");
+                                               
result.setHitCount(butiker.length);
+                                               storeConverter(result, butiker);
+                                       } else {
+                                               result.setHitCount(0);
+                                       }
+                               }
+
+                               LOG.debug("Number of results " + 
result.getHitCount());
+
+                       } catch (ServiceException se) {
+                               LOG.error(ERR_FAILED_PRISJAKT_SEARCH, se);
+                               throw new InfrastructureException(se);
+                       } catch (MalformedURLException murle) {
+                               LOG.error(ERR_FAILED_PRISJAKT_SEARCH, murle);
+                               throw new InfrastructureException(murle);
+                       } catch (RemoteException re) {
+                               LOG.error(ERR_FAILED_PRISJAKT_SEARCH, re);
+                               throw new InfrastructureException(re);
+                       } catch (UnsupportedEncodingException usee) {
+
+                               LOG.error(ERR_FAILED_ENCODE_PRISJAKT,usee);
+                       }
+               }
+
+               return result;
+       }
+
+       private void productConverter(SearchResult result, Produkt[] products) {
+               for (final Produkt product : products) {
+                       final SearchResultItem item = new 
BasicSearchResultItem();
+                       item.addField("productName", product.getProduktnamn());
+                       int lPris = product.getLagstaPris();
+                       String cf = nummerAvskFormat(lPris);
+                       item.addField("lowestPrice", cf);
+                       item.addField("numberofStores", Integer.toString(product
+                                       .getAntalButiker()));
+                       /* &st=4 tillägget gör att vi får en liten bild ifrån 
prisjakt*/
+                       if (product.getBild().equalsIgnoreCase("")) {
+                               item.addField("pruductPicture", "");
+                       } else {
+                               item.addField("pruductPicture", 
product.getBild() + "&st=4");
+                       }
+
+                       item.addField("categorieURL", product.getKategoriurl());
+                       item.addField("pruductURL", product.getUrl());
+                       item.addField("categorieName", 
product.getKategorinamn());
+                       result.addResult(item);
+               }
+       }
+
+       private void catagorieConverter(SearchResult result, Kategori[] 
kategorier) {
+               for (final Kategori katag : kategorier) {
+                       final SearchResultItem item = new 
BasicSearchResultItem();
+                       item.addField("numberofProducts", Integer.toString(katag
+                                       .getAntalProdukter()));
+                       item.addField("categorieURL", katag.getUrl());
+                       item.addField("categorieName", katag.getKategorinamn());
+                       result.addResult(item);
+               }
+       }
+
+       private void storeConverter(SearchResult result, Butik[] stores) {
+               for (final Butik store : stores) {
+                       final SearchResultItem item = new 
BasicSearchResultItem();
+                       item.addField("numberofProducts", Integer.toString(store
+                                       .getAntalProdukter()));
+                       item.addField("storeURL", store.getUrl());
+                       item.addField("storeName", store.getButiksnamn());
+                       result.addResult(item);
+               }
+       }
+
+       /**
+        * Formatera nummer med tusenavskiljare utan decimaler.
+        */
+       private static String nummerAvskFormat(Number nummer) {
+               if (nummer == null) {
+                       return "";
+               }
+               return NUMMER_AVSK_FORMAT.format(nummer.doubleValue());
+       }
+
+       /**
+        * Formatera med tusenavskiljare och lägger till decimaldel med 
komma-tecken
+        * om decimaldel förekommer. Tar bort alla inledande och avslutande 
blanksteg
+        * samt ev inledande '+'-tecken Ex: +5555510.35->5 555 510,35 
+5555510,35->5
+        * 555 510,35 +10002000 ->10 002 000
+        *
+        * @param numStr <code>String</code> Strängen som ska formateras
+        * @return En sträng som har formaterats enligt ovan.
+        */
+       private static String nummerAvskFormat(String numStr) {
+               if (numStr == null || numStr.equals("")) {
+                       return "";
+               }
+               // Bort med alla inledande och avslutande blanksteg samt
+               // ev inledande '+'-tecken
+               numStr = numStr.trim();
+               numStr = removeBlanks(numStr);
+               numStr = numStr.indexOf("+") > 0 ? numStr.substring(1) : numStr;
+               // Spara undan ev. decimaldelen och se till att den alltid 
består av ett
+               // komma-tecken om den förekommer.
+               String decPart = numStr.indexOf(',') > 0 ? 
numStr.substring(numStr
+                               .indexOf(',')) : numStr.indexOf('.') > 0 ? 
numStr.substring(
+                               numStr.indexOf('.')).replaceFirst(".", ",") : 
"";
+               // Substringa ut heltalsdelen
+               double d;
+               try {
+                       d = Double.valueOf(
+                                       numStr.substring(0, numStr.length() - 
decPart.length()))
+                                       .doubleValue();
+               } catch (NumberFormatException e) {
+                       e.printStackTrace();
+                       return "";
+               }
+
+               return NUMMER_AVSK_FORMAT.format(d).concat(decPart);
+       }
+
+       /**
+        * Tar bort blanktecken ur strängen
+        */
+       private static String removeBlanks(String str) {
+               if (isEmpty(str)) {
+                       return str;
+               }
+               return StringUtils.deleteSpaces(str);
+       }
+
+       /**
+        * Kontrollerar om strängargumentet är null eller tom sträng.
+        */
+       private static boolean isEmpty(String s) {
+               return StringUtils.isEmpty(s);
+       }
 }

_______________________________________________
Kernel-commits mailing list
[email protected]
http://sesat.no/mailman/listinfo/kernel-commits

Reply via email to