Search in sources :

Example 11 with IPortletPreference

use of org.apereo.portal.portlet.om.IPortletPreference in project uPortal by Jasig.

the class PortletDefinitionImporterExporter method convert.

protected ExternalPortletDefinition convert(IPortletDefinition def) {
    ExternalPortletDefinition rep = new ExternalPortletDefinition();
    rep.setFname(def.getFName());
    rep.setDesc(def.getDescription());
    rep.setName(def.getName());
    rep.setTimeout(BigInteger.valueOf(def.getTimeout()));
    rep.setActionTimeout(convertToBigInteger(def.getActionTimeout()));
    rep.setEventTimeout(convertToBigInteger(def.getEventTimeout()));
    rep.setRenderTimeout(convertToBigInteger(def.getRenderTimeout()));
    rep.setResourceTimeout(convertToBigInteger(def.getResourceTimeout()));
    rep.setTitle(def.getTitle());
    rep.setType(def.getType().getName());
    final Lifecycle lifecycle = new Lifecycle();
    for (IPortletLifecycleEntry ple : def.getLifecycle()) {
        final LifecycleEntry entry = new LifecycleEntry();
        entry.setName(ple.getLifecycleState().toString());
        entry.setUser(getUsernameForUserId(ple.getUserId()));
        entry.setValue(getCalendar(ple.getDate()));
        lifecycle.getEntries().add(entry);
    }
    rep.setLifecycle(lifecycle);
    final org.apereo.portal.xml.PortletDescriptor portletDescriptor = new org.apereo.portal.xml.PortletDescriptor();
    final IPortletDescriptorKey portletDescriptorKey = def.getPortletDescriptorKey();
    if (portletDescriptorKey.isFrameworkPortlet()) {
        portletDescriptor.setIsFramework(true);
    } else {
        portletDescriptor.setWebAppName(portletDescriptorKey.getWebAppName());
    }
    portletDescriptor.setPortletName(portletDescriptorKey.getPortletName());
    rep.setPortletDescriptor(portletDescriptor);
    final List<ExternalPortletParameter> parameterList = rep.getParameters();
    for (IPortletDefinitionParameter param : def.getParameters()) {
        final ExternalPortletParameter externalPortletParameter = new ExternalPortletParameter();
        externalPortletParameter.setName(param.getName());
        externalPortletParameter.setDescription(param.getDescription());
        externalPortletParameter.setValue(param.getValue());
        parameterList.add(externalPortletParameter);
    }
    parameterList.sort(ExternalPortletParameterNameComparator.INSTANCE);
    final List<ExternalPortletPreference> portletPreferenceList = rep.getPortletPreferences();
    for (IPortletPreference pref : def.getPortletPreferences()) {
        final ExternalPortletPreference externalPortletPreference = new ExternalPortletPreference();
        externalPortletPreference.setName(pref.getName());
        externalPortletPreference.setReadOnly(pref.isReadOnly());
        final List<String> value = externalPortletPreference.getValues();
        value.addAll(Arrays.asList(pref.getValues()));
        // no sorting of preference values, order is specified by the portlet
        portletPreferenceList.add(externalPortletPreference);
    }
    portletPreferenceList.sort(ExternalPortletPreferenceNameComparator.INSTANCE);
    final List<String> categoryList = rep.getCategories();
    final IGroupMember gm = GroupService.getGroupMember(def.getPortletDefinitionId().getStringId(), IPortletDefinition.class);
    @SuppressWarnings("unchecked") final Iterator<IEntityGroup> categories = GroupService.getCompositeGroupService().findParentGroups(gm);
    while (categories.hasNext()) {
        IEntityGroup category = categories.next();
        categoryList.add(category.getName());
    }
    Collections.sort(categoryList);
    // handle the SUBSCRIBER_ACTIVITY perm separately...
    final List<String> groupList = rep.getGroups();
    final List<String> userList = rep.getUsers();
    exportPermission(def, ExternalPermissionDefinition.SUBSCRIBE, groupList, userList);
    // handle other supported perms (currently just BROWSE)
    ExternalPermissions externalPermissions = new ExternalPermissions();
    for (ExternalPermissionDefinition perm : ExternalPermissionDefinition.values()) {
        if (!perm.getExportForPortletDef()) {
            continue;
        }
        ExternalPermissionMemberList members = new ExternalPermissionMemberList();
        members.setSystem(perm.getSystem());
        members.setActivity(perm.getActivity());
        List<String> groups = members.getGroups();
        boolean found = exportPermission(def, perm, groups, null);
        if (found) {
            externalPermissions.getPermissions().add(members);
        }
    }
    if (!externalPermissions.getPermissions().isEmpty()) {
        rep.setPermissions(externalPermissions);
    }
    return rep;
}
Also used : IPortletPreference(org.apereo.portal.portlet.om.IPortletPreference) IPortletDescriptorKey(org.apereo.portal.portlet.om.IPortletDescriptorKey) IPortletDefinitionParameter(org.apereo.portal.portlet.om.IPortletDefinitionParameter) ExternalPermissionDefinition(org.apereo.portal.io.xml.portlettype.ExternalPermissionDefinition) IPortletLifecycleEntry(org.apereo.portal.portlet.om.IPortletLifecycleEntry) IPortletLifecycleEntry(org.apereo.portal.portlet.om.IPortletLifecycleEntry) IEntityGroup(org.apereo.portal.groups.IEntityGroup) IGroupMember(org.apereo.portal.groups.IGroupMember)

