Skip to main content

Справочник программиста Primavera Integration API

Введение

API интеграция предоставляет гибкий объектно-ориентированный интерфейс для управления проектами Primavera. API – это кроссплатформенный интерфейс на основе Java.

В данной статье описано, как использовать API Primavera

Режим работы

API предназначен для работы в двух режимах: Локальном or Удаленном.

В локальном режиме клиентский код выполняется на той же виртуальной машине Java (JVM), где установлен сервер. Java Remote Method Invocation (RMI) не используется, и API напрямую связывается с кодом бизнес-логики на сервере (механизм бизнес-логики). Локальный режим полезен, когда клиентский код API должен быть развернут на том же физическом компьютере, что и внутренний модуль бизнес-логики. Это также может быть полезно для приложений, которым требуется улучшенная производительность, достигаемая за счет отказа от уровня RMI. Конечно, локальный режим можно вызывать непосредственно со страниц JSP, которые развернуты как часть веб-приложения.

В удаленном режиме клиентский код выполняется на другом компьютере, и для связи используется удаленный вызов методов Java (RMI). Несколько клиентов могут взаимодействовать с сервером интеграции одновременно.

Примечание. Максимальное количество клиентов, которые могут одновременно получить доступ к удаленному серверу, составляет приблизительно 50. Это число может быть меньше в зависимости от множества факторов, включая системное оборудование, конфигурацию сети или количество доступных лицензий.

Существует три возможных режима обслуживания для сервера RMI: Стандартный, Сжатие и SSL. По умолчанию все три режима включены. Серверу RMI также требуется реестр RMI, который по умолчанию прослушивает порт 9099. Вы можете изменить настройки по умолчанию для сервера RMI с помощью инструмента «Администратор», который можно запустить с помощью admin.cmd (admin.sh для Solaris). Следующие параметры можно найти в разделе Configurations\Custom\<Configuration Name>\IntegrationServer\RMI:

Enable – включено (true) или отключено (false) RMI сервер (по умолчанию true).

RegistryPort – Порт для реестра RMI (по умолчанию 9099).

StandardServiceEnable – включен (true) или отключен (false) стандартный сервисный режим (по умолчанию true).

StandardServicePort – Порт для использования в стандартном режиме обслуживания. Значение 0 (по умолчанию) означает, что будет использоваться любой доступный порт. Если доступ к серверу будет осуществляться через брандмауэр, то необходимо установить для него определенный порт.

CompressionServiceEnable – включает (true) или отключает (false) режим службы сжатия (по умолчанию true).

CompressionServicePort – порт для использования в режиме службы сжатия. Значение 0 (по умолчанию) означает, что будет использоваться любой доступный порт. Если доступ к серверу будет осуществляться через брандмауэр, то необходимо установить для него определенный порт.

SSLServiceEnable – включает (true) или отключает (false) SSL режим (по умолчанию true).

SSLServicePort – порт для режима SSL. Значение 0 (по умолчанию) означает, что будет использоваться любой доступный порт. Если доступ к серверу будет осуществляться через брандмауэр, то необходимо установить для него определенный порт.

Если API настроен на использование удаленного режима, режим службы можно выбрать во время выполнения с помощью вспомогательного класса RMIURL: доступны стандартные режимы, режимы сжатия и SSL. Также может использоваться HTTP туннулирование, если выбран режимы HTTP или HTTPS. Эти дополнительные режимы инкапсулируют связь RMI в HTTP, позволяя RMI взаимодействовать через брандмауэр только с одним открытым портом.

Примечание: Веб службы P6, которые выпущены с версией 6.2 должны рассматриваться как альтернатива использованию удаленного режима API интеграции

Наверх

Безопасность

Безопасность прикладного уровня для API интеграции аналогична той, которая используется клиент-серверными продуктами Primavera. Чтобы использовать API, вы должны войти в систему как пользователь. Глобальные и проектные профили безопасности применяются при использовании API, поэтому, если пользователь попытается выполнить действие, которое ограничено профилем безопасности, будет выдан отказ.

Безопасность сетевого уровня достижима при использовании SSL или HTTPS в удаленном режиме. В режиме вызова HTTPS используется HTTP-туннелирование, для которого требуется открыть только один порт в брандмауэре.

Примечание: Возможно так же включить дополнительную безопасность с помощью настраиваемой политики безопасности, в «Диспетчере безопасности Java»

