private String _returnPublication(HttpServletRequest req, Publication pub) {
   // to json
   RestfulPublication result = new RestfulPublication(pub);
   Gson jsonBuilder = support.getJsonBuilder(request, RestfulPublication.FIELD_SELECTOR);
   String json = jsonBuilder.toJson(result, RestfulPublication.class);
   return support.wrapReturn(request, String.format("[%s]", json));
 }
  @Published()
  @GET
  @Path("/jconf/{jconfName: .*}")
  @Produces({"text/html", "text/javascript", "application/json"})
  public String getPublicationsByJconfName(
      @DefaultValue("") @PathParam("jconfName") String jconfName,
      @DefaultValue("-1") @QueryParam("startYear") Integer startYear,
      @DefaultValue("-1") @QueryParam("endYear") Integer endYear,
      @DefaultValue("0") @QueryParam("limStart") Integer limStart,
      @DefaultValue("-1") @QueryParam("limEnd") Integer limEnd) {

    // Check permission.
    String denyReason = support.checkPermission(request, uriInfo);
    if (null != denyReason) {
      return denyReason;
    }

    try {
      Jconf jconf = conferenceService.getConference(Strings.replace_back(jconfName));
      if (jconf != null) {
        return getPublicationsByJconfID(jconf.getId(), startYear, endYear, limStart, limEnd);
      } else {
        return "[]";
      }
    } catch (Throwable t) {
      t.printStackTrace();
      return support.throwJson(t.getMessage(), t);
    }
  }
  @Published()
  @GET
  @Path("/jconf/{jconfid: [0-9]+}")
  @Produces({"text/html", "text/javascript", "application/json"})
  public String getPublicationsByJconfID(
      @DefaultValue("-1") @PathParam("jconfid") Integer jconfid,
      @DefaultValue("-1") @QueryParam("startYear") Integer startYear,
      @DefaultValue("-1") @QueryParam("endYear") Integer endYear,
      @DefaultValue("0") @QueryParam("limStart") Integer limStart,
      @DefaultValue("-1") @QueryParam("limEnd") Integer limEnd) {

    // Check permission.
    String denyReason = support.checkPermission(request, uriInfo);
    if (null != denyReason) {
      return denyReason;
    }

    try {
      if (-1 == startYear) {
        startYear = Integer.MIN_VALUE;
      }
      if (-1 == endYear) {
        endYear = Integer.MAX_VALUE;
      }
      if (-1 == limEnd) {
        limEnd = Integer.MAX_VALUE;
      }

      // Linked hash set
      List<Publication> pubTemp = publicationService.getPublicationsByConferenceId(jconfid);
      List<Publication> pubSet = Lists.newArrayList();
      int count = 0;
      for (Publication pub : pubTemp) {
        if ((startYear == null || startYear <= pub.getYear())
            && (endYear == null || endYear >= pub.getYear())) {
          if (count >= limStart) {
            pubSet.add(pub);
          }
          count++;
          if (count >= limEnd) {
            break;
          }
        }
      }

      // if has html, return here.
      String htmlResult = support.returnHtml(request, "person_profile.vm", pubSet);
      if (null != htmlResult) {
        return htmlResult;
      }

      Publication[] parray = new Publication[pubSet.size()];
      parray = pubSet.toArray(parray);

      return _returnPublication(request, parray);
    } catch (Throwable t) {
      t.printStackTrace();
      return support.throwJson(t.getMessage(), t);
    }
  }
  private String _returnPublication(HttpServletRequest req, Publication[] pubs) {
    if (null == pubs) {
      return "[]";
    }
    System.out.println(">>" + pubs.length);
    List<RestfulPublication> rPubs = new ArrayList<RestfulPublication>(pubs.length);
    for (Publication pub : pubs) {
      RestfulPublication rPub = new RestfulPublication(pub);
      rPubs.add(rPub);
    }

    Gson jsonBuilder = support.getJsonBuilder(request, RestfulPublication.FIELD_SELECTOR);

    Type type = new TypeToken<List<RestfulPublication>>() {}.getType();

    String json = jsonBuilder.toJson(rPubs, type);
    return support.wrapReturn(request, json);
  }
  @Published()
  @GET
  @Path("/{pubids: [0-9,]+}")
  @Produces({"text/html", "text/javascript", "application/json"})
  public String getPublicationByPubIDs(@DefaultValue("") @PathParam("pubids") String pubIDStr) {

    // Check permission.
    String denyReason = support.checkPermission(request, uriInfo);
    if (null != denyReason) {
      return denyReason;
    }

    String[] ids = pubIDStr.split(",");
    Set<Integer> pubIDSet = new LinkedHashSet<Integer>();
    for (String idstr : ids) pubIDSet.add(Integer.parseInt(idstr.trim()));
    try {
      boolean withAbs = false;
      String fieldSelectString = Strings.safeTrim(REQ.get(request, FIELDS));
      if (fieldSelectString.contains("+abs") || fieldSelectString.contains("abs")) {
        withAbs = true;
      }
      List<Publication> pubSet =
          publicationService.getPublications(withAbs, pubIDSet.toArray(new Integer[] {}));

      // if has html, return here.
      String htmlResult = support.returnHtml(request, "person_profile.vm", pubSet);
      if (null != htmlResult) {
        return htmlResult;
      }

      Publication[] parray = new Publication[pubSet.size()];
      parray = pubSet.toArray(parray);

      return _returnPublication(request, parray);
    } catch (Throwable t) {
      t.printStackTrace();
      return support.throwJson(t.getMessage(), t);
    }
  }
  /**
   * @param option default tff, [contactInfo, publicationList, coauthors]
   * @return
   */
  @Published()
  @GET
  @Path("/{pubid: [0-9]+}")
  @Produces({"text/html", "text/javascript", "application/json"})
  public String getPublicationByPubID(@DefaultValue("-1") @PathParam("pubid") Integer pubID) {

    // Check permission.
    String denyReason = support.checkPermission(request, uriInfo);
    if (null != denyReason) {
      return denyReason;
    }

    try {
      boolean withAbs = false;
      String fieldSelectString = Strings.safeTrim(REQ.get(request, FIELDS));
      if (fieldSelectString.contains("+abs") || fieldSelectString.contains("abs")) {
        withAbs = true;
      }
      Publication pub = null;
      if (withAbs) {
        pub = publicationService.getPublicationFull(pubID);
      } else {
        pub = publicationService.getPublication(pubID);
      }

      // if has html, return here.
      String htmlResult = support.returnHtml(request, "person_profile.vm", pub);
      if (null != htmlResult) {
        return htmlResult;
      }

      return _returnPublication(request, pub);
    } catch (Throwable t) {
      t.printStackTrace();
      return support.throwJson(t.getMessage(), t);
    }
  }
  @Published("soa")
  @GET
  @Path("/getPubLocation/{pubid: [0-9]+}")
  @Produces({"text/html", "text/javascript", "application/json"})
  public String getPubLocationById(@DefaultValue("-1") @PathParam("pubid") Integer PubId) {

    // Check permission.
    // String denyReason = support.checkPermission(request, uriInfo);
    // if (null != denyReason) {
    // return denyReason;
    // }

    try {
      Publication pub = publicationService.getPublication(PubId);

      if (null != pub) {
        RealPerson[] authors = pub.getAuthors();
        if (null == authors) {
          return "[]";
        }

        Integer[] ids = new Integer[authors.length];
        for (int i = 0; i < ids.length; ++i) {
          ids[i] = authors[i].getId();
        }
        List<PersonProfile> profiles =
            personService.getProfile((short) (PersonService.ORG_ID | PersonService.CONTACT), ids);
        List<Integer> orgids = Lists.newArrayList();
        for (PersonProfile pp : profiles) {
          orgids.add(pp.getPersonStatisticsData().getOrgid());
        }
        List<Organization> orgs = new ArrayList<Organization>();

        for (int oid : orgids) {
          orgs.add(oid < 0 ? null : orgService.getOrganization(oid));
        }

        String[][] locations = new String[3][];
        locations[0] = new String[orgs.size()];
        locations[1] = new String[orgs.size()];
        locations[2] = new String[orgs.size()];
        Organization tmp = new Organization();
        for (int i = 0; i < orgs.size(); ++i) {
          tmp = orgs.get(i);
          if (tmp == null) {
            locations[0][i] = String.valueOf(-1);
            locations[1][i] = String.valueOf(-1);
            locations[2][i] = "";
          } else {
            locations[0][i] = String.valueOf(tmp.getLongitude());
            locations[1][i] = String.valueOf(tmp.getLatitude());
            locations[2][i] = tmp.getName();
          }
        }

        String json = support.jsonBuilder.toJson(locations);
        return support.wrapReturn(request, json);
      } else {
        return "[]";
      }
    } catch (Throwable t) {
      t.printStackTrace();
      return support.throwJson(t.getMessage(), t);
    }
  }