Example 12 with IPortletPreference

use of org.apereo.portal.portlet.om.IPortletPreference in project uPortal by Jasig.

the class RDBMDistributedLayoutStore method importLayout.

@Override
@SuppressWarnings("unchecked")
@Transactional
public void importLayout(org.dom4j.Element layout) {
    if (layout.getNamespaceForPrefix("dlm") == null) {
        layout.add(new Namespace("dlm", Constants.NS_URI));
    }
    // Remove comments from the DOM they break import
    final List<org.dom4j.Node> comments = layout.selectNodes("//comment()");
    for (final org.dom4j.Node comment : comments) {
        comment.detach();
    }
    // Get a ref to the prefs element and then remove it from the layout
    final org.dom4j.Node preferencesElement = layout.selectSingleNode("preferences");
    if (preferencesElement != null) {
        preferencesElement.getParent().remove(preferencesElement);
    }
    final String ownerUsername = layout.valueOf("@username");
    // Get a ref to the profile element and then remove it from the layout
    final org.dom4j.Node profileElement = layout.selectSingleNode("profile");
    if (profileElement != null) {
        profileElement.getParent().remove(profileElement);
        final org.dom4j.Document profileDocument = new org.dom4j.DocumentFactory().createDocument();
        profileDocument.setRootElement((org.dom4j.Element) profileElement);
        profileDocument.setName(ownerUsername + ".profile");
        final DocumentSource profileSource = new DocumentSource(profileElement);
        this.portalDataHandlerService.importData(profileSource);
    }
    final IPerson person = new PersonImpl();
    person.setUserName(ownerUsername);
    int ownerId;
    try {
        // Can't just pass true for create here, if the user actually exists the create flag
        // also updates the user data
        ownerId = this.userIdentityStore.getPortalUID(person);
    } catch (final AuthorizationException t) {
        if (this.errorOnMissingUser) {
            throw new RuntimeException("Unrecognized user " + person.getUserName() + "; you must import users before their layouts or set org.apereo.portal.io.layout.errorOnMissingUser to false.", t);
        }
        // Create the missing user
        ownerId = this.userIdentityStore.getPortalUID(person, true);
    }
    if (ownerId == -1) {
        throw new RuntimeException("Unrecognized user " + person.getUserName() + "; you must import users before their layouts or set org.apereo.portal.io.layout.errorOnMissingUser to false.");
    }
    person.setID(ownerId);
    IUserProfile profile = null;
    try {
        person.setSecurityContext(new BrokenSecurityContext());
        profile = this.getUserProfileByFname(person, "default");
    } catch (final Throwable t) {
        throw new RuntimeException("Failed to load profile for " + person.getUserName() + "; This user must have a profile for import to continue.", t);
    }
    // (6) Add database Ids & (5) Add dlm:plfID ...
    int nextId = 1;
    for (final Iterator<org.dom4j.Element> it = (Iterator<org.dom4j.Element>) layout.selectNodes("folder | dlm:* | channel").iterator(); it.hasNext(); ) {
        nextId = this.addIdAttributesIfNecessary(it.next(), nextId);
    }
    // Now update UP_USER...
    this.jdbcOperations.update("UPDATE up_user SET next_struct_id = ? WHERE user_id = ?", nextId, person.getID());
    // (4) Convert external DLM pathrefs to internal form (noderefs)...
    for (final Iterator<org.dom4j.Attribute> itr = (Iterator<org.dom4j.Attribute>) layout.selectNodes("//@dlm:origin").iterator(); itr.hasNext(); ) {
        final org.dom4j.Attribute a = itr.next();
        final Noderef dlmNoderef = nodeReferenceFactory.getNoderefFromPathref(ownerUsername, a.getValue(), null, true, layout);
        if (dlmNoderef != null) {
            // Change the value only if we have a valid pathref...
            a.setValue(dlmNoderef.toString());
            // For dlm:origin only, also use the noderef as the ID attribute...
            a.getParent().addAttribute("ID", dlmNoderef.toString());
        } else {
            // At least insure the value is between 1 and 35 characters
            a.setValue(BAD_PATHREF_MESSAGE);
        }
    }
    for (final Iterator<org.dom4j.Attribute> itr = (Iterator<org.dom4j.Attribute>) layout.selectNodes("//@dlm:target").iterator(); itr.hasNext(); ) {
        final org.dom4j.Attribute a = itr.next();
        final Noderef dlmNoderef = nodeReferenceFactory.getNoderefFromPathref(ownerUsername, a.getValue(), null, true, layout);
        // Put in the correct value, or at least insure the value is between 1 and 35 characters
        a.setValue(dlmNoderef != null ? dlmNoderef.toString() : BAD_PATHREF_MESSAGE);
    }
    for (final Iterator<org.dom4j.Attribute> names = (Iterator<org.dom4j.Attribute>) layout.selectNodes("//dlm:*/@name").iterator(); names.hasNext(); ) {
        final org.dom4j.Attribute a = names.next();
        final String value = a.getValue().trim();
        if (!VALID_PATHREF_PATTERN.matcher(value).matches()) {
            /* Don't send it to getDlmNoderef if we know in advance it's not
                 * going to work;  saves annoying/misleading log messages and
                 * possibly some processing.  NOTE this is _only_ a problem with
                 * the name attribute of some dlm:* elements, which seems to go
                 * unused intentionally in some circumstances
                 */
            continue;
        }
        final org.dom4j.Attribute fname = a.getParent().attribute("fname");
        Noderef dlmNoderef = null;
        if (fname != null) {
            dlmNoderef = nodeReferenceFactory.getNoderefFromPathref(ownerUsername, value, fname.getValue(), false, layout);
            // Remove the fname attribute now that we're done w/ it...
            fname.getParent().remove(fname);
        } else {
            dlmNoderef = nodeReferenceFactory.getNoderefFromPathref(ownerUsername, value, null, true, layout);
        }
        // Put in the correct value, or at least insure the value is between 1 and 35 characters
        a.setValue(dlmNoderef != null ? dlmNoderef.toString() : BAD_PATHREF_MESSAGE);
    }
    // (3) Restore chanID attributes on <channel> elements...
    for (final Iterator<org.dom4j.Element> it = (Iterator<org.dom4j.Element>) layout.selectNodes("//channel").iterator(); it.hasNext(); ) {
        final org.dom4j.Element c = it.next();
        final String fname = c.valueOf("@fname");
        final IPortletDefinition cd = this.portletDefinitionRegistry.getPortletDefinitionByFname(fname);
        if (cd == null) {
            final String msg = "No portlet with fname=" + fname + " exists referenced by node " + c.valueOf("@ID") + " from layout for " + ownerUsername;
            if (errorOnMissingPortlet) {
                throw new IllegalArgumentException(msg);
            } else {
                logger.warn(msg);
                // Remove the bad channel node
                c.getParent().remove(c);
            }
        } else {
            c.addAttribute("chanID", String.valueOf(cd.getPortletDefinitionId().getStringId()));
        }
    }
    // (2) Restore locale info...
    // (This step doesn't appear to be needed for imports)
    // (1) Process structure & theme attributes...
    Document layoutDom = null;
    try {
        final int structureStylesheetId = profile.getStructureStylesheetId();
        this.loadStylesheetUserPreferencesAttributes(person, profile, layout, structureStylesheetId, "structure");
        final int themeStylesheetId = profile.getThemeStylesheetId();
        this.loadStylesheetUserPreferencesAttributes(person, profile, layout, themeStylesheetId, "theme");
        // From this point forward we need the user's PLF set as DLM expects it...
        for (final Iterator<org.dom4j.Text> it = (Iterator<org.dom4j.Text>) layout.selectNodes("descendant::text()").iterator(); it.hasNext(); ) {
            // How many years have we used Java & XML, and this still isn't easy?
            final org.dom4j.Text txt = it.next();
            if (txt.getText().trim().length() == 0) {
                txt.getParent().remove(txt);
            }
        }
        final org.dom4j.Element copy = layout.createCopy();
        final org.dom4j.Document doc = this.fac.createDocument(copy);
        doc.normalize();
        layoutDom = this.writer.get().write(doc);
        person.setAttribute(Constants.PLF, layoutDom);
    } catch (final Throwable t) {
        throw new RuntimeException("Unable to set UserPreferences for user:  " + person.getUserName(), t);
    }
    // Finally store the layout...
    try {
        this.setUserLayout(person, profile, layoutDom, true, true);
    } catch (final Throwable t) {
        final String msg = "Unable to persist layout for user:  " + ownerUsername;
        throw new RuntimeException(msg, t);
    }
    if (preferencesElement != null) {
        final int ownerUserId = this.userIdentityStore.getPortalUserId(ownerUsername);
        // TODO this assumes a single layout, when multi-layout support exists portlet entities
        // will need to be re-worked to allow for a layout id to be associated with the entity
        // track which entities from the user's pre-existing set are touched (all non-touched
        // entities will be removed)
        final Set<IPortletEntity> oldPortletEntities = new LinkedHashSet<>(this.portletEntityDao.getPortletEntitiesForUser(ownerUserId));
        final List<org.dom4j.Element> entries = preferencesElement.selectNodes("entry");
        for (final org.dom4j.Element entry : entries) {
            final String dlmPathRef = entry.attributeValue("entity");
            final String fname = entry.attributeValue("channel");
            final String prefName = entry.attributeValue("name");
            final Noderef dlmNoderef = nodeReferenceFactory.getNoderefFromPathref(person.getUserName(), dlmPathRef, fname, false, layout);
            if (dlmNoderef != null && fname != null) {
                final IPortletEntity portletEntity = this.getPortletEntity(fname, dlmNoderef.toString(), ownerUserId);
                oldPortletEntities.remove(portletEntity);
                final List<IPortletPreference> portletPreferences = portletEntity.getPortletPreferences();
                final List<org.dom4j.Element> valueElements = entry.selectNodes("value");
                final List<String> values = new ArrayList<>(valueElements.size());
                for (final org.dom4j.Element valueElement : valueElements) {
                    values.add(valueElement.getText());
                }
                portletPreferences.add(new PortletPreferenceImpl(prefName, false, values.toArray(new String[values.size()])));
                this.portletEntityDao.updatePortletEntity(portletEntity);
            }
        }
        // Delete all portlet preferences for entities that were not imported
        for (final IPortletEntity portletEntity : oldPortletEntities) {
            portletEntity.setPortletPreferences(null);
            if (portletEntityRegistry.shouldBePersisted(portletEntity)) {
                this.portletEntityDao.updatePortletEntity(portletEntity);
            } else {
                this.portletEntityDao.deletePortletEntity(portletEntity);
            }
        }
    }
}
Also used : LinkedHashSet(java.util.LinkedHashSet) IPortletPreference(org.apereo.portal.portlet.om.IPortletPreference) AuthorizationException(org.apereo.portal.AuthorizationException) Node(org.w3c.dom.Node) Element(org.w3c.dom.Element) ArrayList(java.util.ArrayList) Document(org.w3c.dom.Document) IPerson(org.apereo.portal.security.IPerson) IPortletEntity(org.apereo.portal.portlet.om.IPortletEntity) Iterator(java.util.Iterator) PortletPreferenceImpl(org.apereo.portal.portlet.dao.jpa.PortletPreferenceImpl) IPortletDefinition(org.apereo.portal.portlet.om.IPortletDefinition) Namespace(org.dom4j.Namespace) PersonImpl(org.apereo.portal.security.provider.PersonImpl) DocumentSource(org.dom4j.io.DocumentSource) IUserProfile(org.apereo.portal.IUserProfile) BrokenSecurityContext(org.apereo.portal.security.provider.BrokenSecurityContext) Transactional(org.springframework.transaction.annotation.Transactional)