Наверх

Пакеты

Внутри jar-файла классы в следующих пакетах могут быть доступны напрямую из кода:

com.primavera (базовые классы обработки исключений Primavera)
com.primavera.common.exceptions (классы исключений)
com.primavera.common.value (value object classes)
com.primavera.common.value.spread (spread value classes)
com.primavera.integration.client (main classes, including Session, JobManager EnterpriseLoadManager, and GlobalObjectManager)
com.primavera.integration.client.bo (business object base class and iterator classes)
com.primavera.integration.client.bo.enm (typesafe enumerations)
com.primavera.integration.client.bo.helper (business object helper classes)
com.primavera.integration.client.bo.object (client business object classes)
com.primavera.integration.client.xml.exporter (Hierarchical XML exporter and related classes)
com.primavera.integration.client.xml.importer (Hierarchical XML importer and related classes)
com.primavera.integration.client.xml.xmlexporter (Flat XML exporter and related classes – new in version 6.2)
com.primavera.integration.client.xml.xmlimporter (Flat XML importer and related classes – new in version 6.2)
com.primavera.integration.common (general common classes)
com.primavera.integration.network (exception classes for Remote Mode)
com.primavera.integration.util (utility and helper classes)

Другие пакеты в файле jar содержат код только для внутреннего использования.

Наверх

С чего начинать

Если вы планируете писать код для работы с API, необходимо установить Java Software Development Kit (SDK, также известный как JDK) версии 1.5.x. Интегрированная среда разработки (IDE), используемая для написания кода, должна работать с этой версией. Если вы не будете писать код, для запуска приложений, написанных для API, требуется только Java Runtime Environment (JRE) версии 1.5.x.

Код клиента API для удаленного режима содержится в intgclient.jar. Для локального режима код API содержится в intgserver.jar. Файлы jar устанавливаются в каталог lib в каталоге установки API. Чтобы успешно скомпилировать и выполнить код, написанный для API, вам необходимо включить соответствующий файл jar в ваш путь к классам.

Примечание: Для приложений, работающих в локальном режиме, ваш путь к классу должен включать другие файлы jar, которые установлены в каталоге lib в каталоге установки API. В приложениях локального режима также должно быть установлено свойство System «primavera.bootstrap.home», соответствующее каталогу установки. Этот параметр используется сервером для поиска файла BREBootStrap.xml.

Чтобы получить доступ к данным в API, вы должны сначала установить допустимый сессию. Код, написанный для локального режима, аналогичен коду, написанному для удаленного режима, за исключением вызовов Session.getDatabaseInstances () и Session.login (), которые требуют указания соответствующей информации для поиска сервера.

Пример 1: Установить сеанс в локальном режиме и загрузить список проектов

import com.primavera.integration.client.Session;
import com.primavera.integration.client.EnterpriseLoadManager;
import com.primavera.integration.client.RMIURL;
import com.primavera.integration.common.DatabaseInstance;
import com.primavera.integration.client.bo.BOIterator;
import com.primavera.integration.client.bo.object.Project;

public class APITest
{
    public static void main( String[] args )
    {
        Session session = null;
        try
        {
            DatabaseInstance[] dbInstances = Session.getDatabaseInstances(
                RMIURL.getRmiUrl( RMIURL.LOCAL_SERVICE ) );

            // Assume only one database instance for now, and hardcode the username and
            // password for this sample code
            session = Session.login( RMIURL.getRmiUrl( RMIURL.LOCAL_SERVICE ),
                dbInstances[0].getDatabaseId(), "admin", "admin" );

            EnterpriseLoadManager elm = session.getEnterpriseLoadManager();
            BOIterator<Project> boi = elm.loadProjects( new String[]{ "Name" }, null, "Name asc" );

            while ( boi.hasNext() )
            {
                Project proj = boi.next();
                System.out.println( proj.getName() );
            }
        }
        catch ( Exception e )
        {
            // Best practices would involve catching specific exceptions.  To keep this
            // sample code short, we catch Exception
            e.printStackTrace();
        }
        finally
        {
            if ( session != null )
                session.logout();
        }
    }
}

Пример 2: Установить сеанс в удаленном режиме, используя стандартный сервисный режим, и загрузите список проектов:

