Examples of Bucket


Examples of freenet.support.api.Bucket

    }
  }

  private void makeMetadata(ClientContext context) {

    Bucket bucket = null;
    int x = 0;

    Metadata md = makeManifest(origMetadata, "");

    while(true) {
View Full Code Here

Examples of freenet.support.api.Bucket

  private int resolve(MetadataUnresolvedException e, int x, FreenetURI key, String element2, ClientContext context) throws IOException {
    Metadata[] metas = e.mustResolve;
    for(Metadata m: metas) {
      try {
        Bucket bucket = m.toBucket(context.getBucketFactory(persistent));
        String nameInArchive = ".metadata-"+(x++);
        containerItems.add(new ContainerElement(bucket, nameInArchive));
        m.resolve(nameInArchive);
      } catch (MetadataUnresolvedException e1) {
        x = resolve(e, x, key, element2, context);
View Full Code Here

Examples of freenet.support.api.Bucket

     * @param backup True if we want the .bak file.
     * @param encryptionKey Non-null if we want an encrypted file.
     */
    private Bucket makeBucket(File dir, String baseName, boolean backup, DatabaseKey encryptionKey) {
        File filename = makeFilename(dir, baseName, backup, encryptionKey != null);
        Bucket bucket = new FileBucket(filename, false, false, false, false);
        if(encryptionKey != null)
            bucket = encryptionKey.createEncryptedBucketForClientLayer(bucket);
        return bucket;
    }
View Full Code Here

Examples of freenet.support.api.Bucket

        if (range[1] == -1 || range[1] >= size) {
          range[1] = size - 1;
        }
        InputStream is = null;
        OutputStream os = null;
        Bucket tmpRange = bucketFactory.makeBucket(range[1] - range[0]);
        try {
          is = data.getInputStream();
          os = tmpRange.getOutputStream();
          if (range[0] > 0)
            FileUtil.skipFully(is, range[0]);
          FileUtil.copy(is, os, range[1] - range[0] + 1);
          // FIXME catch IOException here and tell the user there is a problem instead of just closing the connection.
          // Currently there is no way to tell the difference between an IOE caused by the connection to the client and an internal one, we just close the connection in both cases.
          os.close(); os = null; // If we can't write, we need to throw, so we don't send too little data.
        } finally {
          Closer.close(is);
          Closer.close(os);
        }
        MultiValueTable<String, String> retHdr = new MultiValueTable<String, String>();
        retHdr.put("Content-Range", "bytes " + range[0] + "-" + range[1] + "/" + size);
                retHdr.put("X-Content-Type-Options", "nosniff");
        context.sendReplyHeadersFProxy(206, "Partial content", retHdr, mimeType, tmpRange.size());
        context.writeData(tmpRange);
      } else {
                MultiValueTable<String, String> retHdr = new MultiValueTable<String, String>();
                retHdr.put("X-Content-Type-Options", "nosniff");
                context.sendReplyHeadersFProxy(200, "OK", retHdr, mimeType, size);
View Full Code Here

Examples of freenet.support.api.Bucket

    if(httprequest.isParameterSet("forcedownload")) {
      if(override.length() == 0) override = "?forcedownload";
      else override = override+"&forcedownload";
    }

    Bucket data = null;
    String mimeType = null;
    String referer = sanitizeReferer(ctx);
    FetchException fe = null;


    FProxyFetchResult fr = null;

      FProxyFetchWaiter fetch = null;
      try {
        fetch = fetchTracker.makeFetcher(key, maxSize, fctx, ctx.getReFilterPolicy());
      } catch (FetchException e) {
            fe = e;
      }
      if(fetch != null)
      while(true) {
      fr = fetch.getResult(!canSendProgress);
      if(fr.hasData()) {

        if(fr.getFetchCount() > 1 && !fr.hasWaited() && fr.getFetchCount() > 1 && key.isUSK() && context.uskManager.lookupKnownGood(USK.create(key)) > key.getSuggestedEdition()) {
          Logger.normal(this, "Loading later edition...");
          fetch.progress.requestImmediateCancel();
          fr = null;
          fetch = null;
          try {
            fetch = fetchTracker.makeFetcher(key, maxSize, fctx, ctx.getReFilterPolicy());
          } catch (FetchException e) {
                            fe = e;
          }
          if(fetch == null) break;
          continue;
        }

        if(logMINOR) Logger.minor(this, "Found data");
        data = new NoFreeBucket(fr.data);
        mimeType = fr.mimeType;
        fetch.close(); // Not waiting any more, but still locked the results until sent
        break;
      } else if(fr.failed != null) {
        if(logMINOR) Logger.minor(this, "Request failed");
        fe = fr.failed;
        fetch.close(); // Not waiting any more, but still locked the results until sent
        break;
      } else if(canSendProgress) {
        if(logMINOR) Logger.minor(this, "Still in progress");
        // Still in progress
        boolean isJsEnabled=ctx.getContainer().isFProxyJavascriptEnabled() && ua != null && !ua.contains("AppleWebKit/");
        boolean isWebPushingEnabled = false;
        PageNode page = ctx.getPageMaker().getPageNode(l10n("fetchingPageTitle"), ctx);
        HTMLNode pageNode = page.outer;
        String location = getLink(key, requestedMimeType, maxSize, httprequest.getParam("force", null), httprequest.isParameterSet("forcedownload"), maxRetries, overrideSize);
        HTMLNode headNode=page.headNode;
        if(isJsEnabled){
          //If the user has enabled javascript, we add a <noscript> http refresh(if he has disabled it in the browser)
          headNode.addChild("noscript").addChild("meta", "http-equiv", "Refresh").addAttribute("content", "2;URL=" + location);
            // If pushing is disabled, but js is enabled, then we add the original progresspage.js
            if ((isWebPushingEnabled = ctx.getContainer().isFProxyWebPushingEnabled()) == false) {
              HTMLNode scriptNode = headNode.addChild("script", "//abc");
              scriptNode.addAttribute("type", "text/javascript");
              scriptNode.addAttribute("src", "/static/js/progresspage.js");
            }
        }else{
          //If he disabled it, we just put the http refresh meta, without the noscript
          headNode.addChild("meta", "http-equiv", "Refresh").addAttribute("content", "2;URL=" + location);
        }
        HTMLNode contentNode = page.content;
        HTMLNode infobox = contentNode.addChild("div", "class", "infobox infobox-information");
        infobox.addChild("div", "class", "infobox-header", l10n("fetchingPageBox"));
        HTMLNode infoboxContent = infobox.addChild("div", "class", "infobox-content");
        infoboxContent.addAttribute("id", "infoContent");
        infoboxContent.addChild(new ProgressInfoElement(fetchTracker, key, fctx, maxSize, ctx.isAdvancedModeEnabled(), ctx, isWebPushingEnabled));


        HTMLNode table = infoboxContent.addChild("table", "border", "0");
        HTMLNode progressCell = table.addChild("tr").addChild("td", "class", "request-progress");
        if(fr.totalBlocks <= 0)
          progressCell.addChild("#", NodeL10n.getBase().getString("QueueToadlet.unknown"));
        else {
          progressCell.addChild(new ProgressBarElement(fetchTracker,key,fctx,maxSize,ctx, isWebPushingEnabled));
        }

        infobox = contentNode.addChild("div", "class", "infobox infobox-information");
        infobox.addChild("div", "class", "infobox-header", l10n("fetchingPageOptions"));
        infoboxContent = infobox.addChild("div", "class", "infobox-content");

        HTMLNode optionList = infoboxContent.addChild("ul");
        optionList.addChild("li").addChild("p", l10n("progressOptionZero"));

        addDownloadOptions(ctx, optionList, key, mimeType, false, false, core);

        optionList.addChild("li").addChild(ctx.getPageMaker().createBackLink(ctx, l10n("goBackToPrev")));
        optionList.addChild("li").addChild("a", new String[] { "href", "title" },
            new String[] { "/", NodeL10n.getBase().getString("Toadlet.homepage") }, l10n("abortToHomepage"));

        MultiValueTable<String, String> retHeaders = new MultiValueTable<String, String>();
        //retHeaders.put("Refresh", "2; url="+location);
        writeHTMLReply(ctx, 200, "OK", retHeaders, pageNode.generate());
        fr.close();
        fetch.close();
        return;
      } else if(fr != null)
        fr.close();
      }

    try {
      if(logMINOR)
        Logger.minor(this, "FProxy fetching "+key+" ("+maxSize+ ')');
      if(data == null && fe == null) {
        boolean needsFetch=true;
        //If we don't have the data, then check if an FProxyFetchInProgress has. It can happen when one FetchInProgress downloaded an image
        //asynchronously, then loads it. This way a FetchInprogress will have the full image, and no need to block.
        FProxyFetchInProgress progress=fetchTracker.getFetchInProgress(key, maxSize, fctx);
        if(progress!=null){
          FProxyFetchWaiter waiter=null;
          FProxyFetchResult result=null;
          try{
            waiter=progress.getWaiter();
            result=waiter.getResult(false);
            if(result.failed==null && result.data!=null){
              mimeType=result.mimeType;
              data=result.data;
              data=ctx.getBucketFactory().makeBucket(result.data.size());
              BucketTools.copy(result.data, data);
              needsFetch=false;
            }
          }finally{
            if(waiter!=null){
              progress.close(waiter);
            }
            if(result!=null){
              progress.close(result);
            }
          }
        }
        if(needsFetch){
          //If we don't have the data, then we need to fetch it and block until it is available
          FetchResult result = fetch(key, maxSize, new RequestClient() {
            @Override
            public boolean persistent() {
              return false;
            }
            @Override
            public boolean realTimeFlag() {
              return true;
            } }, fctx);

          // Now, is it safe?

          data = result.asBucket();
          mimeType = result.getMimeType();
        }
      } else if(fe != null) throw fe;

      handleDownload(ctx, data, ctx.getBucketFactory(), mimeType, requestedMimeType, forceString, httprequest.isParameterSet("forcedownload"), "/", key, "&max-size="+maxSizeDownload, referer, true, ctx, core, fr != null, maybeCharset);
    } catch (FetchException e) {
      //Handle exceptions thrown from the ContentFilter
      String msg = e.getMessage();
      if(logMINOR) {
        Logger.minor(this, "Failed to fetch "+uri+" : "+e);
      }
      if(e.newURI != null) {
        if(accept != null && (accept.startsWith("text/css") || accept.startsWith("image/")) && recursion++ < MAX_RECURSION) {
          // If it's an image or a CSS fetch, auto-follow the redirect, up to a limit.
          String link = getLink(e.newURI, requestedMimeType, maxSize, httprequest.getParam("force", null), httprequest.isParameterSet("forcedownload"), maxRetries, overrideSize);
          try {
            uri = new URI(link);
            innerHandleMethodGET(uri, httprequest, ctx, recursion);
            return;
          } catch (URISyntaxException e1) {
            Logger.error(this, "Caught "+e1+" parsing new link "+link, e1);
          }
        }
        Toadlet.writePermanentRedirect(ctx, msg,
          getLink(e.newURI, requestedMimeType, maxSize, httprequest.getParam("force", null), httprequest.isParameterSet("forcedownload"), maxRetries, overrideSize));
      } else if(e.mode == FetchExceptionMode.TOO_BIG) {
        PageNode page = ctx.getPageMaker().getPageNode(l10n("fileInformationTitle"), ctx);
        HTMLNode pageNode = page.outer;
        HTMLNode contentNode = page.content;

        HTMLNode infobox = contentNode.addChild("div", "class", "infobox infobox-information");
        infobox.addChild("div", "class", "infobox-header", l10n("largeFile"));
        HTMLNode infoboxContent = infobox.addChild("div", "class", "infobox-content");
        HTMLNode fileInformationList = infoboxContent.addChild("ul");
        HTMLNode option = fileInformationList.addChild("li");
        option.addChild("#", (l10n("filenameLabel") + ' '));
        option.addChild("a", "href", '/' + key.toString(), getFilename(key, e.getExpectedMimeType()));

        String mime = writeSizeAndMIME(fileInformationList, e);

        infobox = contentNode.addChild("div", "class", "infobox infobox-information");
        infobox.addChild("div", "class", "infobox-header", l10n("explanationTitle"));
        infoboxContent = infobox.addChild("div", "class", "infobox-content");
        infoboxContent.addChild("#", l10n("largeFileExplanationAndOptions"));
        HTMLNode optionList = infoboxContent.addChild("ul");
        //HTMLNode optionTable = infoboxContent.addChild("table", "border", "0");
        if(!restricted) {
          option = optionList.addChild("li");
          HTMLNode optionForm = option.addChild("form", new String[] { "action", "method" }, new String[] {'/' + key.toString(), "get" });
          optionForm.addChild("input", new String[] { "type", "name", "value" }, new String[] { "hidden", "max-size", String.valueOf(e.expectedSize == -1 ? Long.MAX_VALUE : e.expectedSize*2) });
          if (requestedMimeType != null)
            optionForm.addChild("input", new String[] { "type", "name", "value" }, new String[] { "hidden", "type", requestedMimeType });
          if(maxRetries >= -1)
            optionForm.addChild("input", new String[] { "type", "name", "value" }, new String[] { "hidden", "max-retries", Integer.toString(maxRetries) });
          optionForm.addChild("input", new String[] { "type", "name", "value" }, new String[] { "submit", "fetch", l10n("fetchLargeFileAnywayAndDisplayButton") });
          optionForm.addChild("#", " - " + l10n("fetchLargeFileAnywayAndDisplay"));
          addDownloadOptions(ctx, optionList, key, mime, false, false, core);
        }


        //optionTable.addChild("tr").addChild("td", "colspan", "2").addChild("a", new String[] { "href", "title" }, new String[] { "/", NodeL10n.getBase().getString("Toadlet.homepage") }, l10n("abortToHomepage"));
        optionList.addChild("li").addChild("a", new String[] { "href", "title" }, new String[] { "/", NodeL10n.getBase().getString("Toadlet.homepage") }, l10n("abortToHomepage"));

        //option = optionTable.addChild("tr").addChild("td", "colspan", "2");
        optionList.addChild("li").addChild(ctx.getPageMaker().createBackLink(ctx, l10n("goBackToPrev")));

        writeHTMLReply(ctx, 200, "OK", pageNode.generate());
      } else {
        PageNode page = ctx.getPageMaker().getPageNode(e.getShortMessage(), ctx);
        HTMLNode pageNode = page.outer;
        HTMLNode contentNode = page.content;

        HTMLNode infobox = contentNode.addChild("div", "class", "infobox infobox-error");
        infobox.addChild("div", "class", "infobox-header", l10n("errorWithReason", "error", e.getShortMessage()));
        HTMLNode infoboxContent = infobox.addChild("div", "class", "infobox-content");
        HTMLNode fileInformationList = infoboxContent.addChild("ul");
        HTMLNode option = fileInformationList.addChild("li");
        option.addChild("#", (l10n("filenameLabel") + ' '));
        option.addChild("a", "href", '/' + key.toString(), getFilename(key, e.getExpectedMimeType()));

        String mime = writeSizeAndMIME(fileInformationList, e);
        infobox = contentNode.addChild("div", "class", "infobox infobox-error");
        infobox.addChild("div", "class", "infobox-header", l10n("explanationTitle"));
        UnsafeContentTypeException filterException = null;
        if(e.getCause() != null && e.getCause() instanceof UnsafeContentTypeException) {
          filterException = (UnsafeContentTypeException)e.getCause();
        }
        infoboxContent = infobox.addChild("div", "class", "infobox-content");
        if(filterException == null)
          infoboxContent.addChild("p", l10n("unableToRetrieve"));
        else
          infoboxContent.addChild("p", l10n("unableToSafelyDisplay"));
        if(e.isFatal() && filterException == null)
          infoboxContent.addChild("p", l10n("errorIsFatal"));
        infoboxContent.addChild("p", msg);
        if(filterException != null) {
          if(filterException.details() != null) {
            HTMLNode detailList = infoboxContent.addChild("ul");
            for(String detail : filterException.details()) {
              detailList.addChild("li", detail);
            }
          }
        }
        if(e.errorCodes != null) {
          infoboxContent.addChild("p").addChild("pre").addChild("#", e.errorCodes.toVerboseString());
        }

        infobox = contentNode.addChild("div", "class", "infobox infobox-error");
        infobox.addChild("div", "class", "infobox-header", l10n("options"));
        infoboxContent = infobox.addChild("div", "class", "infobox-content");

        HTMLNode optionList = infoboxContent.addChild("ul");

        PluginInfoWrapper keyUtil;
        if((e.mode == FetchExceptionMode.NOT_IN_ARCHIVE || e.mode == FetchExceptionMode.NOT_ENOUGH_PATH_COMPONENTS)) {
          // first look for the newest version
          if ((keyUtil = core.node.pluginManager.getPluginInfo("plugins.KeyUtils.KeyUtilsPlugin")) != null) {
            option = optionList.addChild("li");
            if (keyUtil.getPluginLongVersion() < 5010)
              NodeL10n.getBase().addL10nSubstitution(option, "FProxyToadlet.openWithKeyExplorer", new String[] { "link" }, new HTMLNode[] { HTMLNode.link("/KeyUtils/?automf=true&key=" + key.toString()) });
            else {
              NodeL10n.getBase().addL10nSubstitution(option, "FProxyToadlet.openWithKeyExplorer", new String[] { "link" }, new HTMLNode[] { HTMLNode.link("/KeyUtils/?key=" + key.toString()) });
              option = optionList.addChild("li");
              NodeL10n.getBase().addL10nSubstitution(option, "FProxyToadlet.openWithSiteExplorer", new String[] { "link" }, new HTMLNode[] { HTMLNode.link("/KeyUtils/Site?key=" + key.toString()) });
            }
          } else if ((keyUtil = core.node.pluginManager.getPluginInfo("plugins.KeyExplorer.KeyExplorer")) != null) {
            option = optionList.addChild("li");
            if (keyUtil.getPluginLongVersion() > 4999)
              NodeL10n.getBase().addL10nSubstitution(option, "FProxyToadlet.openWithKeyExplorer", new String[] { "link" }, new HTMLNode[] { HTMLNode.link("/KeyExplorer/?automf=true&key=" + key.toString())});
            else
              NodeL10n.getBase().addL10nSubstitution(option, "FProxyToadlet.openWithKeyExplorer", new String[] { "link" }, new HTMLNode[] { HTMLNode.link("/plugins/plugins.KeyExplorer.KeyExplorer/?key=" + key.toString())});
          }
        }
        if(filterException != null) {
          if((mime.equals("application/x-freenet-index")) && (core.node.pluginManager.isPluginLoaded("plugins.ThawIndexBrowser.ThawIndexBrowser"))) {
            option = optionList.addChild("li");
            NodeL10n.getBase().addL10nSubstitution(option, "FProxyToadlet.openAsThawIndex", new String[] { "link" }, new HTMLNode[] { HTMLNode.link("/plugins/plugins.ThawIndexBrowser.ThawIndexBrowser/?key=" + key.toString()).addChild("b") });
          }
          option = optionList.addChild("li");
          // FIXME: is this safe? See bug #131
          MediaType textMediaType = new MediaType("text/plain");
          textMediaType.setParameter("charset", (e.getExpectedMimeType() != null) ? MediaType.getCharsetRobust(e.getExpectedMimeType()) : null);
          NodeL10n.getBase().addL10nSubstitution(option, "FProxyToadlet.openAsText", new String[] { "link" }, new HTMLNode[] { HTMLNode.link(getLink(key, textMediaType.toString(), maxSize, null, false, maxRetries, overrideSize)) });
          option = optionList.addChild("li");
          NodeL10n.getBase().addL10nSubstitution(option, "FProxyToadlet.openForceDisk", new String[] { "link" }, new HTMLNode[] { HTMLNode.link(getLink(key, mime, maxSize, null, true, maxRetries, overrideSize)) });
          if(!(mime.equals("application/octet-stream") || mime.equals("application/x-msdownload") || !DefaultMIMETypes.isPlausibleMIMEType(mime))) {
            option = optionList.addChild("li");
            NodeL10n.getBase().addL10nSubstitution(option, "FProxyToadlet.openForce", new String[] { "link", "mime" }, new HTMLNode[] { HTMLNode.link(getLink(key, mime, maxSize, getForceValue(key, now), false, maxRetries, overrideSize)), HTMLNode.text(HTMLEncoder.encode(mime))});
          }
        }

        if((!e.isFatal() || filterException != null) && (ctx.isAllowedFullAccess() || !container.publicGatewayMode())) {
          addDownloadOptions(ctx, optionList, key, mimeType, filterException != null, filterException != null, core);
          if(filterException == null)
            optionList.addChild("li").
              addChild("a", "href", getLink(key, requestedMimeType, maxSize, httprequest.getParam("force", null),
                  httprequest.isParameterSet("forcedownload"), maxRetries, overrideSize)).addChild("#", l10n("retryNow"));
        }

        optionList.addChild("li").addChild("a", new String[] { "href", "title" }, new String[] { "/", NodeL10n.getBase().
            getString("Toadlet.homepage") }, l10n("abortToHomepage"));

        optionList.addChild("li").addChild(ctx.getPageMaker().createBackLink(ctx, l10n("goBackToPrev")));
        this.writeHTMLReply(ctx, (e.mode == FetchExceptionMode.NOT_IN_ARCHIVE) ? 404 : 500 /* close enough - FIXME probably should depend on status code */,
            "Internal Error", pageNode.generate());
      }
    } catch (SocketException e) {
      // Probably irrelevant
      if(e.getMessage().equals("Broken pipe")) {
        if(logMINOR)
          Logger.minor(this, "Caught "+e+" while handling GET", e);
      } else {
        Logger.normal(this, "Caught "+e);
      }
      throw e;
    } catch (Throwable t) {
      writeInternalError(t, ctx);
    } finally {
      if(fr == null && data != null) data.free();
      if(fr != null) fr.close();
    }
  }
View Full Code Here

Examples of freenet.support.api.Bucket

    }
    FreenetURI[] hintURIs = hint.getInsertURIs(privUSK);
    boolean added = false;
    for(FreenetURI uri : hintURIs) {
      try {
        Bucket bucket = BucketTools.makeImmutableBucket(context.getBucketFactory(persistent), hintData);
        SingleBlockInserter sb =
          new SingleBlockInserter(parent, bucket, (short) -1, uri,
              ctx, realTimeFlag, m, false, sourceLength, token, true, true /* we don't use it */, null, context, persistent, true, extraInserts, cryptoAlgorithm, forceCryptoKey);
        Logger.normal(this, "Inserting "+uri+" with "+sb+" for insert of "+pubUSK);
        m.add(sb);
View Full Code Here

Examples of freenet.support.api.Bucket

        if(consecutiveCollisions > MAX_TRIED_SLOTS)
          scheduleFetcher(context);
        else
          scheduleInsert(context);
      } else {
        Bucket d = null;
        synchronized(this) {
          finished = true;
          if(freeData) {
            d = data;
            data = null;
          }
        }
        if(freeData) {
          d.free();
        }
        cb.onFailure(e, state, context);
      }
    }
  }
View Full Code Here

Examples of freenet.support.api.Bucket

    }
    if (_stream_cache==null) {
      if (_isSingleBucket) {
        _stream_cache = new DataOutputStream(_out.getOutputStream());
      } else {
        Bucket newBucket = _bf.makeBucket(-1);
        _buckets.add(newBucket);
        _stream_cache = new DataOutputStream(newBucket.getOutputStream());
      }
    }
    if (!_started) {
      BinaryBlob.writeBinaryBlobHeader(_stream_cache);
      _started = true;
View Full Code Here

Examples of freenet.support.api.Bucket

    if(logMINOR) Logger.minor(this, "Finalizing binary blob "+this, new Exception("debug"));
    if (!_isSingleBucket) {
      if (!mark && (_buckets.size()==1)) {
        return;
      }
      Bucket out = _bf.makeBucket(-1);
      getSnapshot(out, mark);
      for (int i=0,n=_buckets.size(); i<n;i++) {
        _buckets.get(i).free();
      }
      if (mark) {
        out.setReadOnly();
      }
      _buckets.clear();
      _buckets.add(0, out);
    } else if (mark){
      DataOutputStream out = new DataOutputStream(getOutputStream());
      try {
      BinaryBlob.writeEndBlob(out);
      } finally {
      out.close();
      }
    }
    if (mark) {
      _finalized = true;
    }
View Full Code Here

Examples of freenet.support.api.Bucket

  }
 
  @Override
  public String getPartAsStringThrowing(String name, int maxLength) throws NoSuchElementException, SizeLimitExceededException {
    if(freedParts) throw new IllegalStateException("Already freed");
    Bucket part = this.parts.get(name);
   
    if(part == null)
      throw new NoSuchElementException(name);
   
    if(part.size() > maxLength)
      throw new SizeLimitExceededException();
   
    return getPartAsLimitedString(part, maxLength);
  }
View Full Code Here
TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.