Example 13 with IPortletPreference

use of org.apereo.portal.portlet.om.IPortletPreference in project uPortal by Jasig.

the class RDBMDistributedLayoutStore method exportLayout.

@Override
public org.dom4j.Element exportLayout(IPerson person, IUserProfile profile) {
    org.dom4j.Element layout = getExportLayoutDom(person, profile);
    final int userId = person.getID();
    final String userName = person.getUserName();
    final Set<IPortletEntity> portletEntities = this.portletEntityDao.getPortletEntitiesForUser(userId);
    org.dom4j.Element preferencesElement = null;
    for (final Iterator<IPortletEntity> entityItr = portletEntities.iterator(); entityItr.hasNext(); ) {
        final IPortletEntity portletEntity = entityItr.next();
        final List<IPortletPreference> preferencesList = portletEntity.getPortletPreferences();
        // Only bother with entities that have preferences
        if (!preferencesList.isEmpty()) {
            final String layoutNodeId = portletEntity.getLayoutNodeId();
            final Pathref dlmPathref = nodeReferenceFactory.getPathrefFromNoderef(userName, layoutNodeId, layout);
            if (dlmPathref == null) {
                logger.warn("{} in user {}'s layout has no corresponding layout or portlet information and will be ignored", portletEntity, userName);
                continue;
            }
            for (final IPortletPreference portletPreference : preferencesList) {
                if (preferencesElement == null) {
                    if (layout == null) {
                        final org.dom4j.Document layoutDoc = new org.dom4j.DocumentFactory().createDocument();
                        layout = layoutDoc.addElement("layout");
                        layout.addNamespace("dlm", Constants.NS_URI);
                    }
                    preferencesElement = layout.addElement("preferences");
                }
                final org.dom4j.Element preferenceEntry = preferencesElement.addElement("entry");
                preferenceEntry.addAttribute("entity", dlmPathref.toString());
                preferenceEntry.addAttribute("channel", dlmPathref.getPortletFname());
                preferenceEntry.addAttribute("name", portletPreference.getName());
                for (final String value : portletPreference.getValues()) {
                    final org.dom4j.Element valueElement = preferenceEntry.addElement("value");
                    if (value != null) {
                        valueElement.setText(value);
                    }
                }
            }
        }
    }
    if (layout != null) {
        layout.addAttribute("script", "classpath://org/jasig/portal/io/import-layout_v3-2.crn");
        layout.addAttribute("username", userName);
    }
    return layout;
}
Also used : IPortletPreference(org.apereo.portal.portlet.om.IPortletPreference) IPortletEntity(org.apereo.portal.portlet.om.IPortletEntity)