import com.primavera.integration.client.Session;
import com.primavera.integration.client.EnterpriseLoadManager;
import com.primavera.integration.client.RMIURL;
import com.primavera.integration.common.DatabaseInstance;
import com.primavera.integration.client.bo.BOIterator;
import com.primavera.integration.client.bo.object.Project;

public class APITest
{
    public static void main( String[] args )
    {
        Session session = null;
        try
        {
            DatabaseInstance[] dbInstances = Session.getDatabaseInstances(
                RMIURL.getRmiUrl( RMIURL.STANDARD_RMI_SERVICE, "localhost", 9099 ) );

            // Assume only one database instance for now, and hardcode the username and
            // password for this sample code.  Assume the server is local for this sample code.
            session = Session.login( RMIURL.getRmiUrl( RMIURL.STANDARD_RMI_SERVICE, "localhost", 9099 ),
                dbInstances[0].getDatabaseId(), "admin", "admin" );

            EnterpriseLoadManager elm = session.getEnterpriseLoadManager();
            BOIterator<Project> boi = elm.loadProjects( new String[]{ "Name" }, null, "Name asc" );

            while ( boi.hasNext() )
            {
                Project proj = boi.next();
                System.out.println( proj.getName() );
            }
        }
        catch ( Exception e )
        {
            // Best practices would involve catching specific exceptions.  To keep this
            // sample code short, we catch Exception
            e.printStackTrace();
        }
        finally
        {
            if ( session != null )
                session.logout();
        }
    }
}

Наверх

Сессия

Сессия – это основной класс, используемый для связи с сервером. Чтобы установить действительный сеанс, используется метод статического входа в систему. Ссылка на сеанс может затем использоваться для доступа к другим основным объектам, таким как EnterpriseLoadManager.

Для входа в систему необходимо указать действующую базу данных, если в текущей конфигурации определено несколько экземпляров базы данных. С помощью инструмента администратора, можно увидеть настройки вашей конфигурации. Если в базе данных определено несколько конфигураций, проверьте атрибут «name» элемента Bootstrap \ Configurations \ BRE в файле BREBootStrap.xml, чтобы определить конфигурацию, используемую вашим сервером.

Перед входом в систему вы можете получить список доступных баз данных, вызвав Session.getDatabaseInstances ().

Примечание: Единственным отличием в коде клиента для локального режима и удаленного режима является вызов Session.getDatabaseInstances () и Session.login (). Для удаленного режима код должен указывать URL-адрес сервера RMI. Вы можете использовать com.primavera.integration.client.RMIURL для генерации URL RMI для различных удаленных режимов: Стандартный, Сжатие или SSL.

Сеанс не является единичным, что означает, что вы можете установить несколько одновременных сеансов связи с различными серверами и / или экземплярами базы данных. Это может быть полезно для интеграции с несколькими базами данных Primavera.

Наверх

GlobalObjectManager
Получить экземпляр GlobalObjectManager для определенного сеанса, можно вызвав Session.getGlobalObjectManager (). Этот объект используется для доступа ко всем глобальным бизнес-объектам: EPS, Projects, Resources, Roles и т.д. В общем, бизнес-объект является глобальным, если он не является дочерним для объекта другого типа.

Из GlobalObjectManager можно создавать, загружать, обновлять и удалять глобальные объекты. Каждый из этих методов получит доступ к базе данных. При работе в удаленном режиме каждый из этих методов приводит к удаленному вызову на сервере, который, в свою очередь, может обновить базу данных.

Наверх

EnterpriseLoadManager
Экземпляр EnterpriseLoadManager для конкретного сеанса, можно получить вызвав Session.getEnterpriseLoadManager (). Этот объект используется для прямого доступа ко всем бизнес-объектам без необходимости следовать модели навигации.

Наверх

Бизнес объект

Бизнес-объект – это инкапсуляция бизнес-данных и функций, которые обычно соответствуют записи в определенной таблице базы данных. Бизнес-объекты содержат поля, представленные в виде свойств. Методы Get () существуют для всех полей, а методы set () существуют только для полей, доступных для записи. Большинство бизнес-объектов содержат поле ObjectId, которое служит первичным ключом для этого объекта.

Примечание: Бизнес-объекты на стороне клиента являются временными и не должны использоваться повторно. Например, при создании нового экземпляра бизнес-объекта на стороне клиента после вызова метода create () для создания объекта в базе данных объект следует перезагрузить из базы данных, если вы собираетесь его использовать. Это позволяет проверить, что данные соответствуют серверной бизнес-логике. Это предупреждение также относится к обновлению бизнес-объектов; после вызова update () перезагрузите объект, если собираетесь использовать его дальше.

