Package org.apache.airavata.api.server.handler

Source Code of org.apache.airavata.api.server.handler.ApplicationCatalogHandler

/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*   http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/

package org.apache.airavata.api.server.handler;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.airavata.api.appcatalog.ApplicationCatalogAPI.Iface;
import org.apache.airavata.api.appcatalog.applicationCatalogAPIConstants;
import org.apache.airavata.common.exception.AiravataConfigurationException;
import org.apache.airavata.commons.gfac.type.ApplicationDescription;
import org.apache.airavata.commons.gfac.type.HostDescription;
import org.apache.airavata.commons.gfac.type.ServiceDescription;
import org.apache.airavata.model.appcatalog.ApplicationDeployment;
import org.apache.airavata.model.appcatalog.ApplicationDescriptor;
import org.apache.airavata.model.appcatalog.ApplicationInterface;
import org.apache.airavata.model.appcatalog.ComputeResourceDescription;
import org.apache.airavata.model.appcatalog.DataMovementProtocol;
import org.apache.airavata.model.appcatalog.GSISSHJobSubmission;
import org.apache.airavata.model.appcatalog.GlobusJobSubmission;
import org.apache.airavata.model.appcatalog.GridFTPDataMovement;
import org.apache.airavata.model.appcatalog.JobSubmissionProtocol;
import org.apache.airavata.model.appcatalog.ResourceJobManager;
import org.apache.airavata.model.appcatalog.SCPDataMovement;
import org.apache.airavata.model.appcatalog.SSHJobSubmission;
import org.apache.airavata.model.appcatalog.SecurityProtocol;
import org.apache.airavata.model.error.AiravataClientException;
import org.apache.airavata.model.error.AiravataSystemException;
import org.apache.airavata.model.error.InvalidRequestException;
import org.apache.airavata.registry.api.AiravataRegistry2;
import org.apache.airavata.registry.api.AiravataRegistryFactory;
import org.apache.airavata.registry.api.AiravataUser;
import org.apache.airavata.registry.api.Gateway;
import org.apache.airavata.registry.api.exception.RegException;
import org.apache.airavata.schemas.gfac.ExportProperties;
import org.apache.airavata.schemas.gfac.GlobusHostType;
import org.apache.airavata.schemas.gfac.GsisshHostType;
import org.apache.airavata.schemas.gfac.SSHHostType;
import org.apache.thrift.TException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ApplicationCatalogHandler implements Iface {
    private static final Logger logger = LoggerFactory.getLogger(AiravataServerHandler.class);

  AiravataRegistry2 registry;
  private AiravataRegistry2 getRegistry() throws RegException, AiravataConfigurationException{
     if (registry==null){
       registry = AiravataRegistryFactory.getRegistry(new Gateway("default"), new AiravataUser("admin"));
     }
    return registry;
  }
 
  @Override
  public String GetAPIVersion() throws TException {
    return applicationCatalogAPIConstants.AIRAVATA_API_VERSION;
  }

  @Override
  public String addComputeResourceDescription(
      ComputeResourceDescription computeResourceDescription)
      throws InvalidRequestException, AiravataClientException,
      AiravataSystemException, TException {
    try {
      if (getRegistry().isHostDescriptorExists(computeResourceDescription.getHostName())){
        getRegistry().removeHostDescriptor(computeResourceDescription.getHostName());
      }
    } catch (Exception e1) {
      e1.printStackTrace();
    }
    HostDescription host = new HostDescription();
    host.getType().setHostName(computeResourceDescription.getHostName());
    if (computeResourceDescription.getIpAddressesSize()>0){
      host.getType().setHostAddress(computeResourceDescription.getIpAddresses().iterator().next())
    }
    if (computeResourceDescription.getJobSubmissionProtocolsSize()>0){
      String jobSubmissionProtocolDataId=computeResourceDescription.getJobSubmissionProtocols().keySet().iterator().next();
      JobSubmissionProtocol jobSubmissionProtocol = computeResourceDescription.getJobSubmissionProtocols().get(jobSubmissionProtocolDataId);
      switch(jobSubmissionProtocol){
      case SSH:
        SSHJobSubmission sshJobSubmissionProtocol = getSSHJobSubmissionProtocol(jobSubmissionProtocolDataId);
        host.getType().changeType(SSHHostType.type);
        //TODO fill the data
        break;
      case GRAM:
        GlobusJobSubmission globusJobSubmissionProtocol = getGlobusJobSubmissionProtocol(jobSubmissionProtocolDataId);
        host.getType().changeType(GlobusHostType.type);
        //TODO fill the data
        break;
      case GSISSH:
        GSISSHJobSubmission gsisshJobSubmissionProtocol = getGSISSHJobSubmissionProtocol(jobSubmissionProtocolDataId);
        host.getType().changeType(GsisshHostType.type);
        break;
        //TODO fill the data
      default:
        break;
      }
    }
    try {
      getRegistry().addHostDescriptor(host);
      return computeResourceDescription.getHostName();
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
  }
 
  private String generateId(
      String prefix) {
    return prefix+"_"+Calendar.getInstance().getTimeInMillis();
  }

  @Override
  public List<String> listComputeResourceDescriptions()
      throws InvalidRequestException, AiravataClientException,
      AiravataSystemException, TException {
    try {
      List<HostDescription> hostDescriptors = getRegistry().getHostDescriptors();
      List<String> ids = new ArrayList<String>();
      for (HostDescription hostDescription : hostDescriptors) {
        ids.add(hostDescription.getType().getHostName());
      }
      return ids;
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
  }

  @Override
  public ComputeResourceDescription getComputeResourceDescription(
      String computeResourceId) throws InvalidRequestException,
      AiravataClientException, AiravataSystemException, TException {
    try {
      if (getRegistry().isHostDescriptorExists(computeResourceId)) {
        HostDescription hostDescriptor = getRegistry().getHostDescriptor(computeResourceId);
        ComputeResourceDescription d = new ComputeResourceDescription();
        d.setIsEmpty(false);
        d.setResourceId(computeResourceId);
        d.setHostName(hostDescriptor.getType().getHostName());
        d.addToHostAliases(hostDescriptor.getType().getHostName());
        if (hostDescriptor.getType().getHostAddress() != null) {
          d.addToIpAddresses(hostDescriptor.getType()
              .getHostAddress());
        }
        d.setJobSubmissionProtocols(new HashMap<String, JobSubmissionProtocol>());
        d.setDataMovementProtocols(new HashMap<String, DataMovementProtocol>());
        if (hostDescriptor.getType() instanceof SSHHostType) {
          d.getJobSubmissionProtocols().put(computeResourceId,
              JobSubmissionProtocol.SSH);
        } else if (hostDescriptor.getType() instanceof GsisshHostType) {
          d.getJobSubmissionProtocols().put(computeResourceId,
              JobSubmissionProtocol.GSISSH);
        } else if (hostDescriptor.getType() instanceof GlobusHostType) {
          d.getJobSubmissionProtocols().put(computeResourceId,
              JobSubmissionProtocol.GRAM);
          d.getDataMovementProtocols().put(computeResourceId,
              DataMovementProtocol.GridFTP);
        }
        return d;
      } else {
        throw new Exception("Compute Resource Descriptor not found "+computeResourceId+"!!!");
      }
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
   
  }

  @Override
  public SSHJobSubmission getSSHJobSubmissionProtocol(
      String sshJobSubmissionProtocolResourceId)
      throws InvalidRequestException, AiravataClientException,
      AiravataSystemException, TException {
    try {
      HostDescription hostDescriptor = getRegistry().getHostDescriptor(sshJobSubmissionProtocolResourceId);
      SSHJobSubmission d = new SSHJobSubmission();
      d.setJobSubmissionDataID(sshJobSubmissionProtocolResourceId);
      if (hostDescriptor.getType() instanceof SSHHostType){
        d.setSshPort(22);
      } else {
        throw new Exception("Saved job protocol is not SSH");
      }
      return d;
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
  }

  @Override
  public GSISSHJobSubmission getGSISSHJobSubmissionProtocol(
      String gsisshJobSubmissionProtocolResourceId)
      throws InvalidRequestException, AiravataClientException,
      AiravataSystemException, TException {
    try {
      HostDescription hostDescriptor = getRegistry().getHostDescriptor(gsisshJobSubmissionProtocolResourceId);
      GSISSHJobSubmission d = new GSISSHJobSubmission();
      d.setJobSubmissionDataID(gsisshJobSubmissionProtocolResourceId);
      if (hostDescriptor.getType() instanceof GsisshHostType){
        GsisshHostType gsisshHostType = (GsisshHostType)hostDescriptor.getType();
        d.setInstalledPath(gsisshHostType.getInstalledPath());
        d.setMonitorMode(gsisshHostType.getMonitorMode());
        d.setPostJobCommands(Arrays.asList(gsisshHostType.getPostJobCommandsArray()));
        d.setPreJobCommands(Arrays.asList(gsisshHostType.getPreJobCommandsArray()));
        d.setSshPort(gsisshHostType.getPort());
        d.setResourceJobManager(getResourceJobManager(gsisshHostType.getJobManager()));
      } else {
        throw new Exception("Saved job protocol is not GSISSH");
      }
      return d;
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
  }

  private ResourceJobManager getResourceJobManager(String jobManager) {
    ResourceJobManager rjm=ResourceJobManager.SLURM;
    try {
      rjm = ResourceJobManager.valueOf(jobManager.toUpperCase());
    } catch (Exception e) {
      logger.error(jobManager+" does not match a known resource job manager.");
    }
    return rjm;
  }

  @Override
  public GlobusJobSubmission getGlobusJobSubmissionProtocol(
      String globusJobSubmissionProtocolResourceId)
      throws InvalidRequestException, AiravataClientException,
      AiravataSystemException, TException {
    try {
      HostDescription hostDescriptor = getRegistry().getHostDescriptor(globusJobSubmissionProtocolResourceId);
      GlobusJobSubmission d = new GlobusJobSubmission();
      d.setSecurityProtocol(SecurityProtocol.GSI);
      d.setResourceJobManager(ResourceJobManager.PBS);
      d.setJobSubmissionDataID(globusJobSubmissionProtocolResourceId);
      if (hostDescriptor.getType() instanceof GlobusHostType){
        GlobusHostType globusHostType = (GlobusHostType)hostDescriptor.getType();
        d.setGlobusGateKeeperEndPoint(Arrays.asList(globusHostType.getGlobusGateKeeperEndPointArray()));
      } else {
        throw new Exception("Saved job protocol is not Globus");
      }
      return d;
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
  }

  @Override
  public SCPDataMovement getSCPDataMovementProtocol(
      String scpDataMovementResourceId) throws InvalidRequestException,
      AiravataClientException, AiravataSystemException, TException {
    try {
      HostDescription hostDescriptor = getRegistry().getHostDescriptor(scpDataMovementResourceId);
      SCPDataMovement d = new SCPDataMovement();
      d.setDataMovementDataID(scpDataMovementResourceId);
      if (hostDescriptor.getType() instanceof GlobusHostType){
        GlobusHostType globusHostType = (GlobusHostType)hostDescriptor.getType();
        d.setSshPort(22);
      } else {
        throw new Exception("Saved job protocol is not GSISSH");
      }
      return d;
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
  }

  @Override
  public boolean isComputeResourceDescriptionRegistered(String hostName)
      throws InvalidRequestException, AiravataClientException,
      AiravataSystemException, TException {
    try {
      return getRegistry().isHostDescriptorExists(hostName);
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
  }

  @Override
  public ComputeResourceDescription getComputeResourceDescriptionFromHostName(
      String hostName) throws InvalidRequestException,
      AiravataClientException, AiravataSystemException, TException {
    // TODO Auto-generated method stub
    return null;
  }

  @Override
  public String addApplicationInterface(
      ApplicationInterface applicationInterface)
      throws InvalidRequestException, AiravataClientException,
      AiravataSystemException, TException {
    try {
      ServiceDescription serviceDescription = ServiceDescription.fromXML(applicationInterface.getApplicationInterfaceData());
      try {
        if (getRegistry().isServiceDescriptorExists(serviceDescription.getType().getName())){
          getRegistry().removeServiceDescriptor(serviceDescription.getType().getName());
        }
      } catch (Exception e1) {
        e1.printStackTrace();
      }
      getRegistry().addServiceDescriptor(serviceDescription);
      if (applicationInterface.getApplicationDeploymentsSize()>0) {
        List<ApplicationDeployment> applicationDeployments = applicationInterface
            .getApplicationDeployments();
        for (ApplicationDeployment deployment : applicationDeployments) {
          String hostId = deployment.getComputeResourceDescription()
              .getResourceId();
          ApplicationDescriptor applicationDescriptor = deployment
              .getApplicationDescriptor();
          getRegistry().addApplicationDescriptor(
              serviceDescription.getType().getName(),
              hostId,
              ApplicationDescription
                  .fromXML(applicationDescriptor
                      .getApplicationDescriptorData()));
        }
      }
      return serviceDescription.getType().getName();
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
   
  }

  @Override
  public List<String> listApplicationInterfaceIds()
      throws InvalidRequestException, AiravataClientException,
      AiravataSystemException, TException {
    try {
      List<String> ids=new ArrayList<String>();
      List<ServiceDescription> serviceDescriptors = getRegistry().getServiceDescriptors();
      for (ServiceDescription serviceDescription : serviceDescriptors) {
        ids.add(serviceDescription.getType().getName());
      }
      return ids;
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
  }

  @Override
  public ApplicationInterface getApplicationInterface(
      String applicationInterfaceId) throws InvalidRequestException,
      AiravataClientException, AiravataSystemException, TException {
    try {
      ServiceDescription serviceDescriptor = getRegistry().getServiceDescriptor(applicationInterfaceId);
      ApplicationInterface applicationInterface = new ApplicationInterface();
      applicationInterface.setApplicationInterfaceId(applicationInterfaceId);
      applicationInterface.setApplicationInterfaceData(serviceDescriptor.toXML());
      Map<String, ApplicationDescription> applicationDescriptors = getRegistry().getApplicationDescriptors(applicationInterfaceId);
      for (String hostId : applicationDescriptors.keySet()) {
        ApplicationDeployment applicationDeployment = new ApplicationDeployment();
        applicationDeployment.setComputeResourceDescription(getComputeResourceDescription(hostId));
        ApplicationDescriptor applicationDescriptor = new ApplicationDescriptor();
        applicationDescriptor.setApplicationDescriptorId(applicationDescriptors.get(hostId).getType().getApplicationName().getStringValue());
        applicationDescriptor.setApplicationDescriptorData(applicationDescriptors.get(hostId).toXML());
        applicationDeployment.setApplicationDescriptor(applicationDescriptor);
        applicationInterface.addToApplicationDeployments(applicationDeployment);
      }
      return applicationInterface;
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
  }

  @Override
  public String addApplicationDeployment(String applicationInterfaceId,
      ApplicationDeployment applicationDeployment)
      throws InvalidRequestException, AiravataClientException,
      AiravataSystemException, TException {
    try {
      ApplicationDescription appDescription = ApplicationDescription.fromXML(applicationDeployment.getApplicationDescriptor().getApplicationDescriptorData());
      getRegistry().addApplicationDescriptor(applicationInterfaceId, applicationDeployment.getComputeResourceDescription().getResourceId(), appDescription);
      return appDescription.getType().getApplicationName().getStringValue();
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
  }

  @Override
  public List<String> listApplicationDeploymentIds(String applicationInterfaceId)
      throws InvalidRequestException, AiravataClientException,
      AiravataSystemException, TException {
    try {
      List<String> ids=new ArrayList<String>();
      Map<String, ApplicationDescription> applicationDescriptors = getRegistry().getApplicationDescriptors(applicationInterfaceId);
      for (String hostId : applicationDescriptors.keySet()) {
        ids.add(applicationDescriptors.get(hostId).getType().getApplicationName().getStringValue());
      }
      return ids;
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
  }

  @Override
  public ApplicationDeployment getApplicationDeployment(String applicationInterfaceId,
      String applicationDeploymentId) throws InvalidRequestException,
      AiravataClientException, AiravataSystemException, TException {
    try {
      Map<String, ApplicationDescription> applicationDescriptors = getRegistry().getApplicationDescriptors(applicationInterfaceId);
      for (String hostId : applicationDescriptors.keySet()) {
        if (applicationDescriptors.get(hostId).getType().getApplicationName().getStringValue().equals(applicationDeploymentId)){
          ApplicationDeployment applicationDeployment = new ApplicationDeployment();
          applicationDeployment.setDeploymentId(applicationDescriptors.get(hostId).getType().getApplicationName().getStringValue());
          ApplicationDescriptor applicationDescriptor=new ApplicationDescriptor();
          applicationDescriptor.setApplicationDescriptorId(applicationDescriptors.get(hostId).getType().getApplicationName().getStringValue());
          applicationDescriptor.setApplicationDescriptorData(applicationDescriptors.get(hostId).toXML());
          applicationDeployment.setApplicationDescriptor(applicationDescriptor);
          applicationDeployment.setComputeResourceDescription(getComputeResourceDescription(hostId));
          return applicationDeployment;
        }
      }
      return null;
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
  }

  @Override
  public String addSSHJobSubmissionProtocol(String computeResourceId,
      SSHJobSubmission jobSubmission) throws InvalidRequestException,
      AiravataClientException, AiravataSystemException, TException {
    try {
      HostDescription hostDescriptor = getRegistry().getHostDescriptor(computeResourceId);
      hostDescriptor.getType().changeType(SSHHostType.type);
      SSHHostType s = (SSHHostType)hostDescriptor.getType();
      getRegistry().updateHostDescriptor(hostDescriptor);
      return computeResourceId;
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
   
  }

  @Override
  public String addGSISSHJobSubmissionProtocol(String computeResourceId,
      GSISSHJobSubmission jobSubmission) throws InvalidRequestException,
      AiravataClientException, AiravataSystemException, TException {
    try {
      HostDescription hostDescriptor = getRegistry().getHostDescriptor(computeResourceId);
      hostDescriptor.getType().changeType(GsisshHostType.type);
      GsisshHostType s = (GsisshHostType)hostDescriptor.getType();
      s.setInstalledPath(jobSubmission.getInstalledPath());
      ExportProperties exports = s.addNewExports();
      if (jobSubmission.getExportsSize()>0) {
        for (String export : jobSubmission.getExports()) {
          exports.addNewName().setValue(export);
        }
      }
      s.setExports(exports);
      s.setJobManager(jobSubmission.getResourceJobManager().toString());
      s.setMonitorMode(jobSubmission.getMonitorMode());
      s.setPort(22);
      if (jobSubmission.getPostJobCommandsSize()>0) {
        s.setPostJobCommandsArray(jobSubmission.getPostJobCommands()
            .toArray(new String[] {}));
      }
      if (jobSubmission.getPreJobCommandsSize()>0) {
        s.setPreJobCommandsArray(jobSubmission.getPreJobCommands()
            .toArray(new String[] {}));
      }
      getRegistry().updateHostDescriptor(hostDescriptor);
      return computeResourceId;
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
  }

  @Override
  public String addGlobusJobSubmissionProtocol(String computeResourceId,
      GlobusJobSubmission jobSubmission) throws InvalidRequestException,
      AiravataClientException, AiravataSystemException, TException {
    try {
      HostDescription hostDescriptor = getRegistry().getHostDescriptor(computeResourceId);
      hostDescriptor.getType().changeType(GlobusHostType.type);
      GlobusHostType s = (GlobusHostType)hostDescriptor.getType();
      if (jobSubmission.getGlobusGateKeeperEndPointSize()>0) {
        s.setGlobusGateKeeperEndPointArray(jobSubmission
            .getGlobusGateKeeperEndPoint().toArray(new String[] {}));
      }
      getRegistry().updateHostDescriptor(hostDescriptor);
      return computeResourceId;
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
  }

  @Override
  public String addSCPDataMovementProtocol(String computeResourceId,
      SCPDataMovement dataMovement) throws InvalidRequestException,
      AiravataClientException, AiravataSystemException, TException {
    try {
      HostDescription hostDescriptor = getRegistry().getHostDescriptor(computeResourceId);
      hostDescriptor.getType().changeType(GlobusHostType.type);
      GlobusHostType s = (GlobusHostType)hostDescriptor.getType();
//      s.setGlobusGateKeeperEndPointArray(dataMovement.getGlobusGateKeeperEndPoint().toArray(new String[]{}));
      getRegistry().updateHostDescriptor(hostDescriptor);
      return computeResourceId;
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
   
  }

  @Override
  public String addGridFTPDataMovementProtocol(String computeResourceId,
      GridFTPDataMovement dataMovement) throws InvalidRequestException,
      AiravataClientException, AiravataSystemException, TException {
    try {
      HostDescription hostDescriptor = getRegistry().getHostDescriptor(computeResourceId);
      hostDescriptor.getType().changeType(GlobusHostType.type);
      GlobusHostType s = (GlobusHostType)hostDescriptor.getType();
      if (dataMovement.getGridFTPEndPointSize()>0) {
        s.setGridFTPEndPointArray(dataMovement.getGridFTPEndPoint()
            .toArray(new String[] {}));
      }
      getRegistry().updateHostDescriptor(hostDescriptor);
      return computeResourceId;
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
  }

  @Override
  public GridFTPDataMovement getGridFTPDataMovementProtocol(
      String gridFTPDataMovementResourceId)
      throws InvalidRequestException, AiravataClientException,
      AiravataSystemException, TException {
    try {
      GridFTPDataMovement gridFTPDataMovement = new GridFTPDataMovement();
      gridFTPDataMovement.setDataMovementDataID(gridFTPDataMovementResourceId);
      HostDescription hostDescriptor = getRegistry().getHostDescriptor(gridFTPDataMovementResourceId);
      GlobusHostType s = (GlobusHostType)hostDescriptor.getType();
      gridFTPDataMovement.setGridFTPEndPoint(Arrays.asList(s.getGridFTPEndPointArray()));
      gridFTPDataMovement.setSecurityProtocol(SecurityProtocol.GSI);
      return gridFTPDataMovement;
    } catch (Exception e) {
      e.printStackTrace();
      throw new AiravataSystemException();
    }
  }
 
}
TOP

Related Classes of org.apache.airavata.api.server.handler.ApplicationCatalogHandler

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.