Example 14 with IPortletPreference

use of org.apereo.portal.portlet.om.IPortletPreference in project uPortal by Jasig.

the class GuestPortletEntityPreferencesImpl method loadTargetPortletPreferences.

@Override
protected void loadTargetPortletPreferences(IPortletEntity portletEntity, Map<String, IPortletPreference> targetPortletPreferences) {
    final HttpServletRequest containerRequest = this.portletRequestContext.getContainerRequest();
    final Map<String, IPortletPreference> sessionPreferences = this.getSessionPreferences(portletEntityId, containerRequest);
    if (sessionPreferences != null) {
        targetPortletPreferences.putAll(sessionPreferences);
    }
}
Also used : HttpServletRequest(javax.servlet.http.HttpServletRequest) IPortletPreference(org.apereo.portal.portlet.om.IPortletPreference)

Example 15 with IPortletPreference

use of org.apereo.portal.portlet.om.IPortletPreference in project uPortal by Jasig.

the class GuestPortletEntityPreferencesImpl method loadBasePortletPreferences.

@Override
protected void loadBasePortletPreferences(IPortletEntity portletEntity, Map<String, IPortletPreference> basePortletPreferences) {
    final IPortletDefinition portletDefinition = portletEntity.getPortletDefinition();
    // Add descriptor prefs to base Map
    final IPortletDefinitionId portletDefinitionId = portletDefinition.getPortletDefinitionId();
    final PortletDefinition portletDescriptor = this.portletDefinitionRegistry.getParentPortletDescriptor(portletDefinitionId);
    final Preferences descriptorPreferences = portletDescriptor.getPortletPreferences();
    for (final Preference preference : descriptorPreferences.getPortletPreferences()) {
        final IPortletPreference preferenceWrapper = new PortletPreferenceImpl(preference);
        basePortletPreferences.put(preferenceWrapper.getName(), preferenceWrapper);
    }
    // Add definition prefs to base Map
    final List<IPortletPreference> definitionPreferences = portletDefinition.getPortletPreferences();
    for (final IPortletPreference preference : definitionPreferences) {
        basePortletPreferences.put(preference.getName(), preference);
    }
    // Add entity prefs to base Map
    final List<IPortletPreference> entityPreferences = portletEntity.getPortletPreferences();
    for (final IPortletPreference preference : entityPreferences) {
        basePortletPreferences.put(preference.getName(), preference);
    }
}
Also used : IPortletDefinitionId(org.apereo.portal.portlet.om.IPortletDefinitionId) IPortletPreference(org.apereo.portal.portlet.om.IPortletPreference) Preference(org.apache.pluto.container.om.portlet.Preference) IPortletPreference(org.apereo.portal.portlet.om.IPortletPreference) Preferences(org.apache.pluto.container.om.portlet.Preferences) PortletPreferenceImpl(org.apereo.portal.portlet.dao.jpa.PortletPreferenceImpl) IPortletDefinition(org.apereo.portal.portlet.om.IPortletDefinition) IPortletDefinition(org.apereo.portal.portlet.om.IPortletDefinition) PortletDefinition(org.apache.pluto.container.om.portlet.PortletDefinition)