Методы загрузки, вызывающие загрузку нескольких бизнес-объектов, возвращают BOIterator (итератор бизнес-объекта), который можно использовать для итерации по возвращенным бизнес-объектам. Подобно Java-классу java.util.Iterator, он имеет методы hasNext () и next (). Не все бизнес-объекты извлекаются с сервера одновременно. При выполнении итерации по набору результатов все больше бизнес-объекты автоматически загружаются с сервера по мере необходимости.

При загрузке объекта можно указать поля для загрузки. Если этот параметр имеет значение null, будут загружены необходимые минимальные поля. Можно получить списки доступных полей, вызвав следующие методы:

getAllFields() – Возвращает массив всех полей для данного бизнес-объекта. Имена полей назначения кода и значения UDF не включены в этот массив. Для получения дополнительной информации см. Раздел «Специальная обработка кодов и пользовательских функций» ниже.

getRequiredCreateFields() – Возвращает массив полей, необходимых для создания этого бизнес-объекта. Некоторые бизнес-объекты имеют поля, перечисленные в этом массиве, которые имеют тип ИЛИ. Эти поля появятся в массиве, разделенном символом “|”. Например, обязательными полями создания для Activity являются «Id» и «ProjectObjectId | WBSObjectId», что означает, что поле Id должно быть всегда установлено, и должен быть установлен либо ProjectObjectId, либо WBSObjectId (установка только ProjectObjectId приведет к тому, что Activity будет быть созданным на уровне проекта).

getDefaultXMLExportFields() – Возвращает массив полей, которые экспортируются по умолчанию, если для параметра fields для иерархических методов XMLExporter указано значение NULL. Вы можете указать больше или меньше полей по желанию. Пользовательские поля и поля Сводка не включены в массивы полей экспорта XML по умолчанию.

getSpreadFields() – Возвращает массив полей спреда (единица и стоимость) для бизнес-объектов, которые поддерживают спреды: EPS, Project, WBS, Activity и ResourceAssignment.

getMainFields() – Возвращает все поля, поддерживаемые бизнес-объектом, кроме сводки, назначения кода и полей UDF (пользовательские).

Примечание: Для оптимальной работы API, указывайте только те поля, которые действительно необходимы.

Бизнес-объекты могут быть загружены напрямую с помощью статических методов load () самого класса, из родительского объекта, из GlobalObjectManager, если объект является глобальным, или из EnterpriseLoadManager. Объекты могут быть загружены путем указания массива ObjectIds или с помощью запросов «where» и/ или условия «order by». Запрос where используется для фильтрации бизнес-объектов при загрузке.

  • Where запросы, которые используют тип данных Дата должны использовать WhereClauseHelper для форматирования значений. Смотри Load Activities Example ниже.
  • Сложные запросы where могут быть созданы с использование логических AND и OR
  • Запросы на SQL-92 поддерживаются за некоторыми исключениями. Операторы объединения и операторы выбора не поддерживаются. Функция DATEADD SQL Server не поддерживается.

В следующих примерах кода показано, как указать запрос where при загрузке бизнес-объектов:

Пример : Загрузка всех проектов с идентификатором, который начинается с «SAP-Project», упорядочивание по идентификатору в порядке возрастания:

EnterpriseLoadManager elm = session.getEnterpriseLoadManager();
BOIterator<Project> boi = elm.loadProjects( new String[]{ "Id", "Status", "StartDate", "FinishDate" },
    "Id like 'SAP-Project%'", "Id asc" );

while ( boi.hasNext() )
{
    Project proj = boi.next();
    // Код для каждого проекта...
}

Пример 2: Загрузка задач из проекта, где фактическое начало находится в пределах определенного диапазона дат, упорядочивание по имени в порядке убывания:

SimpleDateFormat formatter = new SimpleDateFormat( "MM/dd/yyyy" );
Date date = formatter.parse( "03/03/2005" );
String dateBegin = WhereClauseHelper.formatDate( session, date );
date = formatter.parse( "03/09/2005" );
String dateEnd = WhereClauseHelper.formatDate( session, date );

String whereClause = "ActualStartDate between " + dateBegin + " and " + dateEnd;

BOIterator<Activity> boi = project.loadAllActivities( new String[]{ "Id", "Name" }, whereClause, "Name desc" );
while ( boi.hasNext() )
{
    Activity act = boi.next();
    // Код для каждой задачи...
}

Пример 3: Загрузка всех активных временных периодов:

BOIterator<Timesheet> boi = timesheetPeriod.loadTimesheets( new String[]{ "ResourceName", "ResourceId", "Status" },
    "Status='" + com.primavera.integration.client.bo.enm.TimesheetStatus.ACTIVE.getValue() + "'", "" );

while ( boi.hasNext() )
{
    Timesheet ts = boi.next();
    // Код для каждого периода...
}

Специальная обработка кодов и пользовательских полей (UDF)

Объекты Project, BaselineProject, Resource, and Activity могут иметь связанные коды (ProjectCodes, ResourceCodes, and ActivityCodes). Эта ассоциативная связь представлена объектами ProjectCodeAssignment (for Project and BaselineProject), ResourceCodeAssignment, и ActivityCodeAssignment.

Объекты Activity, ActivityExpense, ActivityStep, ActivityStepTemplateItem, BaselineProject, Document, EPS, Project, ProjectIssue, ProjectRisk, Resource, ResourceAssignment, и WBS могут иметь связанные пользовательские поля (UDF). Эти значения представлены объектом UDFValue.

В предыдущих версиях значения кода и UDF обрабатывались как специальные поля в связанных бизнес-объектах. Однако в 5.0 SP3 эти методы устарели и, скорее всего, будут удалены в выпуске версии 7.0.

Смотрите общие и демонстрационные приложения для примера, в которых показано, как использовать новый код и бизнес-объекты назначения UDF.

Наверх

Диспетчер задач

Диспетчер задач используется для вызова всех асинхронных задач: планирования, суммирования, применения фактических данных, сохранения производительности за период, запуска Project Architect и создания пакетных отчетов. Он вызывается для определенного сеанса путем вызова Session.getJobManager (). Вы можете проверить состояние конкретного задания, вызвав getJobStatus и передав идентификатор, возвращаемый при создании задания. Существуют и другие способы удаления работы и получения списка всех работ.

Примечание: За исключением заданий, созданных с помощью методов javaSchedule () и storePeriodPerformance (), задания обслуживаются службой заданий Primavera, которая работает как служба Windows.

Наверх

Пакетная обработка исключений

BatchException позволяет вам перехватывать и собирать все исключения бизнес-правил, не останавливая выполнение транзакции создания / обновления. После обработки всех транзакций создания / обновления данных все происходит откат, но BatchException предоставляет вам список исключений бизнес-правил, которые произошли во время процесса. Зацикливая список исключений, вы можете определить проблемные бизнес-объекты. Вы можете удалить их из списка транзакций и снова запустить пакетное обновление / создание.

Использование BatchExceptions
Пакетная обработка исключений может быть включена и выключена в сеансе. Если обработка исключений в пакетном режиме отключена (режим по умолчанию), процесс пакетного создания / обновления завершается неудачно, когда выдается первое исключение бизнес-правила. Если обработка пакетных исключений включена, процесс создания / обновления пакетов продолжается, даже если генерируются исключения бизнес-правил.

Для использование BatchExceptions три шага:

  1. Включить пакетную обработку данных
    Перед тем, как начать транзакцию пакетного создания / обновления, вы должны включить пакетную обработку исключений, используя setBatchFailOnFirstFlag (false) для объекта сессии. (для проверки, что обработка пакетных исключений включена испульзуется метод getBatchFailOnFirstFlag (), )
  2. Перехватить BatchExceptions
    Поскольку BatchException является ServerException, важно перехватывать BatchException перед ServerException
  3. Перебрать список исключений бизнес-правил
    После пакетного создания / обновления метод getExceptionList () предоставляет список исключений бизнес-правил, которые произошли во время транзакции. Просмотрите список исключений и используйте метод getSource () для определения исходного объекта.

    Метод getSource () возвращает тип объекта. Затем вы можете типизировать Object к Integer и определить порядковый номер строки: Integer src = (Integer) e.getSource (); int row = src.intValue (); поскольку один бизнес-объект может выдавать несколько исключений бизнес-правил, возможно, один и тот же индекс строки имеет несколько исключений в списке. Чтобы получить все исключения, принадлежащие определенному индексу, используйте метод getExceptionsByIndex (). Метод getExceptionsByIndex () возвращает отсортированную таблицу, где ключ – это индекс в пакете, а значение – список исключений для этого индекса (см. Пример 2 ниже). Для всех исключений бизнес-правил, которые не связаны с одной конкретной строкой, индекс имеет значение -1 (UNKNOWN_INDEX).