Aggregations

IPortletPreference (org.apereo.portal.portlet.om.IPortletPreference)37 Test (org.junit.Test)18 PortletPreferenceImpl (org.apereo.portal.portlet.dao.jpa.PortletPreferenceImpl)15 IPortletDefinitionId (org.apereo.portal.portlet.om.IPortletDefinitionId)12 IPortletDefinition (org.apereo.portal.portlet.om.IPortletDefinition)11 IPortletEntity (org.apereo.portal.portlet.om.IPortletEntity)10 List (java.util.List)8 BasePortalJpaDaoTest (org.apereo.portal.test.BasePortalJpaDaoTest)8 IPortletEntityId (org.apereo.portal.portlet.om.IPortletEntityId)7 MockHttpServletRequest (org.springframework.mock.web.MockHttpServletRequest)7 ArrayList (java.util.ArrayList)6 Callable (java.util.concurrent.Callable)4 IPortletDescriptorKey (org.apereo.portal.portlet.om.IPortletDescriptorKey)4 PortletDefinition (org.apache.pluto.container.om.portlet.PortletDefinition)3 Preference (org.apache.pluto.container.om.portlet.Preference)3 Preferences (org.apache.pluto.container.om.portlet.Preferences)3 IPortletDefinitionParameter (org.apereo.portal.portlet.om.IPortletDefinitionParameter)3 IPortletType (org.apereo.portal.portlet.om.IPortletType)3 LinkedHashSet (java.util.LinkedHashSet)2 ReadOnlyException (javax.portlet.ReadOnlyException)2