Примечание: Вы можете использовать метод getSource () для самого объекта BatchException. Он предоставляет вам удобный способ получения исходного объекта первого исключения в списке без написания цикла.

Примечание: Во время пакетного создания / обновления могут возникать общие, не связанные с бизнес-правилами исключения, но BatchException не содержит их. BatchException не поддерживает пакетное удаление.

Примеры использования BatchException

Пример 1: Перехват BatchExceptions и цикл по списку всех исключений

try
{
    // код вызова обновления или создания...
    ...
}
catch ( BatchException e )
{
    // Отобразить трассировку стека исключения пакета
    e.printStackTrace();
    System.out.println();

    // Показать индекс и сообщение об исключении всех исключений в пакетном исключении
    List exceptions = e.getExceptionList();
    for ( int i = 0; i < exceptions.size(); i++ )
    {
        ServerException se = (ServerException)exceptions.get(i);
        System.out.println( se.getSource() + " - " + se.getMessage() );
    }
} 

Пример 2: Разделение бизнес-объектов с исключениями бизнес-правил при пакетном обновлении с помощью метода getExceptionsByIndex ()

// Загрузка задач
BOIterator<Activity> boi = proj.loadAllActivities( new String[]{ "Id" }, null, null );
List<Activity> activities = new ArrayList<Activity>();
while ( boi.hasNext() )
{
    Activity act = boi.next();

    // Установить значения...
    ...

    activities.add( act );
}

try
{
    // Обновить все действия в списке
    Activity.update( session, activities.toArray( new Activity[activities.size()] );
}
catch ( BatchException e )
{
    // Получить исключения по индексу
    Map exceptions = e.getExceptionsByIndex();

    List<Activity> validData = new ArrayList<Activity>();
    List<Activity> invalidData = new ArrayList<Activity>();

    for ( int i = 0; i < activities.size(); i++ )
    {
        // Проверьте, есть ли какие-либо исключения бизнес-объекта в строке
        if ( exceptions.containsKey( new Integer( i ) ) )
        {
            // Возникли исключения; добавить в список invalidData
            invalidData.add( activities.get( i ) );
        }
        else
        {
            // Никаких исключений не произошло; добавить в список validData
            validData.add( activities.get( i ) );
        }
    }

    // Повторно отправьте действительные данные
    Activity.update( session, validData.toArray( new Activity[validData.size()] ) );

    // Обработка неверных данных здесь …
    ...

Наверх

Временные метки

Каждый бизнес-объект теперь предоставляет информацию о пользователе (getCreateUser ()) и дате (getCreateDate ()), когда бизнес-объект был создан. Аналогично, getLastUpdateUser () и getLastUpdateDate () возвращают пользователя, который обновил бизнес-объект, и дату его обновления соответственно. GetCreateUser () и getLastUpdateUser () возвращают только имя пользователя. Если нужен объект User, его нужно будет загрузить отдельно.

Пример: Загрузка всех пользователей, которые были обновлены после 30 июня 2005 г. в 6:00. Результаты упорядочены по дате обновления:

java.util.Calendar calendar = new java.util.GregorianCalendar();
calendar.set( 2005, 5, 30, 6, 0, 0); // 2005-6-30 06:00AM
java.util.Date testDate = new java.util.Date( calendar.getTimeInMillis() );
String wc = WhereClauseHelper.formatDate( session, testDate );
BOIterator<User> boi = elm.loadUsers( User.getAllFields(), "LastUpdateDate > " + wc, "LastUpdateDate asc" );
while ( boi.hasNext() )
{
    User user = boi.next();
    // код обработки пользователя
}

Наверх

Безопасность ресурсов

Безопасность ресурсов позволяет ограничить возможность доступа пользователей к ресурсам. Ограниченный доступ к ресурсам означает, что пользователь имеет доступ только к части иерархии ресурсов. Привилегии, которые управляют иерархией ресурсов (добавлять / редактировать / удалять ресурсы), по-прежнему применяются, но только к тем ресурсам, к которым у пользователя есть доступ.

Типы доступа к ресурсам

  • Доступ ко всем ресурсам
    Если User.AllResourceAccessFlag имеет значение True, пользователь имеет доступ ко всем ресурсам и защита ресурсов не применяется.
  • Ограниченный доступ к ресурсам
    Если User.AllResourceAccessFlag имеет значение False, пользователь имеет ограниченный доступ к ресурсам.

    Если пользователь назначен ресурсу в иерархии, он имеет доступ к назначенному ресурсу и всем его дочерним элементам. Вы можете назначить пользователю только один ресурс, несколько узлов доступа к ресурсам не поддерживаются.

    Если пользователь не назначен ни одному ресурсу в иерархии этот пользователь не имеет доступа ни к каким ресурсам

Примечание: Администраторы всегда имеют доступ ко всем ресурсам

Доступ к ресурсам, назначенным проекту

Если пользователь может получить доступ к проекту, он может видеть все ресурсы, назначенные этому проекту (задачи, риски, WBS), даже если они находятся за пределами узла доступа к ресурсам пользователя. Затем пользователь может переназначить эти ресурсы где угодно, но сможет редактировать только те, которые находятся под узлом доступа к ресурсам пользователя.

Реализация API безопасности ресурсов

Используйте бизнес-объект ResourceAccess для реализации и поддержки доступа к ресурсам в API.

Примечание: В диалоговом окне «Пользователи» модуля «Управление проектами» пользователи фильтруются на основе настроек доступа к ресурсам. В API загружаются все пользователи, но возможность изменять настройки доступа к ресурсам пользователя определяется вашими настройками доступа к ресурсам. Если пользователь связан с ресурсом, который находится за пределами вашего доступа к ресурсам, вы не можете изменить настройки доступа к ресурсам этого пользователя.

Наверх

XMLExporter

Иерархический экспортер XML извлекается для определенного сеанса с помощью вызова Session.getXMLExporter (). Начиная с выпуска 6.2, существует новый XML Exporter, расположенный в пакете com.primavera.integration.client.xml.xmlexporter. Новый экспортер проще использовать для интеграции, а также он работает лучше, чем иерархический XML Exporter.

Экспортеры XML используются для записи бизнес-объектов в XML. Каждый бизнес-объект может быть экспортирован либо путем указания массива ObjectIds, либо путем указания запроса where для загрузки объектов. Экспорт неглобальных объектов требует, чтобы родительский объект был указан для методов, которые имеют параметры where.

Другой метод XMLExporter, exportFullProject, экспортирует проект и все его дочерние объекты (такие как WBS, Activity, ResourceAssignments и т. Д.). Файлы XML, созданные с помощью exportFullProject, можно импортировать с помощью XMLImporter.

Когда объекты экспортируются, поля для экспорта могут быть указаны. Если параметр fields равен нулю, поля экспорта XML по умолчанию будут использоваться для каждого объекта. Вы можете получить этот список полей по умолчанию для иерархического экспортера, вызвав getDefaultXMLExportFields () для каждого класса бизнес-объектов. Для экспортера поля по умолчанию представляют собой комбинацию полей загрузки по умолчанию и полей, необходимых для создания, за некоторыми исключениями.

Чтобы указать конкретные типы бизнес-объектов или поля, которые будут включены в экспорт, используйте XMLExporterListener.

Примечание: Все бизнес-объекты могут быть записаны отдельно в XML, даже без использования XMLExporter. Просто вызовите toString () для экземпляра бизнес-объекта, и все поля, загруженные в данный момент в этом бизнес-объекте, будут выводиться в XML с использованием той же схемы (p6apibo.xsd), что и XMLExporter.

Наверх

XMLImporter

Иерархический импортер XML извлекается для определенного сеанса с помощью вызова Session.getXMLImporter (). Начиная с версии 6.2, существует новый импортер XML, расположенный в пакете com.primavera.integration.client.xml.xmlimporter. Этот импортер проще в использовании для интеграции, а также работает лучше, чем иерархический импортер XML.

Текущая версия XML Importer поддерживает только импорт проектов и связанных с ними данных, сгенерированных с использованием XMLExporter.exportFullProject ().

Текущая версия XML Importer поддерживает только импорт проектов и связанных с ними данных, сгенерированных с использованием XMLExporter.exportFullProject (). Список бизнес-объектов и связанных данных, экспортируемых XMLExporter.exportFullProject ().

Пример использования плоского XMLImporter предоставлен демонстрационным приложением importer (ImportDemoApp.java).

Примечание: Импортер XML не позволит импортировать неверные данные. Вы несете ответственность за обеспечение действительность данных перед началом процесса импорта. Например, операции и назначения ресурсов не будут импортированы, если фактическая дата окончания предшествует фактической дате начала в файле XML.

Если данные, которые вы хотите импортировать, являются неполными или не соответствуют полной схеме экспорта проекта, вы все равно можете использовать API для создания интеграционного решения. Одна из возможностей – использовать DOM, SAX или StAX для самостоятельного анализа XML, а затем напрямую вызывать соответствующие методы API. Для файлов XML, для которых у вас есть доступная схема XML (XSD), еще лучшей альтернативой может быть использование технологии привязки XML, такой как JAXB.

Примечание: Настоятельно рекомендуется использовать XMLImporter всегда, когда это возможно, из-за множества сложностей, которые могут быть вовлечены в процесс импорта при зависимости и сопоставлении данных.

Наверх

XML Schema

Схема XML, используемая иерархическими XMLExporter и XMLImporter, определена в файле prmbo.xsd и может быть найдена в каталоге схемы, расположенном в каталоге установки. Новые XMLExporter и XMLImporter используют схему p6apibo.xsd, находящуюся в одном каталоге. Если API установлен на веб-сервере / сервере приложений для поддержки удаленного режима, файл иерархической схемы можно загрузить с веб-сервера по URL-адресу http: // <хост>: <порт> /PrimaveraAPI/schema/prmbo.xsd, а схему можно загрузить с URL-адреса http: // <хост>: <порт> /PrimaveraAPI/schema/p6apibo.xsd.

Наверх

Советы по производительности

Многие факторы могут влиять на производительность приложения, использующего API. Следующие советы помогут программисту избежать некоторых наиболее распространенных проблем с производительностью:

  • Войдите в API как пользователь с глобальным профилем безопасности Admin.
  • При создании или обновлении бизнес-объектов используйте методы, позволяющие обрабатывать несколько объектов одновременно.
  • При загрузке бизнес-объектов загружайте только те поля, которые действительно необходимы.
  • Используйте запросы where для интеллектуальной загрузки бизнес-объектов.
  • При выборе методов, используемых для доступа к бизнес-объектам, обязательно используйте методы, которые наиболее эффективно минимизируют трафик сервера и базы данных. Например, проект является родителем его иерархии WBS, а отдельные объекты WBS могут быть родителями других бизнес-объектов, таких как действия. Для быстрого доступа к действиям используйте метод проекта loadAllActivities (), чтобы обойти дочерние объекты WBS.
  • Используйте только локальный режим с экспортером и импортером XML.

Наверх

Демо приложения

Демонстрационные приложения устанавливаются в демонстрационный каталог в каталоге установки API. Демонстрационные приложения содержат исходный код, поэтому они предоставляют рабочий пример использования API.

Следующие демонстрационные приложения включены в релиз:

  • demo.general.GeneralDemoApp   предоставляет пример кода для создания, загрузки, обновления и удаления бизнес-объектов. Помимо прочего, он добавит новый проект, добавит в этот проект действия, добавит к ним расходы, добавит глобальные и специфичные для проекта типы кодов действий, добавит новые коды действий для этих типов и назначит некоторые коды действий для действий. Затем он загрузит действия с сервера и выведет их в XML.
     
  • demo.assignments.AssignmentsDemoApp   загружает все назначения ресурсов между проектами для первых 50 ресурсов и генерирует выходной файл HTML. Это приложение демонстрирует скорость, с которой данные могут быть доступны для разных проектов.
     
  • demo.xmlexport.ExportDemoApp  выполняет экспорт в XML первых десяти проектов в базе данных и, используя интерфейс XMLExportListener, определяет включение всех полей при экспорте операций, а также пропускает заметки задач и WBS с вехами.
     
  • demo.xmlimport.ImportDemoApp   выполняет импорт файла XML, созданного с помощью XMLExporter.exportFullProject ().

One thought to “Справочник программиста Primavera Integration API”

Добавить комментарий

Ваш e-mail не будет опубликован.